使用 C# OCR 从图像中读取文本
在本教程中,我们将学习如何用 C# 和其他 .NET 语言将图像转换为文本。
如何用 C# 将图像转换为文本
- 下载 OCR 图像到文本 IronOCR 库
- 调整裁剪区域以读取图像的部分内容
- 通过语言包使用多达 125 种国际语言
- 将 OCR 扫描结果导出为文本或可搜索 PDF 文件
在 .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 的最佳效果。
开始在您的项目中使用IronPDF,并立即获取免费试用。
查看 IronOCR 上 Nuget 用于快速安装和部署。它有超过800万次下载,正在使用C#改变OCR。
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)
这使得以下文字的准确率达到 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% 的。
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)
即使是中等质量的扫描,我们也可以使用它,准确率达到 100%。
正如您所看到的,阅读文本 (并可选择条形码) 从扫描图像(如 TIFF)中提取数据非常容易。
这项 OCR 工作的准确率为 100%。
对于现实世界中的文档来说,OCR 并不是一门完美的科学,但 IronTesseract 却做到了这一点。
你还会注意到,IronOCR 可以自动读取多页文档,如 TIFF,甚至是 从 PDF 文档中提取文本 自动。
示例:低质量扫描
现在,我们将尝试以较低的 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)
不添加 `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.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
这一结果的准确率为99.8%,而基准准确率为100%,但速度快了 35%。
阅读图像的裁剪区域
从下面的代码示例中可以看出,Iron 的 Tesseract OCR fork 擅长读取图像的特定区域。
我们可以使用 System.Drawing.Rectangle
以像素为单位指定要读取的图像的确切区域。
当我们在处理填写的标准化表格时,只有特定区域的文字会随情况而变化,这就非常有用了。
示例:扫描页面的一个区域
我们可以使用 System.Drawing.Rectangle
来指定读取文档的区域。测量单位始终是像素。
我们将看到,这不仅能提高速度,还能避免读取不必要的文本。在本例中,我们将从标准化文档的中心区域读取学生姓名。
: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)
这样,速度提高了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
: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
示例:在同一文档中使用一种以上语言进行 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
多页文件
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
我们还可以轻松地对 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
: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
可搜索的 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")
另一个 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")
使用 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")
导出 Hocr HTML
我们同样可以将 OCR 结果文档导出为 Hocr HTML。这是一个 XML 文档,可以用 XML 阅读器进行解析,也可以标记成视觉上吸引人的 HTML。
这可以在一定程度上实现 PDF 到 HTML 和 TIFF 到 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")
在 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
详细了解图像到文本的 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);
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
摘要
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 的更多信息,我们建议您
- 开始使用我们的 C# Tesseract OCR 快速入门 指导。
- 探索 C# 和 VB 代码示例
- 深入阅读 MSDN 风格 API 参考.
源代码下载
您可能还会喜欢本节中的其他 .NET OCR 教程。