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

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

快速入门:从 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。 每个条目(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 均采用延迟计算并进行缓存。 首次访问将触发计算; 后续访问将返回缓存结果,因此第二次迭代无需任何成本。)}]

如何使用边界框裁剪原始图像?

若需提取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,Darrius 喜欢创造新事物,并简化复杂概念以使其更易理解。作为我们常驻的开发者之一,他还自愿教授学生,与下一代分享他的专业知识。

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

准备开始了吗?
Nuget 下载 5,887,215 | 版本: 2026.5 just released
Still Scrolling Icon

还在滚动吗?

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