C#의 WORD 및 문자 OCR 데이터 (좌표, 신뢰도, 바운딩 박스)

This article was translated from English: Does it need improvement?
Translated
View the article in English

문서에 OCR을 실행한 후, 추출된 텍스트만으로는 종종 충분하지 않습니다. 페이지에서 특정 값을 찾거나, 품질이 낮은 탐지 결과를 제외하거나, 다중 열 레이아웃에서 자연스러운 읽기 순서를 재구성하려면 WORD별 좌표, 페이지 번호, 영역 인덱스 및 신뢰도 점수가 필요합니다.

WordsCharacters 컬렉션은 AdvancedOcrResultBase에서 이 데이터를 제공합니다. 레이아웃을 인식하는 문서를 위한 ReadDocumentAdvanced()와 카메라 입력을 위한 ReadPhoto() 모두 표준 OcrResult.Words 컬렉션을 통해 제공되는 것과 동일한 세분성을 반환합니다.

이 가이드에서는 WORD 데이터 반복 처리, 읽기 순서 재구성, 신뢰도 기반 필터링, 문자 단위 작업, 바운딩 박스를 이용한 원본 이미지 자르기 등 다섯 가지 일반적인 패턴을 단계별로 설명합니다.

30일 무료 체험을 시작하여 파이프라인에서 이 컬렉션들을 테스트해 보세요.

NuGet NuGet을 사용하여 설치하세요

PM >  Install-Package IronOcr

빠른 설치를 원하시면 NuGet 에서 https://www.nuget.org/packages/IronOcr를 검색해 보세요. 1천만 건 이상의 다운로드를 기록하며 C#을 이용한 PDF 개발 방식을 혁신하고 있습니다. DLL 파일 이나 윈도우 설치 프로그램을 다운로드할 수도 있습니다.

빠른 시작: OCR 결과에서 WORD 및 문자 데이터 읽기

ReadDocumentAdvanced(또는 ReadPhoto)를 호출하고 result.Words을 반복하여 몇 줄의 코드만으로 인식된 모든 WORD의 좌표, 페이지 번호 및 신뢰도 점수를 얻을 수 있습니다.

  1. NuGet 패키지 관리자를 사용하여 https://www.nuget.org/packages/IronOcr 설치하기

    PM > Install-Package IronOcr
  2. 다음 코드 조각을 복사하여 실행하세요.

    var result = new IronTesseract().ReadDocumentAdvanced(new OcrInput("scan.png"));
    foreach (var word in result.Words)
        Console.WriteLine($"{word.Text} @ ({word.X},{word.Y}) conf:{word.RegionConfidence:P0}");
  3. 실제 운영 환경에서 테스트할 수 있도록 배포하세요.

    무료 체험판으로 오늘 프로젝트에서 IronOCR 사용 시작하기

    arrow pointer


좌표와 신뢰도를 사용하여 WORD를 반복하는 방법은 무엇입니까?

Words 컬렉션은 모든 페이지에서 감지된 모든 WORD를 반환합니다. 각 항목(AdvancedWord 또는 AdvancedCharacter, 둘 다 AdvancedOcrElement에서 상속됨)은 텍스트, 픽셀 좌표, 크기, 해당 항목이 속한 페이지, 이를 포함하는 감지된 텍스트 블록을 식별하는 영역 인덱스, 그리고 해당 영역에 대한 신뢰도 점수를 노출합니다.

:path=/static-assets/ocr/content-code-examples/how-to/read-document-advanced-iterate-words.cs
using IronOcr;

var ocr = new IronTesseract();
using var input = new OcrInput();
input.LoadImage("receipt.png");

var result = ocr.ReadDocumentAdvanced(input);

foreach (var word in result.Words)
{
    Console.WriteLine(
        $"Page {word.PageNumber} | " +
        $"Region {word.RegionIndex} | " +
        $"'{word.Text}' | " +
        $"Position: ({word.X}, {word.Y}) | " +
        $"Size: {word.Width}x{word.Height} | " +
        $"Confidence: {word.RegionConfidence:P1}"
    );
}

// ToString() override for diagnostic logging
Console.WriteLine(result.Words.First().ToString());
Imports IronOcr

Dim ocr As New IronTesseract()
Using input As New OcrInput()
    input.LoadImage("receipt.png")

    Dim result = ocr.ReadDocumentAdvanced(input)

    For Each word In result.Words
        Console.WriteLine(
            $"Page {word.PageNumber} | " &
            $"Region {word.RegionIndex} | " &
            $"'{word.Text}' | " &
            $"Position: ({word.X}, {word.Y}) | " &
            $"Size: {word.Width}x{word.Height} | " &
            $"Confidence: {word.RegionConfidence:P1}"
        )
    Next
End Using

' ToString() override for diagnostic logging
Console.WriteLine(result.Words.First().ToString())
$vbLabelText   $csharpLabel

PageNumber는 1부터 시작합니다: 첫 번째 페이지는 1이며, 0가 아닙니다. 이는 0을 기준으로 인덱싱하는 대부분의 .NET 컬렉션과는 다릅니다. RegionIndex는 표준 0 기반 표기법을 따릅니다.

도형 그리기 또는 자르기 API에 좌표를 전달하려면 BoundingBox 속성을 사용하십시오. 이 라이브러리는 위치와 크기를 하나의 IronSoftware.Drawing.Rectangle로 묶습니다.

읽기 순서는 어떻게 재구성하나요?

다중 열 레이아웃에서 Words 컬렉션의 반복 순서가 페이지의 시각적 읽기 순서와 일치하지 않습니다. WORD는 감지된 영역별로 그룹화되므로, 열과 테이블 셀이 순서대로 반환되지 않을 수 있습니다.

자연스러운 상단에서 하단, 왼쪽에서 오른쪽으로의 순서를 재구성하려면, 먼저 Y 좌표 순으로 정렬한 다음 각 행 내에서 X 좌표 순으로 정렬하십시오. 작은 Y 좌표 허용 오차를 적용하여 동일한 기준선에 위치한 WORD들을 그룹화합니다.

:path=/static-assets/ocr/content-code-examples/how-to/read-document-advanced-reading-order.cs
using IronOcr;
using System.Linq;

var ocr = new IronTesseract();
using var input = new OcrInput();
input.LoadImage("multi-column-doc.png");

var result = ocr.ReadDocumentAdvanced(input);

int targetPage = 1;
int lineThreshold = 10; // pixel tolerance for grouping same-line words

// Sort by line (Y), then left-to-right (X)
var pageWords = result.Words
    .Where(w => w.PageNumber == targetPage)
    .OrderBy(w => w.Y / lineThreshold)
    .ThenBy(w => w.X)
    .ToList();

foreach (var word in pageWords)
{
    Console.Write($"{word.Text} ");
}
Console.WriteLine();
Imports IronOcr
Imports System.Linq

Dim ocr As New IronTesseract()
Using input As New OcrInput()
    input.LoadImage("multi-column-doc.png")

    Dim result = ocr.ReadDocumentAdvanced(input)

    Dim targetPage As Integer = 1
    Dim lineThreshold As Integer = 10 ' pixel tolerance for grouping same-line words

    ' Sort by line (Y), then left-to-right (X)
    Dim pageWords = result.Words _
        .Where(Function(w) w.PageNumber = targetPage) _
        .OrderBy(Function(w) w.Y \ lineThreshold) _
        .ThenBy(Function(w) w.X) _
        .ToList()

    For Each word In pageWords
        Console.Write($"{word.Text} ")
    Next
    Console.WriteLine()
End Using
$vbLabelText   $csharpLabel

문서에 맞게 lineThreshold을 조정하십시오: 300 DPI의 표준 12pt 텍스트에는 10–15픽셀이 적합합니다. 큰 제목이나 수기 입력의 경우 허용 범위가 더 넓어야 합니다. 이 패턴은 특히 여러 열로 구성된 페이지나 테이블 셀 내부에서 유용하며, 이 경우 엔진이 각 열이나 셀을 독립된 영역으로 인식합니다.

신뢰도가 낮은 WORD는 어떻게 필터링하나요?

데이터베이스, 검색 인덱스 또는 하류 추출 단계에 도달하기 전에 품질이 낮은 검색 결과를 제외하려면, RegionConfidence로 컬렉션을 필터링하십시오. 점수 범위는 0.0에서 1.0까지이며, 값이 높을수록 감지된 텍스트에 대한 신뢰도가 높음을 나타냅니다.

:path=/static-assets/ocr/content-code-examples/how-to/read-document-advanced-confidence-filter.cs
using IronOcr;
using System.Linq;

var ocr = new IronTesseract();
using var input = new OcrInput();
input.LoadImage("noisy-scan.png");

var result = ocr.ReadDocumentAdvanced(input);

double threshold = 0.75;

var highConfidenceWords = result.Words
    .Where(w => w.RegionConfidence >= threshold)
    .ToList();

var lowConfidenceWords = result.Words
    .Where(w => w.RegionConfidence < threshold)
    .ToList();

Console.WriteLine($"Accepted: {highConfidenceWords.Count} words");
Console.WriteLine($"Rejected: {lowConfidenceWords.Count} words");

// Log rejected words for manual review
foreach (var word in lowConfidenceWords)
{
    Console.WriteLine(
        $"  LOW CONF: '{word.Text}' at ({word.X},{word.Y}) — {word.RegionConfidence:P1}"
    );
}
Imports IronOcr
Imports System.Linq

Dim ocr As New IronTesseract()
Using input As New OcrInput()
    input.LoadImage("noisy-scan.png")

    Dim result = ocr.ReadDocumentAdvanced(input)

    Dim threshold As Double = 0.75

    Dim highConfidenceWords = result.Words _
        .Where(Function(w) w.RegionConfidence >= threshold) _
        .ToList()

    Dim lowConfidenceWords = result.Words _
        .Where(Function(w) w.RegionConfidence < threshold) _
        .ToList()

    Console.WriteLine($"Accepted: {highConfidenceWords.Count} words")
    Console.WriteLine($"Rejected: {lowConfidenceWords.Count} words")

    ' Log rejected words for manual review
    For Each word In lowConfidenceWords
        Console.WriteLine(
            $"  LOW CONF: '{word.Text}' at ({word.X},{word.Y}) — {word.RegionConfidence:P1}"
        )
    Next
End Using
$vbLabelText   $csharpLabel

품질이 혼합된 스캔(일부 영역은 선명하지만 다른 부분은 품질이 저하된 경우)의 경우, 이를 통해 신뢰도가 낮은 출력이 하류 시스템으로 전달되는 것을 방지합니다. 원본의 신뢰도 점수를 높이기 위해, 이미지 전처리 필터(Deskew, DeNoise, Binarize)를 사용하여 임계값을 적용하기 전에 품질을 개선합니다.

문자 단위로 반복 작업을 수행하는 방법은 무엇입니까?

OCR 검증 오버레이, 기준 데이터와의 문자 단위 비교, 또는 양식 필드에 대한 정밀한 공간 분석이 필요한 경우 Characters 컬렉션을 사용하십시오. 이는 Words을 반영하지만 개별 문자로 분해됩니다.

:path=/static-assets/ocr/content-code-examples/how-to/read-document-advanced-characters.cs
using IronOcr;

var ocr = new IronTesseract();
using var input = new OcrInput();
input.LoadImage("form-field.png");

var result = ocr.ReadDocumentAdvanced(input);

foreach (var ch in result.Characters)
{
    Console.WriteLine(
        $"'{ch.Text}' | " +
        $"Box: ({ch.X}, {ch.Y}, {ch.Width}, {ch.Height}) | " +
        $"Page {ch.PageNumber}"
    );
}

// ToString() override provides diagnostic-friendly output
Console.WriteLine(result.Characters.First().ToString());
Imports IronOcr

Dim ocr = New IronTesseract()
Using input = New OcrInput()
    input.LoadImage("form-field.png")

    Dim result = ocr.ReadDocumentAdvanced(input)

    For Each ch In result.Characters
        Console.WriteLine($"'{ch.Text}' | Box: ({ch.X}, {ch.Y}, {ch.Width}, {ch.Height}) | Page {ch.PageNumber}")
    Next

    ' ToString() override provides diagnostic-friendly output
    Console.WriteLine(result.Characters.First().ToString())
End Using
$vbLabelText   $csharpLabel

참고해 주세요WordsCharacters는 모두 지연 계산되어 캐시됩니다. 첫 번째 액세스가 계산을 트리거합니다; (이후 액세스 시에는 캐시된 결과가 반환되므로, 두 번째 반복 시에는 비용이 들지 않습니다.

바운딩 박스를 사용하여 원본 이미지를 자르는 방법은 무엇입니까?

검증, 주석 달기 또는 레이블이 지정된 훈련 데이터 구축을 위해 WORD의 시각적 영역을 추출하려면 BoundingBox 속성을 AnyBitmap.CropRegion()에 전달하십시오. 바운딩 박스는 원본 이미지 내 WORD의 위치와 직접적으로 일치합니다.

:path=/static-assets/ocr/content-code-examples/how-to/read-document-advanced-crop-boundingbox.cs
using IronOcr;
using IronSoftware.Drawing;

var ocr = new IronTesseract();
using var input = new OcrInput();
input.LoadImage("invoice.png");

var result = ocr.ReadDocumentAdvanced(input);

// Load the original image for cropping
var originalImage = AnyBitmap.FromFile("invoice.png");

// Find a specific word and crop its region
var targetWord = result.Words.FirstOrDefault(w => w.Text == "Total");
if (targetWord != null)
{
    Rectangle cropRect = targetWord.BoundingBox;
    AnyBitmap croppedRegion = originalImage.CropRegion(cropRect);
    croppedRegion.SaveAs("total-region.png");

    Console.WriteLine(
        $"Cropped '{targetWord.Text}' from " +
        $"({cropRect.X}, {cropRect.Y}, {cropRect.Width}, {cropRect.Height})"
    );
}
Imports IronOcr
Imports IronSoftware.Drawing

Dim ocr As New IronTesseract()
Using input As New OcrInput()
    input.LoadImage("invoice.png")

    Dim result = ocr.ReadDocumentAdvanced(input)

    ' Load the original image for cropping
    Dim originalImage = AnyBitmap.FromFile("invoice.png")

    ' Find a specific word and crop its region
    Dim targetWord = result.Words.FirstOrDefault(Function(w) w.Text = "Total")
    If targetWord IsNot Nothing Then
        Dim cropRect As Rectangle = targetWord.BoundingBox
        Dim croppedRegion As AnyBitmap = originalImage.CropRegion(cropRect)
        croppedRegion.SaveAs("total-region.png")

        Console.WriteLine(
            $"Cropped '{targetWord.Text}' from " &
            $"({cropRect.X}, {cropRect.Y}, {cropRect.Width}, {cropRect.Height})"
        )
    End If
End Using
$vbLabelText   $csharpLabel

이 패턴은 대량 작업에도 확장 가능합니다: 모든 WORD를 반복 처리하고, 각 상자를 잘라낸 다음, 사용자 지정 폰트 훈련이나 후속 ML 파이프라인을 위해 라벨이 지정된 데이터 세트를 내보냅니다. 좌표는 전처리 후 이미지를 반영합니다; EnhanceResolution와 같은 필터가 크기를 변경한 경우, 바운딩 박스는 디스크에 있는 원본 이미지가 아닌 처리된 이미지와 일치합니다.

다음 단계

고급 파이프라인은 IronTesseract.Read()와 동일한 공간적 세부 정보를 제공하며, 여기에 레이아웃 지능 기능이 추가되어 있습니다. 관련 주제:

30일 무료 체험을 시작하거나 라이선스 옵션을 확인해 보세요.

자주 묻는 질문

OCR이란 무엇이며 왜 중요한가요?

OCR 또는 광학 문자 인식은 스캔된 문서, PDF, 디지털 카메라로 캡처된 이미지 등 다양한 문서를 편집 가능하고 검색 가능한 데이터로 변환하는 기술입니다. OCR은 데이터 추출을 자동화하고 수동 데이터 입력을 줄이며 정보를 쉽게 접근하고 편집할 수 있게 만들어 중요한 역할을 합니다.

IronOCR은 OCR 프로세스를 어떻게 강화하나요?

IronOCR은 정확하고 고속의 텍스트 인식 기능을 제공하여 OCR 프로세스를 강화합니다. 여러 언어를 지원하며 텍스트 인식 정확성을 향상시키기 위한 이미지 전처리 같은 기능을 포함하고 있습니다.

IronOCR 여러 페이지로 구성된 문서를 처리할 수 있습니까?

네, IronOCR은 각 페이지에서 텍스트를 추출하여 사용자가 전체 문서를 일관된 단위로 작업할 수 있도록 지원하여 다중 페이지 문서를 효율적으로 처리할 수 있습니다.

IronOCR 어떤 파일 형식을 지원하나요?

IronOCR은 PDF, TIFF, JPEG, PNG, BMP를 포함한 다양한 파일 형식을 지원하여 처리할 수 있는 문서 유형에 유연성을 제공합니다.

IronOCR은 저품질 이미지의 텍스트 인식에 적합합니까?

네, IronOCR은 저해상도 또는 품질이 낮은 이미지를 향상시키고 텍스트 인식 정확성을 높이기 위한 고급 이미지 전처리 기능을 포함하고 있습니다.

IronOCR 다국어를 지원합니까?

IronOCR은 여러 언어를 지원하여 다양한 언어의 텍스트 인식을 필요한 글로벌 애플리케이션에서 다양하게 사용할 수 있는 도구입니다.

IronOCR을 기존 애플리케이션에 통합할 수 있습니까?

IronOCR은 C#을 사용하여 쉽게 기존 애플리케이션에 통합되도록 설계되어 있어 개발자가 최소한의 노력으로 소프트웨어에 OCR 기능을 추가할 수 있습니다.

문서 관리에 IronOCR을 사용하는 이점은 무엇입니까?

IronOCR을 문서 관리를 위해 사용하면 스캔된 문서를 검색 및 편집 가능한 텍스트로 변환하여 수동 데이터 입력의 필요성을 줄이고 문서 접근성을 향상시킵니다.

IronOCR이 데이터 정확성을 어떻게 향상시킬 수 있습니까?

IronOCR은 고급 인식 알고리즘과 이미지 보정 기능을 통해 데이터 정확성을 향상시켜 텍스트 추출 프로세스를 신뢰할 수 있고 정확하게 보장합니다.

IronOCR의 무료 체험판이 있나요?

네, Iron Software는 IronOCR의 무료 체험판을 제공하여 사용자가 구매 결정을 내리기 전에 기능과 성능을 테스트해볼 수 있습니다.

다리우스 세란트
풀스택 소프트웨어 엔지니어 (웹 운영)

다리우스 세런트는 마이애미 대학교에서 컴퓨터 과학 학사 학위를 받았으며, Iron Software에서 풀 스택 웹 운영 마케팅 엔지니어로 근무하고 있습니다. 어린 시절부터 코딩에 매료되었던 그는 컴퓨팅이 신비로우면서도 접근하기 쉬운 분야라고 생각했고, 창의력과 문제 해결 능력을 발휘하기에 완벽한 매체라고 여겼습니다.

Iron Software에서 다리우스는 새로운 것을 만들고 복잡한 개념을 단순화하여 더 쉽게 이해할 수 있도록 하는 것을 즐깁니다. 그는 사내 개발자로서 학생들을 가르치는 데에도 자원하여 차세대 인재들과 전문 지식을 공유하고 있습니다.

다리우스에게 있어 그의 일은 가치 있고 실질적인 영향을 미치기 때문에 보람 있는 일입니다.

시작할 준비 되셨나요?
Nuget 다운로드 5,887,215 | 버전: 2026.5 just released
Still Scrolling Icon

아직도 스크롤하고 계신가요?

빠른 증거를 원하시나요? PM > Install-Package IronOcr
샘플을 실행하세요 이미지가 검색 가능한 텍스트로 바뀌는 것을 확인해 보세요.