使用 C# OCR 从图像中读取文本

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

在本教程中,我们将学习如何用 C# 和其他 .NET 语言将图像转换为文本。

在 .NET 应用程序中从图像中读取文本

我们将使用 "IronOcr.IronTesseract "类来识别图像中的文本,并研究如何使用_Iron Tesseract OCR_在.NET中从图像中读取文本时获得最高的准确性和速度。

为了实现 "图像到文本",我们将在 Visual Studio 项目中安装 IronOCR 库。

为此,我们下载 IronOcr DLL 或使用 NuGet .

Install-Package IronOcr

为什么选择 IronOCR?

我们使用 IronOCR 进行魔方管理,因为它具有独一无二的特性:

  • 在纯.NET环境下开箱即用
  • 无需在机器上安装 Tesseract。
  • 运行最新的引擎 魔方 5 ( 以及魔方 4 & 3)
  • 适用于任何 .NET 项目:.NET Framework 4.5 +、.NET Standard 2 + 和 .NET Core 2、3 和 5!
  • 与传统魔方相比,精度更高,速度更快
  • 支持 Xamarin、Mono、Azure 和 Docker
  • 使用 NuGet 软件包管理复杂的 Tesseract 字典系统
  • 无需配置即可支持 PDFS、多帧 Tiffs 和所有主要图像格式

  • 可纠正低质量和倾斜扫描,以获得 Tesseract 的最佳效果。

适用于OCR的C# NuGet库

安装使用 NuGet

Install-Package IronOcr
Java PDF JAR

下载 DLL

下载DLL

手动安装到你的项目中

适用于OCR的C# NuGet库

安装使用 NuGet

Install-Package IronOcr
Java PDF JAR

下载 DLL

下载DLL

手动安装到你的项目中

开始在您的项目中使用IronPDF,并立即获取免费试用。

第一步:
green arrow pointer

查看 IronOCRNuget 用于快速安装和部署。它有超过800万次下载,正在使用C#改变OCR。

适用于OCR的C# NuGet库 nuget.org/packages/IronOcr/
Install-Package IronOcr

考虑安装 IronOCR DLL 直接。下载并手动安装到您的项目或GAC表单中: IronOcr.zip

手动安装到你的项目中

下载DLL

在 C&num 中使用 Tesseract;

在这个简单的示例中,您可以看到我们使用了 IronOcr.铁魔方 类从图像中读取文本,并自动将其值返回为字符串。

:path=/static-assets/ocr/content-code-examples/tutorials/how-to-read-text-from-an-image-in-csharp-net-1.cs
// PM> Install-Package IronOcr
using IronOcr;

OcrResult result = new IronTesseract().Read(@"img\Screenshot.png");
Console.WriteLine(result.Text);
' PM> Install-Package IronOcr
Imports IronOcr

Private result As OcrResult = (New IronTesseract()).Read("img\Screenshot.png")
Console.WriteLine(result.Text)
VB   C#

这使得以下文字的准确率达到 100%:

IronOCR Simple Example

In this simple example we will test the accuracy of our C# OCR library to read text from a PNG
Image. This is a very basic test, but things will get more complicated as the tutorial continues.

The quick brown fox jumps over the lazy dog

虽然这看起来很简单,但 "表面之下 "却是复杂的行为:扫描图像以确定对齐、质量和分辨率,查看其属性,优化 OCR 引擎,然后使用训练有素的人工智能网络像人类一样阅读文本。

对于计算机来说,实现 OCR 并不是一个简单的过程,阅读速度可能与人类相似。换句话说,OCR 并不是一个瞬间完成的过程。不过,在这种情况下,它的准确率是 100% 的。

C# OCR 应用程序结果的准确性

Advanced Use of IronOCR Tesseract for C#

在大多数实际使用案例中,开发人员都希望自己的项目能获得最佳性能。在这种情况下,我们建议您使用 OcrInput钢铁魔方 名称空间内的类。

OcrInput 为您提供了设置 OCR 作业具体特征的功能,如

  • 可处理几乎任何类型的图像,包括 JPEG、TIFF、GIF、BMP 和 PNG
  • 导入整个或部分 PDF 文档
  • 增强对比度、分辨率和大小
  • 纠正旋转、扫描噪音、数字噪音、倾斜和负像

钢铁魔方

  • 从数百种预先打包的语言和语言变体中进行选择
  • 开箱即用 Tesseract 5、4 或 3 OCR 引擎
  • 指定文档类型,无论是截图、片段还是整个文档
  • 读取条形码

  • 输出结果可搜索的 PDF、Hocr HTML、DOM 和字符串

示例:开始使用 OcrInput + IronTesseract

这一切可能看起来令人生畏,但在下面的示例中,您将看到我们建议您开始使用的默认设置,它几乎适用于您输入到 IronOCR 的任何图像。

:path=/static-assets/ocr/content-code-examples/tutorials/how-to-read-text-from-an-image-in-csharp-net-2.cs
using IronOcr;

IronTesseract ocr = new IronTesseract();
using OcrInput input = new OcrInput();
var pageindices = new int[] { 1, 2 };
input.LoadImageFrames(@"img\Potter.tiff", pageindices);
OcrResult result = ocr.Read(input);
Console.WriteLine(result.Text);
Imports IronOcr

Private ocr As New IronTesseract()
Private OcrInput As using
Private pageindices = New Integer() { 1, 2 }
input.LoadImageFrames("img\Potter.tiff", pageindices)
Dim result As OcrResult = ocr.Read(input)
Console.WriteLine(result.Text)
VB   C#

即使是中等质量的扫描,我们也可以使用它,准确率达到 100%。


C# OCR Scan From Tiff 示例

正如您所看到的,阅读文本 (并可选择条形码) 从扫描图像(如 TIFF)中提取数据非常容易。

这项 OCR 工作的准确率为 100%

对于现实世界中的文档来说,OCR 并不是一门完美的科学,但 IronTesseract 却做到了这一点。

你还会注意到,IronOCR 可以自动读取多页文档,如 TIFF,甚至是 从 PDF 文档中提取文本 自动。

示例:低质量扫描


C# OCR 低分辨率扫描与数字噪声

现在,我们将尝试以较低的 DPI 对同一页纸进行质量低得多的扫描,它有大量的失真和数字噪音,并对原纸造成了损坏。

这正是 IronOCR 与其他 OCR 库(如 Tesseract)相比的真正优势所在,我们会发现其他 OCR 项目都羞于讨论这个问题。在真实世界的扫描图像上进行 OCR,而不是以数字方式创建不切实际的 "完美 "测试案例,以达到 100% 的 OCR 精确度。

:path=/static-assets/ocr/content-code-examples/tutorials/how-to-read-text-from-an-image-in-csharp-net-3.cs
using IronOcr;

IronTesseract ocr = new IronTesseract();
using OcrInput input = new OcrInput();
var pageindices = new int[] { 1, 2 };
input.LoadImageFrames(@"img\Potter.LowQuality.tiff", pageindices);
input.Deskew(); // removes rotation and perspective
OcrResult result = ocr.Read(input);
Console.WriteLine(result.Text);
Imports IronOcr

Private ocr As New IronTesseract()
Private OcrInput As using
Private pageindices = New Integer() { 1, 2 }
input.LoadImageFrames("img\Potter.LowQuality.tiff", pageindices)
input.Deskew() ' removes rotation and perspective
Dim result As OcrResult = ocr.Read(input)
Console.WriteLine(result.Text)
VB   C#

不添加 `Input.Deskew()将图像拉直后,准确率为 52.5%。还不够好。

添加 `Input.Deskew()准确率达到99.8%,即 险些 与高质量扫描的 OCR 一样精确。

图像过滤器可能会花费一些运行时间,但也能减少 OCR 处理时间。对于开发人员来说,了解输入文档是一个微妙的平衡点。

如果你不确定

  • 输入纠偏()是一种安全且非常成功的过滤器。
  • 其次,试试 `Input.DeNoise()修复大量数字噪音。

性能调整

事实上,影响 OCR 工作速度的最重要因素是输入图像的质量。背景噪音越小,dpi 越高(完美的目标 dpi 约为 200 dpi),就能获得最快、最准确的 OCR 结果。

但这并不是必要的,因为 IronOCR 在修正不完美的文档方面表现出色 (虽然这很耗时,而且会导致 OCR 作业占用更多的 CPU 周期).

如果可能,选择 TIFF 或 PNG 等数字噪点较少的输入图像格式也会比 TIFF 或 PNG 得到更快的结果。 有损 图像格式,如 JPEG。

图像滤波器

以下图像过滤器可以真正提高性能:

  • OcrInput.Rotate( 双学位) - 顺时针旋转图像若干度。如需逆时针旋转,请使用负数。
  • OcrInput.Binarize() - 该图像滤镜可将每个像素变成黑色或白色,没有中间色。可在文字与背景对比度非常低的情况下提高 OCR 性能。
  • OcrInput.ToGrayScale() - 该图像滤镜可将每个像素转化为灰度阴影。不太可能提高 OCR 的准确性,但可以提高速度
  • OcrInput.Contrast() 自动增加对比度。该过滤器通常可以提高低对比度扫描的 OCR 速度和准确性。
  • OcrInput.DeNoise() - 消除数字噪声。该滤波器只能用于预计会产生噪音的地方。
  • OcrInput.Invert() - 倒置每种颜色。例如:白变黑:黑变白。
  • OcrInput.Dilate() 高级形态学。Dilation(扩张)在图像中的物体边界上添加像素。与 Erode 相反
  • OcrInput.Erode() 高级形态学。Erosion 删除对象边界上的像素与 Dilate 相反
  • OcrInput.Deskew() - 旋转图像,使其方向正确且正交。这对 OCR 非常有用,因为 Tesseract 对倾斜扫描的容忍度可低至 5 度。
  • OcrInput.DeepCleanBackgroundNoise() - 去除严重的背景噪音。只有在已知文档背景噪音极大的情况下才会使用该过滤器,因为该过滤器还可能降低干净文档的 OCR 精确度,而且 CPU 成本非常高。

  • OcrInput.EnhanceResolution - 增强低质量图像的分辨率。由于 OcrInput.MinimumDPIOcrInput.TargetDPI 会自动捕捉并解析低分辨率输入,因此通常不需要使用此过滤器。

速度性能调整

使用 Iron Tesseract 时,我们可能希望加快高质量扫描的 OCR 速度。

如果要优化速度,我们可以从这个位置开始,然后再打开功能,直到找到完美的平衡。

:path=/static-assets/ocr/content-code-examples/tutorials/how-to-read-text-from-an-image-in-csharp-net-4.cs
using IronOcr;

IronTesseract ocr = new IronTesseract();

// Configure for speed
ocr.Configuration.BlackListCharacters = "~`$#^*_}{][|\\";
ocr.Configuration.PageSegmentationMode = TesseractPageSegmentationMode.Auto;
ocr.Language = OcrLanguage.EnglishFast;

using OcrInput input = new OcrInput();
var pageindices = new int[] { 1, 2 };
input.LoadImageFrames(@"img\Potter.tiff", pageindices);

OcrResult result = ocr.Read(input);
Console.WriteLine(result.Text);
Imports IronOcr

Private ocr As New IronTesseract()

' Configure for speed
ocr.Configuration.BlackListCharacters = "~`$#^*_}{][|\"
ocr.Configuration.PageSegmentationMode = TesseractPageSegmentationMode.Auto
ocr.Language = OcrLanguage.EnglishFast

Using input As New OcrInput()
	Dim pageindices = New Integer() { 1, 2 }
	input.LoadImageFrames("img\Potter.tiff", pageindices)
	
	Dim result As OcrResult = ocr.Read(input)
	Console.WriteLine(result.Text)
End Using
VB   C#

这一结果的准确率为99.8%,而基准准确率为100%,但速度快了 35%。

阅读图像的裁剪区域

从下面的代码示例中可以看出,Iron 的 Tesseract OCR fork 擅长读取图像的特定区域。

我们可以使用 System.Drawing.Rectangle 以像素为单位指定要读取的图像的确切区域。

当我们在处理填写的标准化表格时,只有特定区域的文字会随情况而变化,这就非常有用了。

示例:扫描页面的一个区域

我们可以使用 System.Drawing.Rectangle 来指定读取文档的区域。测量单位始终是像素

我们将看到,这不仅能提高速度,还能避免读取不必要的文本。在本例中,我们将从标准化文档的中心区域读取学生姓名。


C# OCR Scan From Tiff 示例   C# OCR Scan From Tiff 示例


:path=/static-assets/ocr/content-code-examples/tutorials/how-to-read-text-from-an-image-in-csharp-net-5.cs
using IronOcr;
using IronSoftware.Drawing;

IronTesseract ocr = new IronTesseract();
using OcrInput input = new OcrInput();
// a 41% improvement on speed
Rectangle contentArea = new Rectangle(x: 215, y: 1250, height: 280, width: 1335);
input.LoadImage("img/ComSci.png", contentArea);
OcrResult result = ocr.Read(input);
Console.WriteLine(result.Text);
Imports IronOcr
Imports IronSoftware.Drawing

Private ocr As New IronTesseract()
Private OcrInput As using
' a 41% improvement on speed
Private contentArea As New Rectangle(x:= 215, y:= 1250, height:= 280, width:= 1335)
input.LoadImage("img/ComSci.png", contentArea)
Dim result As OcrResult = ocr.Read(input)
Console.WriteLine(result.Text)
VB   C#

这样,速度提高了41%,并允许我们进行特定处理。这对于_.NET OCR_文档相似且一致的情况非常有用,如发票、收据、支票、表格、费用报销等。

内容区域 (OCR 裁剪) 读取 PDF 文件时也支持

国际语言

IronOCR 通过以 DLL 形式发布的语言包支持 125 种国际语言,这些语言包可以从本网站下载,也可以从 Visual Studio 的 NuGet 软件包管理器下载。

我们可以通过浏览 NuGet (搜索 "IronOcr.Languages") 或从 OCR 语言包页面.

支持的语言包括

  • 南非荷兰语
  • 阿姆哈拉语_又称አማ_B1↩鸟语
  • 阿拉伯语 又名 العربية
  • ArabicAlphabet Also known as العربية
  • 亚美尼亚字母 又称 աայերեն
  • 阿萨姆语 Also known as ়া
  • 阿塞拜疆语 Also known as azərbaycan dili
  • 阿塞拜疆西里尔文 Also known as azərbaycan dili
  • 白俄罗斯语 别名 беларуская мова
  • Bengali Also known as Bangla,বাংলা
  • 孟加拉语字母表 Also known as Bangla,বাংলা
  • 藏语 别名藏语标准, 藏语, 中央 ཡིག་
  • 波斯尼亚文 Also known as bosanski jezik
  • 布列塔尼语 别名 brezhoneg
  • 保加利亚语 又名 български език
  • CanadianAboriginalAlphabet Also known as Canadian First Nations, Indigenous Canadians, Native Canadian, Inuit
  • 加泰罗尼亚语 _又称加泰罗尼亚语、瓦伦西亚语___
  • 宿务语 又称比萨亚语、比尼萨亚语 Cebuano Also known as Bisaya, Binisaya
  • 捷克语 别名čeština、český jazyk
  • CherokeeAlphabet 又称ᏣᎳᎩᎦᏬᏂᎯᏍᏗ、Tsalagi Gawonihisdi
  • 中文简体又名中文 (Zhōngwén), 汉语, 汉语
  • 中文简体垂直又称中文 (Zhōngwén), 汉语, 汉语
  • 中文繁体又名中文 (Zhōngwén), 汉语, 汉语
  • 中文繁体竖排 又称中文 (Zhōngwén), 汉语, 汉语
  • 切罗基语 又名 ᏣᎳᎩ ᎦᏬᏂᎯᏍᏗ, Tsalagi Gawonihisdi
  • 科西嘉语_又称科苏语、科萨语____
  • 威尔士语又称 Cymraeg
  • 西里尔字母又称西里尔字母
  • 丹麦文 又称丹麦文 Dansk_
  • DanishFraktur 又称 dansk
  • 德语 Also known as Deutsch
  • GermanFraktur 又称 Deutsch
  • 梵文字母 Also known as Nagair,देवनागरी
  • Divehi 又名ދިވެ ⧏41⧐ ި ⧏33⧐ ި ⧏35⧐ި ⧏34⧐
  • 宗卡语 又称རྫོང་ཁ
  • 希腊文 又称 ελληνικά
  • 英语
  • MiddleEnglish 又称英语 (公元 1100-1500 年)
  • 世界语
  • 爱沙尼亚语 又称 eesti、eesti keel
  • 埃塞俄比亚字母又称 Ge'ez,ግዕዝ,Gəʿəz
  • 巴斯克语又称 euskara、euskera
  • 法罗语 又称 føroyskt
  • 波斯语 _别名 فارسی
  • 菲律宾语 又称菲律宾国语、标准塔加路语
  • 芬兰语_亦称 "芬兰语"、"芬兰文"____
  • 金融亦称 "金融、数字和技术文件" 英文
  • 法语 亦称法语、法语语言 French
  • FrakturAlphabet 又称通用 Fraktur,拉丁字母的手写体
  • 法兰克语 _又称弗伦基斯克语、古法兰克语_FrankishAlso known as Frenkisk, Old Franconian
  • 中古法语 又称 "Moyen Français",中古法语 (约公元 1400-1600 年公元 1400-1600 年)
  • 西弗里斯兰语又名弗里斯克语
  • 格鲁吉亚语字母又称ქართ-ული
  • 苏格兰盖尔语 又称 Gàidhlig
  • 爱尔兰语 又称 Gaeilge
  • 加利西亚语 又称 galego
  • 古希腊语 又称 🆙λληνική
  • 希腊字母Also known as ελληνικά
  • 古吉拉特语 _别名 为 费尔南多 - 古吉拉特语
  • 古吉拉特语字母 _别名 为 费尔达吝啬鬼
  • GurmukhiAlphabet 又称 Gurmukhī、ਗੁਰਮੁਖ欝、Shahmukhi、گُرمُکھی、Sihk Script
  • 韩文字母又称朝鲜文字母、한글、韩文、조선글、hosŏn'gŭl
  • HangulVerticalAlphabet(韩文竖写字母)又称韩文字母、한글、韩文、조선글、hosŏn'gŭl
  • HanSimplifiedAlphabet 又称 Samhan ,한어, 韓語
  • HanSimplifiedVerticalAlphabet 又名 Samhan ,한어, 韓語
  • HanTraditionalAlphabet 也称作 Samhan ,한어, 韓語
  • HanTraditionalVerticalAlphabet 也称作 Samhan ,한어, 韓語
  • 海地语 又称 Kreyòl ayisyen
  • 希伯来语别名 עברית
  • 希伯来字母 又名 עברית
  • 印地语 又称हिन्दी, हिंदी
  • 克罗地亚文 又称 hrvatski jezik
  • 匈牙利文 也称作 magyar
  • 亚美尼亚文 又称 Ĵայեήն
  • Inuktitut Also known as ᐃᓄᒃᑎᑐᑦ
  • 印度尼西亚语_又称印尼语
  • 冰岛语 别名 Íslenska
  • 意大利语 _又称意大利语
  • 旧意大利语 又称 italiano
  • 日语字母 又称日本語 (にほんご)
  • JapaneseVerticalAlphabet 又称日本語 (にほんご)
  • 爪哇语又称 "basa Jawa"____
  • 日语亦称日本語 (にほんご)
  • 日语垂直又称日本語 (にほんご)

  • KannadaAlphabet _Also known as ಕ್್)
  • 格鲁吉亚语又称ქართ・ული
  • GeorgianOld Also known as ქართული
  • 哈萨克语 别名 қазақ тілі
  • 高棉语 又称ខ្មែរ、ខេមរភាសា、ភាសាខ្មែរ
  • KhmerAlphabet 又称ខ្មែរ,ខេមរភាសា, ភាសាខ្មែរ
  • Kyrgyz Also known as Кыргызча, Кыргыз тили
  • 北部库尔德语 又称库尔曼吉语、کورمانجی ,Kurmancî
  • 朝鲜语 别名 한국어 (韓國語), 조선어 (朝鮮語)
  • KoreanVertical 又称 한국어 (韓國語), 조선어 (朝鮮語)
  • 老挝语Also known as ພາສາລາວ
  • LaoAlphabet Also known as ພາສາລາວ
  • 拉丁语又称 latine、 lingua latina
  • 拉丁字母又称拉丁文、拉丁语 拉丁字母_又称拉丁文、拉丁语
  • 拉脱维亚文又名 latviešu valoda
  • 立陶宛文又名 lietuvių kalba
  • 卢森堡文 又称 Lëtzebuergesch
  • 马拉雅拉姆语 又称 മലയാളം
  • MalayalamAlphabet 也称为 മലയാളം
  • 马拉地语又称मराठी
  • MICR _又称 "磁性墨水字符识别"、"MICR 支票编码"。
  • 马其顿语 又称 македонски јазик
  • 马耳他语 Also known as Malti
  • 蒙古语 别名 монгол
  • 毛利语 又称 te reo Māori
  • 马来语 又称马来文,بهاس ملايو
  • Myanmar 又称缅甸语 ,ဗမာစာ
  • MyanmarAlphabet 又称缅甸语 ,ဗမာစာ
  • 尼泊尔语 又称नेपाली
  • 荷兰语 又称 Nederlands, Vlaams
  • 挪威语 又称 Norsk
  • 奥克西坦语 又称 occitan, lenga d'òc
  • 奥里雅语又称ଓଡ଼ିଆ
  • 奥里雅字母 又称 ଓଡ଼ିଆ
  • Panjabi Also known as ਪੰਜਾਬ, پنجابی
  • P.A.A.A.A.A.B.A.A.B.A.A.C.A.A.A.B.A.A.C.
  • 葡萄牙语 Also known as português
  • 普什图语 别名 پښتو
  • 克丘亚语 又称 Runa Simi、Kichwa
  • 罗马尼亚文 又称 limba română
  • 俄语 别名 русский язык
  • 梵文 别名 संस्कृतम्
  • 僧伽罗语 又称සිංහල
  • 僧伽罗语字母又称සිංහල
  • 斯洛伐克语 又称 slovenčina、slovenský jazyk
  • SlovakFraktur 也称为 slovenčina, slovenský jazyk
  • 斯洛文尼亚语亦称 slovenski jezik、slovenščina
  • 信德语又称सिन्धी, سنڌي، سندھی
  • 西班牙语 又称español、castellan
  • 旧西班牙语 _亦称西班牙语、斯泰德兰语___
  • 阿尔巴尼亚语 亦称 gjuha shqipe
  • 塞尔维亚文 别名 српски језик
  • 塞尔维亚文Also known as српски језик
  • 巽他语 别名 Basa Sunda
  • 斯瓦希里语又称斯瓦希里语____
  • 瑞典语 又称 Svenska
  • 叙利亚文又称叙利亚文、叙利亚阿拉姆文、慷 慨 ܢܫܐ ܣܘܪܝܝܐ, Leššānā Suryāyā
  • SyriacAlphabet 又称叙利亚文、叙利亚阿拉姆语、弁ܫܢܐ ܣܘܪܝܝܐ, Leššānā Suryāyā
  • 泰米尔文又称 "தமிழ்
  • 淡米尔字母又称 "தமிழ்
  • 鞑靼文又称鞑靼文、鞑靼电信 தமிழ
  • 泰卢固语又称తెలుగు
  • TeluguAlphabet 也称为 తెలుగు
  • 塔吉克语 Also known as тоҷикӣ, toğikī, تاجیکی
  • 塔加拉族语又称 Wikang Tagalog, ᜏᜒᜃᜅ᜔ ᜆᜄᜎᜓᜄ᜔
  • 泰语又称ไทย
  • ThaanaAlphabet 又称 Taana , Tāna , ާނަ
  • 泰文字母 _别名 ↪Loทย
  • 藏文字母 又称藏文标准、藏文、中央ཡིག་
  • Tigrinya _又称 ትግ ⧏41⧐ 藏语
  • 汤加语 又称 faka Tonga
  • 土耳其语 又称 Türkçe
  • 维吾尔语 别名 Uyƣurqə, ئۇيغۇرچە
  • 乌克兰语 又称 українська мова
  • 乌尔都语 又名 اردو
  • 乌兹别克语 别名:O'zbek、Ўзбек、أۇزب≠
  • UzbekCyrillic Also known as O'zbek, Ўзбек, أۇزبېك
  • 越南语又称Tiếng Việt
  • 越南语字母又名Tiếng Việt
  • 意第绪语 又名ייִדיש

  • Yoruba 也称为Yorùbá

示例:阿拉伯语 OCR (+ 更多)

在下面的示例中,我们将展示如何扫描阿拉伯文文档。

PM> Install-Package IronOcr.Languages.Arabic
阿拉伯语 C# OCR
:path=/static-assets/ocr/content-code-examples/tutorials/how-to-read-text-from-an-image-in-csharp-net-6.cs
// PM> Install IronOcr.Languages.Arabic
using IronOcr;

IronTesseract ocr = new IronTesseract();
ocr.Language = OcrLanguage.Arabic;

using OcrInput input = new OcrInput();
input.LoadImageFrame("img/arabic.gif", 1);
// add image filters if needed
// In this case, even thought input is very low quality
// IronTesseract can read what conventional Tesseract cannot.

OcrResult result = ocr.Read(input);

// Console can't print Arabic on Windows easily.
// Let's save to disk instead.
result.SaveAsTextFile("arabic.txt");
' PM> Install IronOcr.Languages.Arabic
Imports IronOcr

Private ocr As New IronTesseract()
ocr.Language = OcrLanguage.Arabic

Using input As New OcrInput()
	input.LoadImageFrame("img/arabic.gif", 1)
	' add image filters if needed
	' In this case, even thought input is very low quality
	' IronTesseract can read what conventional Tesseract cannot.
	
	Dim result As OcrResult = ocr.Read(input)
	
	' Console can't print Arabic on Windows easily.
	' Let's save to disk instead.
	result.SaveAsTextFile("arabic.txt")
End Using
VB   C#

示例:在同一文档中使用一种以上语言进行 OCR 识别。

在下面的示例中,我们将展示如何对同一文档进行多语言 OCR 扫描。

这其实很常见,例如,中文文档可能包含英文单词和 Urls。

PM> Install-Package IronOcr.Languages.ChineseSimplified
:path=/static-assets/ocr/content-code-examples/tutorials/how-to-read-text-from-an-image-in-csharp-net-7.cs
using IronOcr;

IronTesseract ocr = new IronTesseract();
ocr.Language = OcrLanguage.ChineseSimplified;

// We can add any number of languages.
ocr.AddSecondaryLanguage(OcrLanguage.English);
// Optionally add custom tesseract .traineddata files by specifying a file path

using OcrInput input = new OcrInput();
input.LoadImage("img/MultiLanguage.jpeg");
OcrResult result = ocr.Read(input);
result.SaveAsTextFile("MultiLanguage.txt");
Imports IronOcr

Private ocr As New IronTesseract()
ocr.Language = OcrLanguage.ChineseSimplified

' We can add any number of languages.
ocr.AddSecondaryLanguage(OcrLanguage.English)
' Optionally add custom tesseract .traineddata files by specifying a file path

Using input As New OcrInput()
	input.LoadImage("img/MultiLanguage.jpeg")
	Dim result As OcrResult = ocr.Read(input)
	result.SaveAsTextFile("MultiLanguage.txt")
End Using
VB   C#

多页文件

IronOcr 可以将多个页面/图像合并为一个 OcrResult。当文档是由多个图像制作而成的时候,这个功能就非常有用了。稍后我们将看到,IronTesseract 的这一特殊功能对于从 OCR 输入生成可搜索的 PDF 和 HTML 文件非常有用。

IronOcr 可以将图像、TIFF 框架和 PDF 页面 "混合匹配 "到一个 OCR 输入中。

:path=/static-assets/ocr/content-code-examples/tutorials/how-to-read-text-from-an-image-in-csharp-net-8.cs
using IronOcr;

IronTesseract ocr = new IronTesseract();

using OcrInput input = new OcrInput();
input.LoadImage("image1.jpeg");
input.LoadImage("image2.png");
var pageindices = new int[] { 1, 2 };
input.LoadImageFrames("image3.gif", pageindices);

OcrResult result = ocr.Read(input);

Console.WriteLine($"{result.Pages.Length} Pages"); // 3 Pages
Imports IronOcr

Private ocr As New IronTesseract()

Private OcrInput As using
input.LoadImage("image1.jpeg")
input.LoadImage("image2.png")
Dim pageindices = New Integer() { 1, 2 }
input.LoadImageFrames("image3.gif", pageindices)

Dim result As OcrResult = ocr.Read(input)

Console.WriteLine($"{result.Pages.Length} Pages") ' 3 Pages
VB   C#

我们还可以轻松地对 TIFF 文件的每一页进行 OCR 识别。

:path=/static-assets/ocr/content-code-examples/tutorials/how-to-read-text-from-an-image-in-csharp-net-9.cs
using IronOcr;

IronTesseract ocr = new IronTesseract();

using OcrInput input = new OcrInput();
var pageindices = new int[] { 1, 2 };
input.LoadImageFrames("MultiFrame.Tiff", pageindices);
OcrResult result = ocr.Read(input);

Console.WriteLine(result.Text);
Console.WriteLine($"{result.Pages.Length} Pages");
// 1 page for every frame (page) in the TIFF
Imports IronOcr

Private ocr As New IronTesseract()

Private OcrInput As using
Private pageindices = New Integer() { 1, 2 }
input.LoadImageFrames("MultiFrame.Tiff", pageindices)
Dim result As OcrResult = ocr.Read(input)

Console.WriteLine(result.Text)
Console.WriteLine($"{result.Pages.Length} Pages")
' 1 page for every frame (page) in the TIFF
VB   C#
:path=/static-assets/ocr/content-code-examples/tutorials/how-to-read-text-from-an-image-in-csharp-net-10.cs
using IronOcr;

IronTesseract ocr = new IronTesseract();
using OcrInput input = new OcrInput();
input.LoadPdf("example.pdf", Password: "password");
// We can also select specific PDF page numbers to OCR

OcrResult result = ocr.Read(input);

Console.WriteLine(result.Text);
Console.WriteLine($"{result.Pages.Length} Pages");
// 1 page for every page of the PDF
Imports IronOcr

Private ocr As New IronTesseract()
Private OcrInput As using
input.LoadPdf("example.pdf", Password:= "password")
' We can also select specific PDF page numbers to OCR

Dim result As OcrResult = ocr.Read(input)

Console.WriteLine(result.Text)
Console.WriteLine($"{result.Pages.Length} Pages")
' 1 page for every page of the PDF
VB   C#

可搜索的 PDF 文件

在 C# 和 VB.NET 中将 OCR 结果导出为可搜索的 PDF 是 IronOCR 的一项常用功能。这确实有助于数据库人口、搜索引擎优化和 PDF 可用性方面的企业和政府工作。

:path=/static-assets/ocr/content-code-examples/tutorials/how-to-read-text-from-an-image-in-csharp-net-11.cs
using IronOcr;

IronTesseract ocr = new IronTesseract();

using OcrInput input = new OcrInput();
input.Title = "Quarterly Report";
input.LoadImage("image1.jpeg");
input.LoadImage("image2.png");
var pageindices = new int[] { 1, 2 };
input.LoadImageFrames("image3.gif", pageindices);

OcrResult result = ocr.Read(input);
result.SaveAsSearchablePdf("searchable.pdf");
Imports IronOcr

Private ocr As New IronTesseract()

Private OcrInput As using
input.Title = "Quarterly Report"
input.LoadImage("image1.jpeg")
input.LoadImage("image2.png")
Dim pageindices = New Integer() { 1, 2 }
input.LoadImageFrames("image3.gif", pageindices)

Dim result As OcrResult = ocr.Read(input)
result.SaveAsSearchablePdf("searchable.pdf")
VB   C#

另一个 OCR 技巧是将现有 PDF 文档转换为可搜索文档。

:path=/static-assets/ocr/content-code-examples/tutorials/how-to-read-text-from-an-image-in-csharp-net-12.cs
using IronOcr;

IronTesseract ocr = new IronTesseract();

using OcrInput input = new OcrInput();
input.Title = "Pdf Metadata Name";
input.LoadPdf("example.pdf", Password: "password");
OcrResult result = ocr.Read(input);
result.SaveAsSearchablePdf("searchable.pdf");
Imports IronOcr

Private ocr As New IronTesseract()

Private OcrInput As using
input.Title = "Pdf Metadata Name"
input.LoadPdf("example.pdf", Password:= "password")
Dim result As OcrResult = ocr.Read(input)
result.SaveAsSearchablePdf("searchable.pdf")
VB   C#

使用 IronTesseract 将一页或多页的 TIFF 文件转换为可搜索的 PDF 文件也是如此。

:path=/static-assets/ocr/content-code-examples/tutorials/how-to-read-text-from-an-image-in-csharp-net-13.cs
using IronOcr;

IronTesseract ocr = new IronTesseract();
using OcrInput input = new OcrInput();
input.Title = "Pdf Title";
var pageindices = new int[] { 1, 2 };
input.LoadImageFrames("example.tiff", pageindices);
OcrResult result = ocr.Read(input);
result.SaveAsSearchablePdf("searchable.pdf");
Imports IronOcr

Private ocr As New IronTesseract()
Private OcrInput As using
input.Title = "Pdf Title"
Dim pageindices = New Integer() { 1, 2 }
input.LoadImageFrames("example.tiff", pageindices)
Dim result As OcrResult = ocr.Read(input)
result.SaveAsSearchablePdf("searchable.pdf")
VB   C#

导出 Hocr HTML

我们同样可以将 OCR 结果文档导出为 Hocr HTML。这是一个 XML 文档,可以用 XML 阅读器进行解析,也可以标记成视觉上吸引人的 HTML。

这可以在一定程度上实现 PDF 到 HTMLTIFF 到 HTML 的转换。

:path=/static-assets/ocr/content-code-examples/tutorials/how-to-read-text-from-an-image-in-csharp-net-14.cs
using IronOcr;

IronTesseract ocr = new IronTesseract();

using OcrInput input = new OcrInput();
input.Title = "Html Title";

// Add more content as required...
input.LoadImage("image2.jpeg");
input.LoadPdf("example.pdf",Password: "password");
var pageindices = new int[] { 1, 2 };
input.LoadImageFrames("example.tiff", pageindices);

OcrResult result = ocr.Read(input);
result.SaveAsHocrFile("hocr.html");
Imports IronOcr

Private ocr As New IronTesseract()

Private OcrInput As using
input.Title = "Html Title"

' Add more content as required...
input.LoadImage("image2.jpeg")
input.LoadPdf("example.pdf",Password:= "password")
Dim pageindices = New Integer() { 1, 2 }
input.LoadImageFrames("example.tiff", pageindices)

Dim result As OcrResult = ocr.Read(input)
result.SaveAsHocrFile("hocr.html")
VB   C#

在 OCR 文档中读取条形码

与传统的魔方相比,IronOCR 还有一个独特的优势,那就是它还能读取条形码和 QR 码;

:path=/static-assets/ocr/content-code-examples/tutorials/how-to-read-text-from-an-image-in-csharp-net-15.cs
using IronOcr;

IronTesseract ocr = new IronTesseract();

ocr.Configuration.ReadBarCodes = true;

using OcrInput input = new OcrInput();
input.LoadImage("img/Barcode.png");

OcrResult result = ocr.Read(input);

foreach (var barcode in result.Barcodes)
{
    Console.WriteLine(barcode.Value);
    // type and location properties also exposed
}
Imports IronOcr

Private ocr As New IronTesseract()

ocr.Configuration.ReadBarCodes = True

Using input As New OcrInput()
	input.LoadImage("img/Barcode.png")
	
	Dim result As OcrResult = ocr.Read(input)
	
	For Each barcode In result.Barcodes
		Console.WriteLine(barcode.Value)
		' type and location properties also exposed
	Next barcode
End Using
VB   C#

详细了解图像到文本的 OCR 结果

本教程的最后一个内容是 OCR 结果对象。当我们读取 OCR 时,我们通常只希望输出文本,但 IronOCR 实际上包含了大量信息,这些信息可能对高级开发人员有用。

在一个 OCR 结果对象中,我们有一个可以迭代的页面集合。在每个页面中,我们可以找到条形码、功率图、文本行、单词和字符。

事实上,每个对象都包含:位置、X 坐标、Y 坐标、宽度和高度、可检查的相关图像、字体名称、字体大小、文本的书写方向、文本的旋转以及 IronOCR 对特定单词、行或段落的统计置信度。

总之,这允许开发人员发挥创造力,以他们选择的任何方式使用 OCR 数据来检查和输出信息。

我们还可以将.NET OCR Results 对象中的任何元素(如段落、单词或条形码)作为图像或 BitMap 来处理和导出。

:path=/static-assets/ocr/content-code-examples/tutorials/how-to-read-text-from-an-image-in-csharp-net-16.cs
using IronOcr;
using IronSoftware.Drawing;

// We can delve deep into OCR results as an object model of Pages, Barcodes, Paragraphs, Lines, Words and Characters
// This allows us to explore, export and draw OCR content using other APIs

IronTesseract ocr = new IronTesseract();
ocr.Configuration.ReadBarCodes = true;

using OcrInput input = new OcrInput();
var pageindices = new int[] { 1, 2 };
input.LoadImageFrames(@"img\Potter.tiff", pageindices);

OcrResult result = ocr.Read(input);

foreach (var page in result.Pages)
{
    // Page object
    int pageNumber = page.PageNumber;
    string pageText = page.Text;
    int pageWordCount = page.WordCount;

    // null if we don't set Ocr.Configuration.ReadBarCodes = true;
    OcrResult.Barcode[] barcodes = page.Barcodes;

    AnyBitmap pageImage = page.ToBitmap(input);
    System.Drawing.Bitmap pageImageLegacy = page.ToBitmap(input);
    int pageWidth = page.Width;
    int pageHeight = page.Height;

    foreach (var paragraph in page.Paragraphs)
    {
        // Pages -> Paragraphs
        int paragraphNumber = paragraph.ParagraphNumber;
        String paragraphText = paragraph.Text;
        System.Drawing.Bitmap paragraphImage = paragraph.ToBitmap(input);
        int paragraphXLocation = paragraph.X;
        int paragraphYLocation = paragraph.Y;
        int paragraphWidth = paragraph.Width;
        int paragraphHeight = paragraph.Height;
        double paragraphOcrAccuracy = paragraph.Confidence;
        var paragraphTextDirection = paragraph.TextDirection;

        foreach (var line in paragraph.Lines)
        {
            // Pages -> Paragraphs -> Lines
            int lineNumber = line.LineNumber;
            String lineText = line.Text;
            AnyBitmap lineImage = line.ToBitmap(input);
            System.Drawing.Bitmap lineImageLegacy = line.ToBitmap(input);
            int lineXLocation = line.X;
            int lineYLocation = line.Y;
            int lineWidth = line.Width;
            int lineHeight = line.Height;
            double lineOcrAccuracy = line.Confidence;
            double lineSkew = line.BaselineAngle;
            double lineOffset = line.BaselineOffset;

            foreach (var word in line.Words)
            {
                // Pages -> Paragraphs -> Lines -> Words
                int wordNumber = word.WordNumber;
                String wordText = word.Text;
                AnyBitmap wordImage = word.ToBitmap(input);
                System.Drawing.Image wordImageLegacy = word.ToBitmap(input);
                int wordXLocation = word.X;
                int wordYLocation = word.Y;
                int wordWidth = word.Width;
                int wordHeight = word.Height;
                double wordOcrAccuracy = word.Confidence;

                if (word.Font != null)
                {
                    // Word.Font is only set when using Tesseract Engine Modes rather than LTSM
                    String fontName = word.Font.FontName;
                    double fontSize = word.Font.FontSize;
                    bool isBold = word.Font.IsBold;
                    bool isFixedWidth = word.Font.IsFixedWidth;
                    bool isItalic = word.Font.IsItalic;
                    bool isSerif = word.Font.IsSerif;
                    bool isUnderlined = word.Font.IsUnderlined;
                    bool fontIsCaligraphic = word.Font.IsCaligraphic;
                }

                foreach (var character in word.Characters)
                {
                    // Pages -> Paragraphs -> Lines -> Words -> Characters
                    int characterNumber = character.CharacterNumber;
                    String characterText = character.Text;
                    AnyBitmap characterImage = character.ToBitmap(input);
                    System.Drawing.Bitmap characterImageLegacy = character.ToBitmap(input);
                    int characterXLocation = character.X;
                    int characterYLocation = character.Y;
                    int characterWidth = character.Width;
                    int characterHeight = character.Height;
                    double characterOcrAccuracy = character.Confidence;

                    // Output alternative symbols choices and their probability.
                    // Very useful for spell checking
                    OcrResult.Choice[] characterChoices = character.Choices;
                }
            }
        }
    }
}
Imports IronOcr
Imports IronSoftware.Drawing

' We can delve deep into OCR results as an object model of Pages, Barcodes, Paragraphs, Lines, Words and Characters
' This allows us to explore, export and draw OCR content using other APIs

Private ocr As New IronTesseract()
ocr.Configuration.ReadBarCodes = True

Using input As New OcrInput()
	Dim pageindices = New Integer() { 1, 2 }
	input.LoadImageFrames("img\Potter.tiff", pageindices)
	
	Dim result As OcrResult = ocr.Read(input)
	
	For Each page In result.Pages
		' Page object
		Dim pageNumber As Integer = page.PageNumber
		Dim pageText As String = page.Text
		Dim pageWordCount As Integer = page.WordCount
	
		' null if we don't set Ocr.Configuration.ReadBarCodes = true;
		Dim barcodes() As OcrResult.Barcode = page.Barcodes
	
		Dim pageImage As AnyBitmap = page.ToBitmap(input)
		Dim pageImageLegacy As System.Drawing.Bitmap = page.ToBitmap(input)
		Dim pageWidth As Integer = page.Width
		Dim pageHeight As Integer = page.Height
	
		For Each paragraph In page.Paragraphs
			' Pages -> Paragraphs
			Dim paragraphNumber As Integer = paragraph.ParagraphNumber
			Dim paragraphText As String = paragraph.Text
			Dim paragraphImage As System.Drawing.Bitmap = paragraph.ToBitmap(input)
			Dim paragraphXLocation As Integer = paragraph.X
			Dim paragraphYLocation As Integer = paragraph.Y
			Dim paragraphWidth As Integer = paragraph.Width
			Dim paragraphHeight As Integer = paragraph.Height
			Dim paragraphOcrAccuracy As Double = paragraph.Confidence
			Dim paragraphTextDirection = paragraph.TextDirection
	
			For Each line In paragraph.Lines
				' Pages -> Paragraphs -> Lines
				Dim lineNumber As Integer = line.LineNumber
				Dim lineText As String = line.Text
				Dim lineImage As AnyBitmap = line.ToBitmap(input)
				Dim lineImageLegacy As System.Drawing.Bitmap = line.ToBitmap(input)
				Dim lineXLocation As Integer = line.X
				Dim lineYLocation As Integer = line.Y
				Dim lineWidth As Integer = line.Width
				Dim lineHeight As Integer = line.Height
				Dim lineOcrAccuracy As Double = line.Confidence
				Dim lineSkew As Double = line.BaselineAngle
				Dim lineOffset As Double = line.BaselineOffset
	
				For Each word In line.Words
					' Pages -> Paragraphs -> Lines -> Words
					Dim wordNumber As Integer = word.WordNumber
					Dim wordText As String = word.Text
					Dim wordImage As AnyBitmap = word.ToBitmap(input)
					Dim wordImageLegacy As System.Drawing.Image = word.ToBitmap(input)
					Dim wordXLocation As Integer = word.X
					Dim wordYLocation As Integer = word.Y
					Dim wordWidth As Integer = word.Width
					Dim wordHeight As Integer = word.Height
					Dim wordOcrAccuracy As Double = word.Confidence
	
					If word.Font IsNot Nothing Then
						' Word.Font is only set when using Tesseract Engine Modes rather than LTSM
						Dim fontName As String = word.Font.FontName
						Dim fontSize As Double = word.Font.FontSize
						Dim isBold As Boolean = word.Font.IsBold
						Dim isFixedWidth As Boolean = word.Font.IsFixedWidth
						Dim isItalic As Boolean = word.Font.IsItalic
						Dim isSerif As Boolean = word.Font.IsSerif
						Dim isUnderlined As Boolean = word.Font.IsUnderlined
						Dim fontIsCaligraphic As Boolean = word.Font.IsCaligraphic
					End If
	
					For Each character In word.Characters
						' Pages -> Paragraphs -> Lines -> Words -> Characters
						Dim characterNumber As Integer = character.CharacterNumber
						Dim characterText As String = character.Text
						Dim characterImage As AnyBitmap = character.ToBitmap(input)
						Dim characterImageLegacy As System.Drawing.Bitmap = character.ToBitmap(input)
						Dim characterXLocation As Integer = character.X
						Dim characterYLocation As Integer = character.Y
						Dim characterWidth As Integer = character.Width
						Dim characterHeight As Integer = character.Height
						Dim characterOcrAccuracy As Double = character.Confidence
	
						' Output alternative symbols choices and their probability.
						' Very useful for spell checking
						Dim characterChoices() As OcrResult.Choice = character.Choices
					Next character
				Next word
			Next line
		Next paragraph
	Next page
End Using
VB   C#

摘要

IronOCR 为 C# 开发人员提供了最先进的 魔方应用程序接口 我们所知道的任何平台上的

IronOCR 可部署在 Windows、Linux、Mac、Azure、AWS 和 Lambda 上,并支持 .NET Framework 项目以及 .NET Standard.NET Core

我们可以看到,如果我们向 IronOCR 输入一个不完美的文档,它可以准确地读取其内容,统计准确率约为 99%,即使该文档的格式很差、有偏差且存在数字噪声。

我们还可以读取 OCR 扫描中的条形码,甚至可以将 OCR 导出为 HTML 和可搜索 PDF。

这是 IronOCR 独有的功能,在标准 OCR 库或 vanilla Tesseract 中是找不到的。

向前迈进

要继续了解有关 IronOCR 的更多信息,我们建议您

源代码下载

您可能还会喜欢本节中的其他 .NET OCR 教程。