在C#中進行單詞和字元OCR資料處理(坐標、自信度、界定框)

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

在對文件運行OCR後,僅提取文字通常是不夠的。 要在頁面上定位特定值、排除低質量檢測或在多欄佈局上重建自然閱讀順序,您需要每個單詞的坐標、頁碼、區域索引和自信度分數。

AdvancedOcrResultBase中披露這些資料。 對於識別版面文件的ReadDocumentAdvanced()和對於相機輸入的OcrResult.Words集合可用的相同細節。

本指南介紹五個常見模式:單詞資料迭代、重建閱讀順序、根據自信度過濾、在字元層級工作及從界定框中裁剪源圖像。

開始免費30天試用以在您的管道中測試這些集合。

NuGet 使用NuGet安裝

PM >  Install-Package IronOcr

查看在NuGet上的https://www.nuget.org/packages/IronOcr,快速安裝。超過1000萬次下載,正在用C#轉變PDF開發。 您也可以下載DLLWindows安裝程式

快速入門:從OCR結果讀取單詞和字元資料

調用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


您如何迭代具有坐標和自信度的單詞?

Words集合返回整個頁面上的每個檢測到的單詞。 每個條目(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} | " +
        $"'{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為基數:頁一是0。 這與大多數 .NET 集合不同,.NET集合採用零基數索引。}
RegionIndex 遵循標準的0為基數的慣例。)] )}]

要將坐標傳遞給圖形或裁剪API,使用BoundingBox屬性。 它將位置和尺寸打包成單個IronSoftware.Drawing.Rectangle

您如何重建閱讀順序?

在多欄佈局中,Words集合迭代順序與頁面上的視覺閱讀順序不一致。 單詞按檢測到的區域分組,因此列和表格單元可以是未按順序返回的。

要重建自上而下、從左到右的自然順序,首先按Y坐標排序集合,然後在每行內按X排序。少量Y容差可將相同基準線上的單詞分組。

: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像素。 較大的標題或手寫輸入需要更寬的容差。 此模式對於多欄頁面和表格單元內特別有用,因為引擎將每個列或單元檢測為其自身的區域。

您如何過濾低自信度單詞?

要在低質量檢測達到您的資料庫、搜尋索引或下游提取前將其排除,可通過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

請注意兩者Characters都是懶惰計算的並被快取。 首次存取觸發計算; 隨後的存取返回快取結果,因此第二次迭代不消耗成本。

您如何使用界定框裁剪原始圖像?

要提取單詞的視覺區域以供驗證、註釋或構建標記訓練資料,將AnyBitmap.CropRegion()。 界定框直接映射到其在源圖像中的位置。

: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

此模式可擴展到批量操作:迭代每個單詞、裁剪每個框並導出標記資料集以供自訂字體訓練或下游ML管道使用。 坐標反映預處理後的圖像; 如果像EnhanceResolution這樣的過濾器改變了尺寸,那麼界定框會匹配處理後的圖像,而不是磁碟上的原始圖像。

下一步

高階管道提供與IronTesseract.Read()相同的空間細節,以及附加的版面智慧。相關主題:

開始您的免費30天試用查看授權選項

常見問題

什麼是 C# 中的進階 OCR?

C# 中的進階 OCR 指的是利用光學字元識別來提取包括坐標、置信度水平和邊界框在內的詳細單詞和字元資料,這是利用 IronOCR 的進階管線完成的。

我如何使用 IronOCR 存取單詞資料?

您可以通過迭代 AdvancedWord 集合來在 IronOCR 中存取單詞資料,該集合提供了每個單詞在掃描文件中的位置和置信度分數的詳細資訊。

邊界框在 OCR 中的重要性是什麼?

邊界框在 OCR 中至關重要,因為它們定義了掃描圖片上識別到的文字元素的確切位置和尺寸,使得精確的文字提取和圖片操作成為可能。

我可以依置信度分數過濾 OCR 結果嗎?

可以,使用 IronOCR,您可以依置信度分數過濾 OCR 結果,從而確保只有具有高識別準確性的文字會進行進一步處理。

如何在 OCR 結果中重建閱讀順序?

通過分析 IronOCR 提供的 AdvancedWord 和 AdvancedCharacter 物件的順序可以實現重建 OCR 結果中的閱讀順序,這反映了文件的自然閱讀流向。

using IronOCR 是否可以裁剪來源圖片?

IronOCR 允許您根據文字資料的分析來裁剪來源圖片,其中包括被識別單詞和字元的邊界框和坐標。

什麼是 AdvancedWord 和 AdvancedCharacter 集合?

IronOCR 中的 AdvancedWord 和 AdvancedCharacter 集合是用來儲存每個被識別的單詞和字元的詳細資訊的資料結構,包括其坐標、置信度水平和邊界框。

IronOCR 如何處理字元識別?

IronOCR 透過利用一個進階管線處理字元識別,分析每個字元的特徵,提供其位置、尺寸和識別置信度等詳細資料。

IronOCR 可以處理哪些型別的文件?

IronOCR 可以處理多種型別的文件,包括 PDF、掃描圖片和照片,以高度準確和詳細地提取文字資料。

IronOCR有免費試用版嗎?

有的,Iron Software提供IronOCR的免費試用版,允許使用者在做出購買決定前測試其功能和能力。

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

Darrius Serrant擁有邁阿密大學的電腦科學學士學位,並在Iron Software擔任全端WebOps行銷工程師。從小就對程式設計有興趣,他認為計算既神秘又易於理解,成為創意和問題解決的完美媒介。

在Iron Software,Darrius喜歡創造新事物並簡化複雜的概念,使其更易於理解。作為我們的常駐開發人員之一,他還志願教學,將他的專業知識傳授給下一代。

對Darrius來說,他的工作是有意義的,因為它有價值且對社會有真正的影響。

準備開始了嗎?
Nuget 下載 6,136,090 | 版本: 2026.7 剛剛發布
Still Scrolling Icon

還在滾動?

想要快速證明? PM > Install-Package IronOcr
執行範例 觀看您的圖像轉變為可搜尋文字。