C# 中的文字與字元 OCR 資料(座標、信心度、邊界框)

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

在對文件執行 OCR 後,僅靠提取的文字通常是不夠的。 若要定位頁面上的特定值、排除低品質的偵測結果,或在多欄版面中重建自然的閱讀順序,您需要單字座標、頁碼、區域索引以及信心分數。

WordsCharacters 集合在 AdvancedOcrResultBase 上公開了這些資料。 無論是適用於具版面配置意識文件的 ReadDocumentAdvanced(),還是適用於相機輸入的 ReadPhoto(),其返回的細粒度皆與標準 OcrResult.Words 集合所提供的細粒度相同。

本指南將逐步說明五種常見模式:迭代WORD資料、重建閱讀順序、依信心程度篩選、在字元層級進行處理,以及從邊界框中裁切原始圖像。

立即開始 30 天試用,在您的開發流程中測試這些套件。

NuGet 透過 NuGet 安裝

PM >  Install-Package IronOcr

請至 NuGet 查閱 https://www.nuget.org/packages/IronOcr 以快速安裝。該套件下載量已突破 1,000 萬次,正透過 C# 徹底改變 PDF 開發領域。 您亦可下載 DLL 檔案或 Windows 安裝程式

快速入門:從 OCR 結果讀取 WORD 與字元資料

呼叫 ReadDocumentAdvanced(或 ReadPhoto)並迭代 result.Words,即可在幾行代碼內取得每個被識別WORD及其座標、頁碼與置信度分數。

  1. using 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。 每個條目(AdvancedWordAdvancedCharacter,兩者皆繼承自 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。 這與大多數採用零起始索引的 .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 的標準 12 點文字,10–15 像素為宜。 較大的標題或手寫輸入內容可酌情放寬標準。 此模式在多欄頁面及表格儲存格內特別有用,引擎會將每欄或每個儲存格視為獨立區域進行處理。

如何過濾低信心詞彙?

若要避免低品質的檢索結果進入您的資料庫、搜尋索引或下游擷取流程,請使用 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

對於掃描品質參差不齊的文件(部分區域清晰,其他部分則模糊),此機制可防止信心度低的輸出結果傳遞至下游系統。 為提高原始圖像的信心分數,在套用閾值前,會先透過影像預處理濾鏡(去傾斜、去噪、二值化)來提升圖像品質。

如何在字元層級進行迭代?

若需進行 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 皆採延遲計算並進行快取。 首次存取會觸發計算; (後續存取將返回快取結果,因此第二次迭代不會產生任何成本。)}]

如何使用 BoundingBox 裁切原始圖片?

若要擷取 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、裁切每個方塊,並匯出標註資料集,供自訂字型訓練或後續的機器學習流程使用。 座標反映的是預處理後的影像; 若 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 的免費試用版,讓使用者能在決定購買前測試其功能與效能。

Darrius Serrant
全端軟體工程師 (WebOps)

Darrius Serrant 擁有邁阿密大學的電腦科學學士學位,目前任職於 Iron Software,擔任全端 WebOps 行銷工程師。他自幼便對編碼深感著迷,認為計算機科學既神秘又平易近人,是發揮創意與解決問題的完美媒介。

在 Iron Software,達里厄斯熱衷於開創嶄新事物,並將複雜概念化繁為簡,使其更易於理解。身為公司內部開發人員之一,他亦自願指導學生,將專業知識傳承給下一代。

對達里厄斯而言,他的工作之所以令人滿足,在於這份工作不僅受到重視,更能產生實質影響。

準備開始了嗎?
Nuget 下載 5,887,215 | 版本: 2026.5 just released
Still Scrolling Icon

還在往下捲動嗎?

想要快速確認成果嗎? PM > Install-Package IronOcr
執行範例 觀看您的圖片轉為可搜尋文字。