C# 中的单词和字符 OCR 数据(坐标、置信度、边界框)

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

对文档进行 OCR 处理后,仅靠提取的文本通常是不够的。 若要定位页面上的特定值、排除低质量检测结果,或在多栏布局中重建自然的阅读顺序,您需要单词坐标、页码、区域索引和置信度评分。

WordsCharacters 集合公开了这些数据。 对于布局感知文档的 ReadDocumentAdvanced() 和用于相机输入的 ReadPhoto() 返回的颗粒度与标准的 OcrResult.Words 集合中的一致。

本指南将详细介绍五种常见模式:迭代处理WORD数据、重建阅读顺序、按置信度过滤、在字符级别进行处理,以及通过边界框裁剪源图像。

立即开始 30天试用,在您的开发流程中测试这些资源库。

NuGet 使用 NuGet 安装

PM >  Install-Package IronOcr

IronOCR 上查看 NuGet 快速安装。超过 1000 万次下载,它正以 C# 改变 PDF 开发。 您也可以下载 DLLWindows 安装程序

快速入门:从 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 集合返回跨每一页检测到的每个单词。 每个条目(即 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} | " +
        $"'{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,而不是 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 以匹配您的文档:10-15像素适用于标准12pt文本在300 DPI下。 对于较大的标题或手写输入内容,可适当放宽翻译标准。 此模式在多栏页面和表格单元格内部特别有用,引擎会将每列或每个单元格识别为独立区域。

如何过滤低置信度的词汇?

要在他们到达您的数据库、搜索索引或下游提取之前排除低质量检测,请按 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

对于质量参差不齐的扫描件(部分区域清晰,其他部分模糊),这可防止低置信度的输出结果进入下游系统。 为了提高源图像的置信度评分,图像预处理滤波器(去倾斜、去噪、二值化)会在应用阈值之前提升图像质量。

如何在字符级别进行迭代?

对于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 属性传递给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.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、裁剪每个文本框,并导出标注数据集,用于自定义字体训练或下游机器学习管道。 坐标反映了预处理后的图像; 如果像 EnhanceResolution 这样的过滤器改变了尺寸,边界框与处理后的图像匹配,而不是磁盘上的原始图像。

下一步

先进的管道提供与 IronTesseract.Read() 相同的空间细节,并在此基础上增加布局智能。相关主题:

立即开始 30 天试用查看许可选项

常见问题解答

什么是C#中的高级OCR?

C#中的高级OCR是指使用光学字符识别来提取详细的单词和字符数据,包括坐标、置信度级别和边界框,使用IronOCR的高级管道。

如何使用IronOCR访问单词数据?

您可以通过遍历AdvancedWord集合在IronOCR中访问单词数据,该集合提供有关每个单词在扫描文档中的位置和置信度评分的详细信息。

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
全栈软件工程师(WebOps)

Darrius Serrant 拥有迈阿密大学的计算机科学学士学位,目前在 Iron Software 担任全栈 WebOps 市场工程师。从小就被编码吸引,他认为计算机既神秘又易于接触,使其成为创意和问题解决的理想媒介。

在 Iron Software,Darrius 喜欢创造新事物,并简化复杂概念以使其更易理解。作为我们常驻的开发者之一,他还自愿教授学生,与下一代分享他的专业知识。

对于 Darrius 来说,他的工作令人满意,因为它被重视并产生真正的影响。

准备开始了吗?
Nuget 下载 6,136,090 | 版本: 2026.7 刚刚发布
Still Scrolling Icon

还在滚动吗?

想快速获得证据? PM > Install-Package IronOcr
运行示例 观看您的图像变成可搜索文本。