使用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进行Tesseract管理,因为它的独特之处在于:

  • 直接在纯.NET环境中即可使用
  • 不需要在您的机器上安装Tesseract。
  • 运行最新引擎:Tesseract 5(以及魔方 4 & 3)
  • 适用于任何 .NET 项目:.NET Framework 4.5 +、.NET Standard 2 + 和 .NET Core 2、3 和 5!
  • 具有比传统的Tesseract更高的准确性和速度。
  • 支持 Xamarin、Mono、Azure 和 Docker
  • 使用 NuGet 包管理复杂的 Tesseract 字典系统。
  • 支持PDFS、多帧Tiff和所有主要图像格式,无需配置。
  • 可以纠正低质量和倾斜的扫描,以从tesseract获得最佳结果。

    立即在您的项目中开始使用IronOCR,并享受免费试用。

    第一步:
    green arrow pointer

使用 C# 中的 Tesseract

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

: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 不是一个瞬间完成的过程。 在这种情况下,它是百分之百准确的。

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

IronOCR Tesseract 的 C# 高级用法

在大多数真实世界的使用情况中,开发者们通常希望为他们的项目获得最佳性能。 在这种情况下,我们建议您继续使用 OcrInput钢铁魔方 IronOcr 命名空间内的类。

OcrInput 允许您设置 OCR 作业的特定特性,例如:

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

    IronTesseract

  • 从数百种预包装的语言和语言变体中选择
  • 使用 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可以自动读取多页文档,例如TIFFs甚至从 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.Deskew()是一种安全且非常有效的过滤器。
  • 其次尝试 Input.DeNoise()修复大量数字噪音。

性能调优

OCR任务的速度最重要的因素实际上是输入图像的质量。 背景噪音越少,分辨率越高,最理想的目标分辨率约为200 dpi,将产生最快速和最准确的OCR结果。

然而,这并非必要,因为IronOCR擅长纠正不完美的文件。(虽然这很耗时,而且会导致 OCR 作业占用更多的 CPU 周期).

如果可能的话,选择数字噪声较少的输入图像格式,如TIFF或PNG,也可以比 有损 图像格式,如 JPEG。

图像滤镜

以下图像过滤器可以显著提高性能:

  • OcrInput.Rotate(双学位)** - 向顺时针方向旋转图像若干度。要逆时针旋转,请使用负数。
  • OcrInput.Binarize()** - 这个图像滤镜将每个像素变成黑色或白色,没有中间色。 可能提高OCR性能,用于文本与背景对比度非常低的情况。
  • OcrInput.ToGrayScale()** - 此图像滤镜将每个像素转换为灰度阴影。 不太可能提高OCR精度,但可以提高速度。
  • OcrInput.对比度()** - 自动增加对比度。 此过滤器通常能提高低对比度扫描中的OCR速度和准确性。
  • OcrInput.DeNoise()** - 去除数字噪声。此滤镜仅应在预期有噪声的情况下使用。
  • OcrInput.Invert()** - 反转每个颜色。 例如,白变黑:黑变白。
  • OcrInput.膨胀()** - 高级形态学。 Dilation 在图像中的对象边界处添加像素。 侵蚀的反义词
  • OcrInput.Erode()** - 高级形态学。 侵蚀 移除物体边界上的像素,与扩张相反
  • OcrInput.Deskew()** - 旋转图像,使其正面朝上并保持正交。 这对OCR非常有用,因为Tesseract对倾斜扫描的容忍度可以低至5度。
  • OcrInput.DeepCleanBackgroundNoise()** - 强大的背景噪音消除。 仅在已知文档背景噪声极端的情况下使用此过滤器,因为此过滤器也可能降低清晰文档的OCR精确度,并且非常耗费CPU。
  • OcrInput.EnhanceResolution - 增强低质量图像的分辨率。 此过滤器通常不需要,因为_OcrInput.MinimumDPI_和_OcrInput.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分支擅长读取图像的特定区域。

我们可能会使用 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_场景非常有用,适用于文件相似且一致的情况,如发票、收据、支票、表格、费用报销等。

ContentAreas(OCR 裁剪)读取 PDF 文件时也支持

国际语言

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

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

支持的语言包括:

  • 南非荷兰语
  • 阿姆哈拉语 亦称 አማርኛ
  • 阿拉伯语 也被称为 العربية
  • 阿拉伯字母 Also known as العربية
  • 亚美尼亚字母 也称为 Հայերեն
  • Assamese 也被称为 অসমীয়া
  • 阿塞拜疆语,又称为azərbaycan dili。

    阿塞拜疆塞尔维克语 也被称为 azərbaycan dili

  • 白俄罗斯语 亦称为беларуская мова
  • 孟加拉语(也称为Bangla,বাংলা)
  • 孟加拉字母 也被称为孟加拉语,বাংলা
  • 西藏标准语,也称为藏语,中央藏语 ཡིག་
  • Bosnian 又被称为bosanski jezik
  • 布列塔尼语 亦称为brezhoneg
  • Bulgarian 也被称为 български език
  • 加拿大原住民字母 也称为加拿大第一民族、加拿大土著人、加拿大原住民、因纽特人
  • 加泰罗尼亚语 Also known as català, valencià
  • 宿霧語(亦稱為比沙雅語、宾利沙雅语)
  • Czech 亦称为捷克语、čeština、český jazyk
  • CherokeeAlphabet,也被称为ᏣᎳᎩ ᎦᏬᏂᎯᏍᏗ,Tsalagi Gawonihisdi
  • Chinese Simplified 也称为中文(Zhōngwén), 汉语, 漢語_

    ChineseSimplifiedVertical Also known as 中文(Zhōngwén), 汉语, 漢語

  • ChineseTraditional 也被称为中文(Zhōngwén), 汉语, 漢語

    ChineseTraditionalVertical 也被称为 中文(Zhōngwén), 汉语, 漢語

  • Cherokee 也被称为 ᏣᎳᎩ ᎦᏬᏂᎯᏍᏗ, Tsalagi Gawonihisdi
  • 科西嘉语 又称为科西嘉语,科西嘉岛语
  • 威尔士语(又称为Cymraeg)
  • 西里尔字母 又称为西里尔文字
  • 丹麦语也称为丹斯克
  • DanishFraktur 也称为 dansk
  • 德语(又称为Deutsch)
  • GermanFraktur 也被称为 Deutsch

    DevanagariAlphabet Also known as Nagair,देवनागरी

  • Divehi 也被称为 ދިވެހި
  • Dzongkha 也被称为 རྫོང་ཁ
  • 希腊语 也称为 ελληνικά
  • 英语
  • MiddleEnglish 也被称为 English(公元 1100-1500 年)_
  • 世界语
  • 爱沙尼亚语 也被称为 eesti,eesti keel
  • 埃塞俄比亚字母 也被称为格尔兹,ግዕዝ,Gəʿəz
  • 巴斯克语 也称为euskara,euskera
  • 法罗语(又名føroyskt)
  • 波斯语(亦称为فارسی)
  • 菲律宾语(又称为菲律宾的国家语言,标准化的他加禄语)
  • 芬兰语,也被称为苏俄米语,苏俄门基里语。
  • 金融 也称为财务、数值和技术文件
  • 法语(也称为français,langue française)
  • FrakturAlphabet 也称为通用Fraktur,拉丁字母的书法风格
  • Frankish 也称为 Frenkisk,古弗兰克语
  • 中法语 也被称为 Moyen Français,中世纪法语(ca. 1400-1600 AD)
  • WesternFrisian(也被称为Frysk)
  • GeorgianAlphabet 也称为 ქართული
  • 苏格兰盖尔语,也被称为盖尔语。
  • 爱尔兰语(也称为Gaeilge)
  • 加利西亚语(又称为galego)
  • 古希腊语 也被称为 Ἑλληνική
  • 希腊字母 也被称为 ελληνικά
  • Gujarati 也称为 ગુજરાતી
  • GujaratiAlphabet 也被称为 ગુજરાતી
  • GurmukhiAlphabet 也被称为Gurmukhī, ਗੁਰਮੁਖੀ, Shahmukhi, گُرمُکھی‎, Sihk Script
  • 한글,也被称为朝鲜文字、韩文、朝鲜文。
  • HangulVerticalAlphabet也被称为韩国字母,한글,Hangeul,朝鲜字,hosŏn'gŭl
  • 汉简化字体也称为三韩,韩语
  • 汉简化垂直字母,也被称为Samhan,한어,韩语。
  • 韓語,又称三韩。
  • 漢傳統豎排字母表 又稱為三韓,한어,韓語
  • 海地克里奥尔语
  • 希伯来语 亦称为עברית
  • HebrewAlphabet Also known as 希伯来文
  • Hindi 也被称为 हिन्दी, हिंदी
  • 克罗地亚语(又称为 hrvatski jezik)
  • 匈牙利语(也称为马扎尔语)
  • 亚美尼亚语 也称为Հայերեն
  • 因纽特语 也称为ᐃᓄᒃᑎᑐᑦ
  • 印度尼西亚语(又称为印尼语)
  • 冰岛语 也称为Íslenska
  • 意大利语 又称为意大利语
  • ItalianOld也被称为italiano
  • 日本字母 也被称为 日本語(にほんご)
  • 日本垂直字母 也被称为日本语(にほんご)
  • 爪哇语 也被称为basa Jawa
  • 日本文,又称为日本語(にほんご)_
  • 日本垂直,也称为日本语(にほんご)_
  • 卡纳达语 也被称为 ಕನ್ನಡ
  • KannadaAlphabet 也被称为 ಕನ್ನಡ
  • 格鲁吉亚语 也称为 ქართული
  • 格鲁吉亚老字体(也称为ქართული)
  • 哈萨克语(又称қазақ тілі)

    Khmer 也被称为ខ្មែរ、ខេមរភាសា、ភាសាខ្មែរ

    KhmerAlphabet 也称为 ខ្មែរ, ខេមរភាសា, ភាសាខ្មែរ

  • 吉尔吉斯语 也被称为Кыргызча、Кыргыз тили
  • 北库尔德语 又称库尔曼吉语,کورمانجی,Kurmancî‎
  • 한국어(韓國語), 조선어(朝鮮語)_
  • KoreanVertical Also known as 韩国语(韓國語), 조선어(朝鮮語)

    Lao Also known as ພາສາລາວ

  • LaoAlphabet 也被称为 ພາສາລາວ
  • 拉丁语 也被称为 latine, lingua latina
  • 拉丁字母 也被称为拉丁文,拉丁语
  • Latvian(也被称为latviešu valoda)
  • 立陶宛语(又称为lietuvių kalba)
  • 卢森堡语(又称为Lëtzebuergesch)
  • Malayalam 又称为 മലയാളം
  • MalayalamAlphabet 也被称为 മലയാളം
  • Marathi 也称为मराठी
  • MICR(又称磁性墨水字符识别,MICR支票编码)
  • 马其顿语(又称为македонски јазик)
  • 马耳他语 亦称为 Malti
  • 蒙古语 又称为 монгол
  • 毛利语(也称为te reo Māori)
  • 马来语,也被称为巴哈萨马来语,بهاس ملايو‎
  • Myanmar 也称为缅甸语,ဗမာစာ
  • MyanmarAlphabet 也称为 Burmese,ဗမာစာ
  • 尼泊尔语(又称नेपाली)
  • 荷兰语(又称尼德兰语、佛兰芒语)
  • 挪威语(又称为Norsk)
  • 奥克语 又称为奥克语,lenga d'òc
  • 奥里亚语 也被称为 ଓଡ଼ିଆ

    OriyaAlphabet 也被称为 ଓଡ଼ିଆ

  • Panjabi 也被称为 ਪੰਜਾਬੀ, پنجابی‎
  • 波兰语(也被称为język polski,polszczyzna)
  • 葡萄牙语 也被称为 português
  • Pashto 也被称为 پښتو
  • Quechua 也称为Runa Simi,Kichwa
  • 罗马尼亚语又称为limba română
  • Russian 也被称为 русский язык
  • Sanskrit 也被称为 संस्कृतम्
  • Sinhala 也被称为 සිංහල
  • SinhalaAlphabet 也被称为 සිංහල
  • 斯洛伐克语(又称为slovenčina, slovenský jazyk)

    SlovakFraktur 也被称为slovenčina,slovenský jazyk

  • Slovene 也被称为斯洛文尼亚语,斯洛文尼亚斯奇纳
  • Sindhi 也被称为 सिन्धी, سنڌي، سندھی‎
  • 西班牙语 也被称为 español,castellano
  • 西班牙语又称为español,castellano。
  • 阿尔巴尼亚语,又称为gjuha shqipe。

    Also known as српски језик

    SerbianLatin Also known as српски језик

  • 巽他语 又称为巴萨巽他
  • 斯瓦希里语(又称基斯瓦希里语)
  • 瑞典语(又称为Svenska)
  • Syriac,也被称为Syrian、Syriac Aramaic、ܠܫܢܐ ܣܘܪܝܝܐ‎、Leššānā Suryāyā
  • Also known as Syrian, Syriac Aramaic, ܠܫܢܐ ܣܘܨܝܝܐ‎, Leššānā Suryāyā

    泰米尔语 也称为தமிழ்

  • TamilAlphabet 也被称为 தமிழ்
  • 也被称为татар теле,tatar tele
  • Telugu 也被称为 తెలుగు
  • TeluguAlphabet 也称为 తెలుగు
  • Tajik 也被称为 тоҷикӣ, toğikī, تاجیکی‎
  • Tagalog 也被称为Wikang Tagalog, ᜏᜒᜃᜅ᜔ ᜆᜄᜎᜓᜄ᜔
  • 泰语 Also known as ไทย
  • ThaanaAlphabet 也被称为 Taana,Tāna,ތާނަ‎
  • ThaiAlphabet Also known as ไทย

    TibetanAlphabet Also known as Tibetan Standard, Tibetan, Central ཡིག་

  • 提格利尼亚语 也被称为 ትግርኛ
  • 汤加(又名 faka Tonga)
  • 土耳其语 也被称为 Türkçe

    Uyghur 也称为Uyƣurqə, ئۇيغۇرچە‎

  • 乌克兰语 又称为українська мова
  • Urdu 也被称为 اردو
  • 乌兹别克 Also known as 乌兹别克, Ўзбек, أۇزبېك‎
  • UzbekCyrillic 亦称为 O‘zbek, Ўзбек, أۇزبېك‎
  • 越南语 也称为 Tiếng Việt
  • VietnameseAlphabet 也称为 Tiếng Việt
  • Also known as ייִדיש
  • Yoruba 也被称为约鲁巴语

示例:阿拉伯语的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扫描到同一个文档中。

这其实很常见,例如一个中文文件可能包含英文单词和网址。

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相比传统的tesseract有一个独特的额外优势,它还能读取条形码和二维码;

: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坐标; 宽度和高度; 其中包含可以检查的图像; a font name; 字体大小;文本的书写方向; 文本的旋转; 以及IronOCR对那个特定单词、行或段落的统计置信度。

简而言之,这使得开发者可以以他们选择的任何方式创造性地处理和导出 OCR 数据。

我们还可以处理并从.NET OCR结果对象中导出任何元素,例如段落、单词或条形码,作为图像或位图。

: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);
    double pageWidth = page.Width;
    double 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 Double = page.Width
		Dim pageHeight As Double = 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库或普通Tesseract中找不到这个功能。

向前发展

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

源代码下载