C# Tesseract OCR 示例

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

吉姆·贝克

Tesseract 是一款出色的学术 OCR (光学字符识别) 开发人员可以免费使用几乎所有用途的库。

C# 有幸拥有最精确、最快速的 Tesseract 库之一。

IronOCR 通过 "IronTesseract "对 Google Tesseract 进行了扩展,这是一个本地 C# OCR 库,与免费的 Tesseract 库相比,稳定性更好,准确性更高。

本文比较并解释了为什么.NET开发人员强烈建议使用IronOCR IronTesseract 而不是普通的Tesseract。

C# Tesseract OCR

.NET OCR 使用代码示例 - 从 C&num 中的图像中提取文本;

使用 NuGet 包管理器将 IronOCR NuGet 包安装到 Visual Studio 解决方案中。

:path=/static-assets/ocr/content-code-examples/tutorials/c-sharp-tesseract-ocr-1.cs
using IronOcr;
using System;

var ocr = new IronTesseract();

// Hundreds of languages available
ocr.Language = OcrLanguage.English;

using var input = new OcrInput();
var pageindices = new int[] { 1, 2 };
input.LoadImageFrames(@"img\example.tiff", pageindices);
// input.DeNoise();  optional filter
// input.Deskew();   optional filter

OcrResult result = ocr.Read(input);
Console.WriteLine(result.Text);
// Explore the OcrResult using IntelliSense
Imports IronOcr
Imports System

Private ocr = New IronTesseract()

' Hundreds of languages available
ocr.Language = OcrLanguage.English

Dim input = New OcrInput()
Dim pageindices = New Integer() { 1, 2 }
input.LoadImageFrames("img\example.tiff", pageindices)
' input.DeNoise();  optional filter
' input.Deskew();   optional filter

Dim result As OcrResult = ocr.Read(input)
Console.WriteLine(result.Text)
' Explore the OcrResult using IntelliSense
VB   C#

安装选项

在 .NET 中使用 Tesseract Engine 进行 OCR

当使用 Tesseract Engine 时,我们大多数是在使用一个 C++ 库进行操作。

在 .NET 中进行 Interop 并不是很有趣,并且具有较差的跨平台和 Azure 兼容性。它要求我们选择应用程序的位数,这意味着我们可能只能部署到 32 或 64 位目标。

我们可能需要确保安装了 Visual C++ 运行时,甚至需要自己编译 Tesseract 以获得最新版本。免费的 C# 封装可能已经落后多年。

我们还要寻找、下载和管理我们可能不理解的 C++ DLL 和 EXE 文件,并在可能不允许它们运行的环境中部署它们。

通过使用 NuGet 包管理器,可以轻松安装并使用光学字符识别(OCR)从图像和 PDF 文件中提取文本。

用于 C&num 的 IronOCR 宇宙魔方;

有了 IronOCR,所有 Tesseract 的安装都完全通过 NuGet 软件包管理器完成。

Install-Package IronOcr

无需安装本地 dll 或 exes。一切都由一个 .NET 组件库处理。

整个应用程序接口是在本地 .NET 中使用 Tesseract 的简单 C# 应用程序接口。

它支持这类 Visual Studio 项目在 C# 中添加光学字符识别功能:

  • .NET Framework 4.6.2 及以上版本
  • .NET Standard 2.0 及以上版本 (包括 3.x、.NET 5、6、7 和 8)

  • .NET Core 2.0 及以上版本 (包括 3.x、.NET 5、6、7 和 8)

更新和维护

使用 C&num 的谷歌魔方;

Tesseract 5 的最新版本从未设计用于在 Windows 上编译。

免费安装C#版Tesseract 5需要手动修改和编译Windows版LeptonicaTesseract。目前,MinGW 交叉编译链还不能成功生成 Windows 互操作二进制文件。

此外,GitHub 上的免费 C# API 封装程序可能已经过时多年或不兼容。

IronOCR Tesseract for .NET

IronOCR 具有众多优势,包括用户友好的 API,可无缝集成到应用程序中。它支持 JPEG、PNG、TIFF 和 PDF 等多种图像格式,并提供自动图像预处理等高级功能。此外,它还有一个专门的团队提供商业支持和更新。

开箱即可在 Windows、macOS、Linux、Azure、AWS、Lambda、Mono 和 Xamarin Mac 上运行 Tesseract 5,几乎无需配置。无需管理本地二进制文件。框架与核心兼容。

除了做得很好之外,没有什么可说的了。

Google OCR

谷歌云 OCR (光学字符识别) 是谷歌云平台提供的一项服务 (GCP) 它允许开发人员使用机器学习算法从图像和扫描文件中提取文本。

准确性

在 .NET 项目中使用 Google Tesseract

Tesseract 作为一个库是专为完美文档而设计的,在完美文档中,机器可以将高分辨率的文本打印到屏幕上,然后进行阅读。这就是 Tesseract 擅长阅读完美文档的原因。

问题是,在现实世界中,我们并不具备这种能力。如果 Tesseract 遇到旋转、倾斜、低 DPI、扫描或有背景噪音的图像,那么 Tesseract 几乎不可能从该图像中获取数据。此外,Tesseract 还需要很长时间来处理该文档,然后才会向您反馈无意义的信息。

Tesseract 无法很好地读取肉眼很容易读取的简单文档。

Tesseract 是一个免费库,是阅读标准字体的完美文本的最佳选择。

要使用 Tesseract,我们需要对扫描或拍摄的文档进行图像预处理,因为这些文档的图像在数字上并不完美,比如屏幕截图。这通常需要使用 Photoshop 批次脚本或高级 ImageMagick 来完成。

一般来说,这需要根据您要处理的每类文档的具体情况来开发,可能需要数周的开发时间。

.NET 项目中的 IronOCR Tesseract

IronOCR 可以解决这个令人头疼的问题。用户只需极少的配置,就能达到99.8%-100%的准确率。

:path=/static-assets/ocr/content-code-examples/tutorials/c-sharp-tesseract-ocr-2.cs
using IronOcr;
using System;

var ocr = new IronTesseract();
using var input = new OcrInput();
var pageindices = new int[] { 1, 2 };
input.LoadImageFrames(@"img\example.tiff", pageindices);
input.DeNoise();  //fixes digital noise
input.Deskew();   //fixes rotation and perspective

// there are dozens more filters, but most users wont need them
OcrResult result = ocr.Read(input);
Console.WriteLine(result.Text);
Imports IronOcr
Imports System

Private ocr = New IronTesseract()
Private input = New OcrInput()
Private pageindices = New Integer() { 1, 2 }
input.LoadImageFrames("img\example.tiff", pageindices)
input.DeNoise() 'fixes digital noise
input.Deskew() 'fixes rotation and perspective

' there are dozens more filters, but most users wont need them
Dim result As OcrResult = ocr.Read(input)
Console.WriteLine(result.Text)
VB   C#

图像兼容性

.NET 中的 Google Tesseract

只接受 Leptonica PIX 图像格式,在 C# 中它是一个 IntPtr C++ 对象。PIX 对象不是托管内存,如果在 C# 中不小心处理,就会导致内存泄漏。

_Leptonica_具有良好的一般图像兼容性,但会抛出许多控制台警告和错误。TIFF 文件存在已知问题,对 PDF OCR 的支持也很有限。

IronOCR Tesseract for .NET

图像由内存管理。支持 PDF 和 Tiff。系统。每种文件格式都包含绘图、流和字节阵列。

广泛的图像支持

  • PDF 文档
  • PDF 页面
  • 多帧 TIFF 文件
  • jpeg 和 jpeg2000
  • GIF
  • PNG
  • BMP
  • WBMP
  • 系统.绘图.图像
  • 系统.绘图.位图
  • 图像的`System.IO.Streams
  • 二进制图像数据 (字节 [])

  • 还有更多...

OCR 图像兼容性代码示例

:path=/static-assets/ocr/content-code-examples/tutorials/c-sharp-tesseract-ocr-3.cs
using IronOcr;
using System;

var ocr = new IronTesseract();
using var input = new OcrInput();
input.LoadPdf("example.pdf", Password: "password");
var pageindices = new int[] { 1, 2 };
input.LoadImageFrames("multi-frame.tiff", pageindices);
input.LoadImage("image1.png");
input.LoadImage("image2.jpeg");
//... many more

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

Private ocr = New IronTesseract()
Private input = New OcrInput()
input.LoadPdf("example.pdf", Password:= "password")
Dim pageindices = New Integer() { 1, 2 }
input.LoadImageFrames("multi-frame.tiff", pageindices)
input.LoadImage("image1.png")
input.LoadImage("image2.jpeg")
'... many more

Dim result = ocr.Read(input)
Console.WriteLine(result.Text)
VB   C#

性能

免费谷歌魔方

如果调整得当,并使用 Photoshop 或 ImageMagick 对输入图像进行预处理,Google Tesseract 可以快速、准确地生成结果。

你会发现,网上的大多数 Tesseract 例子实际上都来自高分辨率的屏幕截图,没有数字噪音,Tesseract 在设计上可以很好地处理这些字体。

Tesseract 自己的文档指出,输入图像的采样率应为 300DPI 或更高,这样才能有效进行 OCR 识别。

IronOCR 宇宙魔方图书馆

IronOcr .NET Tesseract动态链接库可准确、快速地处理大多数图像。我们采用了多线程技术,以利用目前大多数机器使用的多核处理器。

即使是低分辨率的图像,在您的程序中一般也能以很高的精确度运行。无需 PhotoShop。

开发人员通常只需少量配置就能达到 99% 以上的准确率--这与当前的机器学习网络应用程序接口不相上下,但却没有持续成本、安全风险和带宽问题。

速度很快,但只需稍加编码即可提高。

性能调整示例

:path=/static-assets/ocr/content-code-examples/tutorials/c-sharp-tesseract-ocr-4.cs
using IronOcr;
using System;

var ocr = new IronTesseract();

// Configure for speed.  35% faster and only 0.2% loss of accuracy
ocr.Configuration.BlackListCharacters = "~`$#^*_}{][|\\@¢©«»°±·×‑–—‘’“”•…′″€™←↑→↓↔⇄⇒∅∼≅≈≠≤≥≪≫⌁⌘○◔◑◕●☐☑☒☕☮☯☺♡⚓✓✰";
ocr.Configuration.PageSegmentationMode = TesseractPageSegmentationMode.Auto;
ocr.Configuration.ReadBarCodes = false;
ocr.Language = OcrLanguage.EnglishFast;

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

Private ocr = New IronTesseract()

' Configure for speed.  35% faster and only 0.2% loss of accuracy
ocr.Configuration.BlackListCharacters = "~`$#^*_}{][|\@¢©«»°±·×‑–—‘’“”•…′″€™←↑→↓↔⇄⇒∅∼≅≈≠≤≥≪≫⌁⌘○◔◑◕●☐☑☒☕☮☯☺♡⚓✓✰"
ocr.Configuration.PageSegmentationMode = TesseractPageSegmentationMode.Auto
ocr.Configuration.ReadBarCodes = False
ocr.Language = OcrLanguage.EnglishFast

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

应用程序接口

.NET 中的 Google Tesseract OCR

我们有 2 种自由选择:

  • 与互操作层一起工作 - GitHub 上的许多互操作层都已过时,存在未解决的问题、内存泄露和控制台警告。可能不支持 .NET Core 或标准。
  • ** 使用命令行 EXE***--难以部署,经常被病毒扫描程序和安全策略打断。

上述两种方法在 Web 应用程序、Azure、Mono、Xamarin、Linux、Docker 或 Mac 中都无法很好地发挥作用。

IronOCR Tesseract OCR Library for .NET

用于 Tesseract 的经过管理和测试的 .NET 库,名为 "IronTesseract"。

文档齐全,支持智能提示(IntelliSense)。

.NET中最简单的魔方 Hello World

:path=/static-assets/ocr/content-code-examples/tutorials/c-sharp-tesseract-ocr-5.cs
using IronOcr;

var text = new IronTesseract().Read("img.png").Text;
Imports IronOcr

Private text = (New IronTesseract()).Read("img.png").Text
VB   C#

由经验中位数超过 20 年的专业软件工程师积极开发和支持。

兼容性

Google Tesseract + Interop for .NET

如果您愿意查找依赖关系、从源代码构建或更新免费的 C# 互操作封装器,这可以在大多数平台上运行。这些资源可能与 .NET Core 或 .NET Standard 项目不完全兼容。

目前,我们还没有遇到任何合理而简单的方法,可以在没有 "IronTessseract "的情况下安全地安装LibTesseract5

IronOCR Tesseract .NET OCR 库

已通过 CI 单元测试,拥有运行所需的一切:

  • 桌面应用程序、
  • 控制台应用程序
  • 服务器进程
  • 网络应用程序和 MVC
  • JetBrains Rider
  • Xamarin Mac

关于

  • 视窗
  • 云计算
  • Linux
  • 多克
  • Mac
  • BSD 和 FreeBSD

.NET 支持

  • .NET Framework 4.6.2 及以上版本
  • .NET Core - 2.0 以上的所有有效版本
  • .NET Stanrdard - 2.0 以上的所有有效版本
  • 单核

  • Xamarin Mac

语言支持

谷歌魔方

Tesseract 词典以文件形式管理,必须从 https://github.com/tesseract-ocr/tessdata 克隆。这大约是 4 GB。

一些 Linux 发行版可以通过 apt-get 帮助管理 Tesseract 词典。

必须保持精确的文件夹结构,否则 Tesseract 将失效。

钢铁OCR 宇宙魔方

支持比 https://github.com/tesseract-ocr/tessdata 更多的语言,而且每种语言都可通过 NuGet 软件包管理器作为 NuGet 软件包进行管理,或轻松下载安装。

统一码语言示例

:path=/static-assets/ocr/content-code-examples/tutorials/c-sharp-tesseract-ocr-6.cs
using IronOcr;

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

using var input = new OcrInput();
var pageindices = new int[] { 1, 2 };
input.LoadImageFrames("img/arabic.gif", pageindices);

// Add image filters if needed
// In this case, even thought input is very low quality
// IronTesseract can read what conventional Tesseract cannot.

var result = ocr.Read(input);

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

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

Dim input = New OcrInput()
Dim pageindices = New Integer() { 1, 2 }
input.LoadImageFrames("img/arabic.gif", pageindices)

' Add image filters if needed
' In this case, even thought input is very low quality
' IronTesseract can read what conventional Tesseract cannot.

Dim result = ocr.Read(input)

' Console can't print Arabic on Windows easily.
' Let's save to disk instead.
result.SaveAsTextFile("arabic.txt")
VB   C#

多语言示例

OCR 还可以同时使用多种语言。这确实有助于在 Unicode 文档中获取英语元数据和 URL。

:path=/static-assets/ocr/content-code-examples/tutorials/c-sharp-tesseract-ocr-7.cs
using IronOcr;

// For the Chinese Language Pack:
// PM> Install IronOcr.Languages.ChineseSimplified

var ocr = new IronTesseract();
ocr.Language = OcrLanguage.ChineseSimplified;
ocr.AddSecondaryLanguage(OcrLanguage.English);

// We can add any number of languages
using var input = new OcrInput();
input.LoadPdf("multi-language.pdf");
var result = ocr.Read(input);
result.SaveAsTextFile("results.txt");
Imports IronOcr

' For the Chinese Language Pack:
' PM> Install IronOcr.Languages.ChineseSimplified

Private ocr = New IronTesseract()
ocr.Language = OcrLanguage.ChineseSimplified
ocr.AddSecondaryLanguage(OcrLanguage.English)

' We can add any number of languages
Dim input = New OcrInput()
input.LoadPdf("multi-language.pdf")
Dim result = ocr.Read(input)
result.SaveAsTextFile("results.txt")
VB   C#

还有什么

IronOCR Tesseract 还为 .NET 软件开发人员提供了其他功能。

  • 自动图像分析,针对常见错误配置 Tesseract
  • 图像到可搜索 PDF 的转换
  • PDF OCR
  • 可在搜索引擎上搜索和索引任何 PDF 文件
  • OCR 至 HTML 输出
  • 将 TIFF 转换为 PDF
  • 条形码读取
  • QR 码读取
  • 多线程
  • 高级 "OcrResult "类允许检查_块、段落、行、字、字符、字体和 OCR 统计数据。

结论

用于 C# OCR 的 Google Tesseract

这是一个适用于免费和学术项目的 C# 库。

Tesseract 是 C++ 开发人员的绝佳资源,但它并不是适用于 .NET 的完整 OCR 库。

在处理扫描或拍摄的图像时,Tesseract 需要对这些图像进行处理,使其具有正交性、标准化、高分辨率和无数字噪声,然后才能准确地处理这些图像。

IronOCR Tesseract OCR Library for .NET Framework & Core

相比之下,IronOCR 只需一行代码就能实现以上功能。

的确:IronOCR 使用 Tesseract 用于其内部 OCR 引擎。

最终调整后的 Tesseract C# 版本,性能有了很大提升,并添加了许多标准功能。

对于开发人员时间宝贵的任何项目来说,它都是正确的选择。你上一次发现一个.NET软件工程师有几周的时间是什么时候?

开始 C# Tesseract 项目

在任何 Visual Studio 项目中使用 NuGet 包管理器:

Install-Package IronOcr

或者您可以 下载 IronOCR Tesseract .NET DLL 并手动安装。

任何.NET程序员都可以利用本页上的示例在5分钟内开始使用IronOCR Tesseract OCR。

请查看以下对比文章: AWS 与 Google Vision(OCR 功能比较).了解更多提供 OCR 技术的服务。

在Iron担任.NET开发人员,热衷于OCR和自然语言处理

吉姆·贝克

IronOCR 产品开发人员

自2016年发布以来,吉姆一直处于IronOCR产品开发的前沿。 吉姆在2019-2020年期间负责为.NET Core & Standard开发Tesseract 5支持。