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을 반복하면 몇 줄 안에 좌표, 페이지 번호, 신뢰도 점수와 함께 인식된 모든 단어를 얻을 수 있습니다.

  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 컬렉션은 모든 페이지에서 감지된 모든 단어를 반환합니다. 각 항목(둘 다 AdvancedOcrElement에서 상속받는 AdvancedWord 또는 AdvancedCharacter)은 텍스트, 픽셀 좌표, 크기, 소속 페이지, 탐지된 텍스트 블록의 식별자, 해당 지역의 신뢰도 점수를 노출합니다.

: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} | " +
        $"'{word.Text}' | " +
        $"Position: ({word.X}, {word.Y}) | " +
        $"Size: {word.Width}x{word.Height} | " +
        $"Confidence: {word.Confidence: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} | " &
            $"'{word.Text}' | " &
            $"Position: ({word.X}, {word.Y}) | " &
            $"Size: {word.Width}x{word.Height} | " &
            $"Confidence: {word.Confidence:P1}"
        )
    Next

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

PageNumber는 1베이스입니다: 페이지 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.Confidence >= threshold)
    .ToList();

var lowConfidenceWords = result.Words
    .Where(w => w.Confidence < 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.Confidence:P1}"
    );
}
Imports IronOcr
Imports System.Linq

Dim ocr = New IronTesseract()
Using input = 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.Confidence >= threshold) _
        .ToList()

    Dim lowConfidenceWords = result.Words _
        .Where(Function(w) w.Confidence < 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.Confidence: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는 모두 게으르게 계산되고 캐시됩니다. 첫 번째 액세스가 계산을 트리거합니다; (이후 액세스 시에는 캐시된 결과가 반환되므로, 두 번째 반복 시에는 비용이 들지 않습니다.

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

검증, 주석 추가 또는 라벨링된 학습 데이터를 빌드하기 위해 단어의 시각적 영역을 추출하려면 AnyBitmap.CropRegion()BoundingBox 속성을 전달하십시오. 바운딩 박스는 원본 이미지 내 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.Clone(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.Clone(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일 무료 체험을 시작하거나 라이선스 옵션을 확인해 보세요.

자주 묻는 질문

C#의 고급 OCR이란?

C#의 고급 OCR은 IronOCR의 고급 파이프라인을 활용하여 좌표, 신뢰도 수준, 경계 상자 등을 포함한 상세한 단어 및 문자 데이터를 추출하는 과정입니다.

IronOCR로 단어 데이터를 어떻게 액세스할 수 있습니까?

IronOCR에서는 AdvancedWord 컬렉션을 반복하여 스캔된 문서의 각 단어 위치 및 신뢰도 점수에 대한 자세한 정보를 제공받을 수 있습니다.

OCR에서 경계 상자의 중요성은 무엇입니까?

경계 상자는 OCR에서 인식된 텍스트 요소의 정확한 위치 및 크기를 정의하여 정확한 텍스트 추출 및 이미지 조작을 가능하게 하므로 중요합니다.

OCR 결과를 신뢰도 점수에 따라 필터링할 수 있습니까?

네, IronOCR를 사용하면 높은 인식 정확성을 가진 텍스트만 추가 처리에 고려하도록 OCR 결과를 신뢰도 점수에 따라 필터링할 수 있습니다.

OCR 결과에서 읽기 순서를 어떻게 재구성합니까?

IronOCR이 제공하는 AdvancedWord 및 AdvancedCharacter 객체의 순서를 분석하여 문서의 자연스러운 읽기 흐름을 반영하는 OCR 결과에서 읽기 순서를 재구성할 수 있습니다.

IronOCR을 사용하여 소스 이미지를 자르는 것이 가능합니까?

IronOCR은 인식된 단어 및 문자의 경계 상자 및 좌표를 포함한 텍스트 데이터 분석에 기초해 소스 이미지를 자를 수 있습니다.

AdvancedWord 및 AdvancedCharacter 컬렉션이란?

IronOCR의 AdvancedWord 및 AdvancedCharacter 컬렉션은 각 인식된 단어 및 문자의 좌표, 신뢰도 수준, 경계 상자를 포함한 상세 정보를 저장하는 데이터 구조입니다.

IronOCR은 문자 인식을 어떻게 처리합니까?

IronOCR은 각 문자의 특징을 분석하여 그 위치, 크기, 인식 신뢰도와 같은 상세 데이터를 제공하는 고급 파이프라인을 활용해 문자 인식을 처리합니다.

IronOCR로 처리할 수 있는 문서 유형은 무엇입니까?

IronOCR은 PDF, 스캔 이미지, 사진을 포함한 다양한 문서 유형을 처리하여 높은 정확도와 세부 사항으로 텍스트 데이터를 추출합니다.

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

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

Darrius Serrant
풀스택 소프트웨어 엔지니어 (웹 운영)

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

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

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

시작할 준비 되셨나요?
Nuget 다운로드 6,136,090 | 버전: 2026.7 방금 출시
Still Scrolling Icon

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

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