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 使用範例 - 從圖片中提取文字 in 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
VB   C#

安裝選項

使用 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 上編譯。

免費安裝 Tesseract 5 以供 C# 使用,需手動修改並編譯 LeptonicaTesseract 以供 Windows 使用。截至今日,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,幾乎不需要配置。無需管理本地二進位檔案。與 Framework 和 Core 兼容。

除此之外,沒有什麼好說的,只是它已經完美完成了。

Google OCR

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

準確性

.NET 專案中的 Google Tesseract

Tesseract 作為一個庫被設計來處理完美的文件,其中機器打印出高分辨率文本到屏幕上然後讀取它。這就是為什麼 Tesseract 擅長讀取完美的文件。

問題是,在現實世界中,我們沒有這樣的文件。如果 Tesseract 遇到一個旋轉、傾斜、低 DPI、掃描或有背景噪音的圖像,Tesseract 幾乎無法從該圖像中獲取數據。此外,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)
VB   C#

圖像相容性

Google Tesseract 在 .NET 中

只接受 Leptonica PIX 圖像格式,該格式在 C# 中是一個 IntPtr 的 C++ 對象。PIX 對象不是受管理的內存,不小心處理它們會導致 C# 中出現內存洩漏。

Leptonica 具有良好的通用圖像兼容性,但會拋出許多主控台警告和錯誤。已知存在 TIFF 文件的問題,以及對 PDF OCR 支持有限。

IronOCR Tesseract for .NET

圖像管理是通過內存進行管理的。支持PDF和Tiff格式。每個文件格式都包括System.Drawing、Stream和Byte Array。

廣泛的圖像支持:

  • 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)
VB   C#

性能

免費的 Google Tesseract

如果適當調整且輸入圖像經過 Photoshop 或 ImageMagick 預處理,Google Tesseract 可以產生快速且準確的結果。

您會注意到,大多數線上 Tesseract 範例實際上來自高解析度截圖,這些截圖沒有數位雜訊,且使用 Tesseract 設計來處理的字體。

Tesseract 自身的文檔指出,輸入圖像應以 300DPI 或更高的解析度進行取樣,才能有效進行 OCR。

IronOCR Tesseract Library

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)
VB   C#

API

API

Google Tesseract OCR 在 .NET 中

我們有兩個免費選擇:

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

上述兩者可能都不適用於 Web 應用程式、Azure、Mono、Xamarin、Linux、Docker 或 Mac。

IronOCR Tesseract OCR Library for .NET

一個管理和測試的 .NET 圖書館,用於 Tesseract 稱為 IronTesseract

完全文檔化並支持 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
VB   C#

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

相容性

Google Tesseract + Interop for .NET

如果您願意尋找依賴項、從源碼構建或更新免費的C# interop包,這可能可以在大多數平台上工作。這些資源可能與 .NET Core 或 .NET Standard 專案不完全相容。

目前,我們沒有發現任何合乎邏輯且簡單的方法能夠在沒有 IronTessseract 的情況下安全地為Windows安裝 LibTesseract5

IronOCR Tesseract .NET OCR Library

已使用 CI 進行單元測試,並擁有運行所需的一切資源:

  • 桌面應用程序
  • 控制台應用程序
  • 伺服器進程
  • 網頁應用程序和 MVC
  • JetBrains Rider
  • Xamarin Mac

支持於:

  • Windows
  • Azure
  • Linux
  • Docker
  • Mac
  • 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 Package Manager 作為 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")
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 Code 識別
  • 多線程處理
  • 高級 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 專案

使用 NuGet 套件管理器於任何 Visual Studio 專案中:

Install-Package IronOcr

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

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

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

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

吉姆·貝克

IronOCR 產品開發人員

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