已更新 2025年1月28日
分享:

如何使用 Tesseract OCR 的 C# 替代品與 IronOCR

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

by吉姆·貝克

Tesseract 是一個卓越的學術 OCR(光學字元識別)針對開發人員幾乎所有使用案例均免費提供的程式庫。

C# 很幸運擁有一個最精確、最快速的 Tesseract 函式庫。

IronOCR 透過 IronTesseract 擴展了 Google Tesseract - 一個原生 C# OCR 函式庫,具有比免費的 Tesseract 函式庫更高的穩定性和準確性。

本文比較並解釋為什麼 .NET 開發人員強烈考慮使用 IronOCR IronTesseract 而不是原生 Tesseract。

.NET OCR 使用範例 - 在 C# 中從圖像提取文字

使用 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
$vbLabelText   $csharpLabel

安裝選項

使用 Tesseract 引擎在 .NET 中進行 OCR

在使用Tesseract引擎時,我們大多數人都在使用C++庫。

在 .NET 中進行互操作性並不有趣 - 而且在跨平台和 Azure 兼容性方面表現不佳。 它要求我們選擇應用程序的位元性,這意味著我們可能只能部署到32位或64位目標。

我們可能需要確保安裝了 Visual C++ 運行庫,甚至可能需要自行編譯 Tesseract 以獲得最新版本。 這些免費的 C# 封裝可能落後於最新技術數年。

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

使用 NuGet 套件管理器安裝非常容易,可用於透過光學字符識別從圖像和 PDF 文件中提取文本。

IronOCR Tesseract for C

使用IronOCR,所有Tesseract的安裝完全通過NuGet包管理器進行。

Install-Package IronOcr

不需要安裝本機 dll 或 exe 檔。 一切都由單一的 .NET 組件庫處理。

整個 API 使用 Tesseract,以原生 .NET 和簡潔的 C# API 實現。

它支援這些類型的 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)

最新維護

Google Tesseract 與 C

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

Google Cloud OCR (光學字符識別)是由 Google Cloud Platform 提供的服務(谷歌雲平台)讓開發人員使用機器學習算法從圖像和掃描文件中提取文本。

準確性

在 .NET 專案中使用 Google Tesseract

Tesseract 身為一個庫,是為了完美的文件而設計的,其中機器以高解析度將文本打印到屏幕上,然後進行讀取。 這就是為什麼Tesseract擅長讀取完美文件的原因。

問題在於在現實世界中,情況並非如此。 如果 Tesseract 遇到旋轉、傾斜、低 DPI、掃描或有背景噪音的圖像,幾乎無法從該圖像獲取數據。 此外,Tesseract 處理該文件的時間也會非常長,最終返回的是無意義的信息。

一份肉眼容易閱讀的簡單文檔,Tesseract卻無法很好地讀取。

Tesseract 是一個免費的庫,最適合識別標準字體的直接完美文字。

要在使用掃描或拍攝的文件時使用Tesseract,其中圖像不如螢幕截圖那樣數字化完美,我們需要進行圖像預處理。 這通常是透過Photoshop批次腳本或進階的ImageMagick使用來完成的。

通常,這需要根據您正在處理的每一種文件類型逐個開發,可能需要數週的開發時間。

IronOCR Tesseract 在 .NET 專案中

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)
$vbLabelText   $csharpLabel

圖像相容性

Google Tesseract 在 .NET 中

僅接受在 C# 中為 IntPtr C++ 物件的 Leptonica PIX 圖像格式。 PIX 物件不是管理記憶體 - 在 C# 中未能小心處理它們會導致記憶體洩漏。

Leptonica 對一般圖像具有良好的兼容性,但會產生許多控制台警告和錯誤。 TIFF 文件存在已知問題,PDF OCR 的支持也有限。

IronOCR Tesseract for .NET

圖像是記憶體管理的。 PDF 和 Tiff 支援。 System. 每種檔案格式都包括繪圖、流和位元組陣列。

廣泛的圖像支援:

  • PDF 文件
  • Pdf 頁面
  • 多框TIFF文件
  • JPEG 和 JPEG2000

    GIF

    PNG

    BMP

    WBMP

    System.Drawing.Image

    System.Drawing.Bitmap

  • 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)
$vbLabelText   $csharpLabel

性能

免費的 Google Tesseract

如果適當調整並使用Photoshop或ImageMagick預處理輸入圖像,Google Tesseract可以執行快速且準確的結果。

您會注意到,網路上大多數的 Tesseract 範例其實都是來自高解析度的截圖,而且沒有數位噪點,使用的字體也是 Tesseract 設計得很好的字體。

Tesseract 的官方文件指出,輸入影像應該以 300 DPI 或更高的分辨率進行採樣,以便有效進行光學字符識別。

IronOCR Tesseract 圖書館

IronOcr .NET Tesseract DLL 對於大多數圖像能夠快速且準確地進行處理。 我們已實現多線程,以利用大多數機器現在使用的多核心處理器。

即使是低解析度的圖片,在您的程序中也能以高度的準確性運作。 無需使用 PhotoShop。

開發者通常只需進行少量配置即可實現超過 99% 的準確率,這與當前的機器學習網絡 API 相匹配,且無需持續成本、安全風險和頻寬問題。

速度很快,但透過一些編程可以進一步提升。

性能調整範例

: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)
$vbLabelText   $csharpLabel

API

API

Google Tesseract OCR 在 .NET 中

我们有两个免费选择:

  • 使用Interop層 - GitHub上許多層已過時,存在未解決的問題、記憶體洩漏和控制台警告。 可能不支持 .NET Core 或 Standard。
  • 使用命令行EXE - 難以部署且常被病毒掃描器和安全政策所中斷。

    以上兩者在 Web 應用程式、Azure、Mono、Xamarin、Linux、Docker 或 Mac 中可能都無法很好地運作。

IronOCR Tesseract OCR 函式庫適用於 .NET

一個稱為IronTesseract的經過管理和測試的.NET庫。

完整的文件與IntelliSense支援。

最簡單的 Hello World 使用 Tesseract 在 .NET

: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
$vbLabelText   $csharpLabel

由經驗超過20年的專業軟體工程師積極開發和支援。

相容性

Google Tesseract + Interop 針對 .NET

如果您願意尋找依賴性、從源代碼構建或更新免費的 C# 互操作包裝器,則可能在大多數平台上運行。 這些資源可能與 .NET Core 或 .NET Standard 項目不完全兼容。

目前,我們還沒有遇到任何合邏輯且簡單的方法可以在不使用 IronTesseract 的情況下安全地為 Windows 安裝 LibTesseract5

IronOCR Tesseract .NET OCR 函式庫

已進行單元測試並且包含在持續整合中,具備了運行所需的一切功能:

  • 桌面應用程式,
  • 控制台應用程序
  • 伺服器進程
  • 網頁應用程序與MVC
  • JetBrains Rider

    Xamarin Mac

    On:

    Windows

    Azure

  • Linux

    Docker

  • 麦金塔
  • BSD和FreeBSD

    .NET 支援:

  • .NET Framework 4.6.2 及以上版本
  • .NET Core - 所有活躍版本均在2.0以上
  • .NET Standard - 所有活躍的版本高於 2.0

    Mono

    Xamarin Mac

語言支援

Google Tesseract

Tesseract 字典以文件形式管理,必須從 https://github.com/tesseract-ocr/tessdata 克隆。 這大約是 4 GB。

某些Linux發行版透過apt-get來幫助管理Tesseract字典。

必須保持精確的文件夾結構,否則Tesseract將無法運作。

IronOCR Tesseract

支持的語言比 https://github.com/tesseract-ocr/tessdata 更多,且每個語言都可以透過 NuGet 包管理器或容易安裝的下載來管理。

Unicode 語言範例

: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")
$vbLabelText   $csharpLabel

多語言示例

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")
$vbLabelText   $csharpLabel

還有什麼?

IronOCR Tesseract 為 .NET 軟件開發人員提供了額外功能。

  • 自動圖像分析來配置 Tesseract 以解決常見錯誤
  • 圖像轉換為可搜尋的PDF
  • PDF OCR
  • 可以使任何PDF在搜索引擎上可搜索和可索引。
  • OCR 至 HTML 輸出
  • TIFF 轉 PDF 轉換
  • 條碼讀取
  • QR 碼讀取
  • 多執行緒
  • 先進的 OcrResult 類允許檢查區塊、段落、行、單詞、字符、字體以及 OCR 統計數據。

結論

Google Tesseract 用於 C# 的 OCR

這是用於 C# 中的免費和學術項目的正確庫。

Tesseract 是 C++ 開發者的絕佳資源,但它不是一個完整的 .NET OCR 函式庫。

在處理掃描或拍攝的圖像時,這些圖像需要被處理以便於正交、標準化、高解析度且無數字噪聲,才能讓 Tesseract 能準確地進行工作。

IronOCR Tesseract OCR Library 適用於 .NET Framework 和 Core

相比之下,IronOCR可以在一行代碼中完成這個和更多功能。

IronOCR 使用Tesseract 用於其內部的OCR引擎。

一個為C#量身定做的、高度優化的Tesseract構建,標準添加了許多性能改進和功能。

它是任何開發者時間寶貴的項目的正確選擇。 最後一次你何時遇到一位有幾週空閒時間的 .NET 軟體工程師?

開始您的 C# Tesseract 專案

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

Install-Package IronOcr

或者你可以下載 IronOCR Tesseract .NET DLL並手動安裝它。

任何 .NET 程式設計師都應該能在 5 分鐘內使用本頁面上的範例開始使用 IronOCR Tesseract OCR。

C Tesseract Ocr 2 related to 開始您的 C# Tesseract 專案

查看以下比較文章:AWS 與 Google Vision(OCR 功能比較). 要了解更多提供 OCR 技術的服務。

在 Iron 從事 .NET 開發,熱衷於 OCR 和自然語言處理

吉姆·貝克

IronOCR 產品開發人員

自2016年發佈以來,Jim 一直處於 IronOCR 產品開發的前沿。Jim 在2019-2020年期間致力於支持 .NET Core 和 Standard 的 Tesseract 5。