C# Tesseract OCR 範例

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。

C# Tesseract OCR

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

安裝免費的 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)
VB   C#

圖像相容性

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

性能

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

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

由經驗超過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")
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 統計數據。

結論

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。