使用 C# OCR 讀取圖像中的文字

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

在本教程中,我們將學習如何在 C# 和其他 .NET 語言中將圖像轉換為文字。

在 .NET 應用程式中從圖片中讀取文本

我們將使用 IronOcr.IronTesseract 類來識別圖片內的文本,並探討如何使用 Iron Tesseract OCR 在準確性和速度方面獲得最高性能,從圖片中讀取文本。

為了實現「圖片轉文本」,我們會在 Visual Studio 專案中安裝 IronOCR 庫。

為此,我們下載 IronOcr DLL 或使用 NuGet .

Install-Package IronOcr

為什麼選擇 IronOCR?

我們使用 IronOCR 來管理 Tesseract,因為它具有以下獨特優點:

  • 在純 .NET 環境中開箱即用
  • 不需要在您的計算機上安裝 Tesseract。
  • 運行最新的引擎:Tesseract 5 ( 以及Tesseract 4 和 3)

適用於任何 .NET 專案:.NET Framework 4.5 以上,.NET Standard 2 以上和 .NET Core 2、3 和 5!

  • 比傳統的 Tesseract 提高了準確性和速度
  • 支援 Xamarin、Mono、Azure 和 Docker
  • 使用 NuGet 套件管理複雜的 Tesseract 字典系統
  • 支援 PDF、多幀 TIFF 和所有主要的影像格式,無需配置
  • 能夠校正低品質和傾斜的掃描,使 Tesseract 獲得最佳結果

C# NuGet 程式庫用于 OCR

安裝與 NuGet

Install-Package IronOcr
Java PDF JAR

下載 DLL

下載DLL

手動安裝到您的項目中

C# NuGet 程式庫用于 OCR

安裝與 NuGet

Install-Package IronOcr
Java PDF JAR

下載 DLL

下載DLL

手動安裝到您的項目中

立即開始在您的專案中使用IronPDF,並享受免費試用。

第一步:
green arrow pointer

查看 IronOCRNuget 快速安裝和部署。已被下載超過800萬次,它正用C#改變OCR。

C# NuGet 程式庫用于 OCR nuget.org/packages/IronOcr/
Install-Package IronOcr

請考慮安裝 IronOCR DLL 直接下載並手動安裝到您的專案或GAC表單: IronOcr.zip

手動安裝到您的項目中

下載DLL

使用 Tesseract 在 C#

在這個簡單的範例中,你可以看到我們使用了 IronOCR.IronTesseract 從圖像中讀取文本並自動將其值返回為字串的類。

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

導致以下文本的準確率達到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%。

C# OCR 應用程序結果的準確性

高級使用 IronOCR Tesseract for C#

在大多數實際應用情況下,開發人員會希望其專案具備最佳效能。在這種情況下,我們建議您繼續使用 OcrInputIronTesseractIronOcr 命名空间中的類別。

OcrInput 讓你可以設定 OCR 任務的特定特徵,例如:

  • 處理幾乎任何類型的圖像,包括 JPEG、TIFF、GIF、BMP 及 PNG
  • 匯入整個或部分 PDF 文件
  • 增強對比度、解析度及大小
  • 矯正旋轉、掃描雜訊、數位雜訊、傾斜、負片圖像

IronTesseract

  • 從數百種預打包語言和語言變體中選擇
  • 使用 Tesseract 5、4 或 3 OCR 引擎 "開箱即用"
  • 指定文件類型,無論是截圖,片段還是整個文件
  • 讀取條碼
  • 將結果輸出為: 可搜索的 PDFs,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)
VB   C#

即使在中等質量的掃描上,我們也可以使用這個工具以100%的準確率。


C# OCR 從 Tiff 掃描範例

如你所見,閱讀文本 (及條碼(可選)) 從掃描的圖像(例如 TIFF)中獲取內容相當容易。

這個 OCR 任務的準確率為 100%

在處理現實世界的文件時,OCR 並不是一門完美的科學,然而 IronTesseract 已經達到了非常高的水準。

您還會注意到,IronOCR 可以自動讀取多頁文件,例如 TIFF,甚至是 從PDF文件中提取文本 自動化。

範例:低品質掃描


帶數字噪點的低解析度掃描 C# OCR

現在我們將嘗試使用相同頁面的低質量掃描,低 DPI,而且有很多失真、數位雜訊和對原紙的損壞。

這正是 IronOCR 真正優於其他 OCR 庫如 Tesseract 的地方,我們會發現其他 OCR 專案不太願意討論這一點。IronOCR 對真實世界中的掃描圖像進行 OCR,而不是對數位創建的理想化“完美”測試案例進行的 OCR,以達到 100% 的識別準確率。

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

不添加 Input.Deskew()``` to straighten the image we get a 52.5% accuracy. Not good enough.

添加 Input.Deskew```() 帶給我們 99.8% 的準確率,這是 幾乎 如同高品質掃描的光學字符識別一樣準確。

圖像過濾器可能需要一些時間來運行,但也可以減少光學字符識別的處理時間。這對開發人員來說是一個對輸入文件的微妙平衡。

如果您不確定:

  • Input.Deskew()`是一個安全且非常成功的過濾器。
  • 其次嘗試 `Input.DeNoise()修復大量數位噪音。

性能調整

影響OCR工作速度的最重要因素實際上是輸入圖像的質量。背景噪音越少,解析度越高(最佳解析度約為200 dpi),將產生最快和最準確的OCR結果。

然而,這並不是必需的,因為IronOCR在修正不完美的文檔方面表現優異。 (雖然這很耗時,並且會使您的OCR作業使用更多的CPU周期)如果可能的話,選擇數位噪點較少的輸入圖像格式,如TIFF或PNG,也可以比 有損 JPEG 等圖像格式。

圖像過濾器

以下圖像過濾器可以真正提高性能:

  • OcrInput.Rotate( 雙精度)** - 依順時針方向將圖片旋轉一定角度。若要逆時針旋轉,請使用負數。
  • OcrInput.Binarize() - 這個圖像濾鏡將每個像素變成黑色或白色,沒有中間色調。在文字與背景對比度極低的情況下,可能會提高OCR性能。
  • OcrInput.ToGrayScale() - 此影像濾鏡將每個像素轉換為灰階。雖然不太可能提高OCR精度,但可能會提高速度
  • OcrInput.Contrast() - 自動增加對比度。這個過濾器通常可以提高低對比度掃描的 OCR 速度和準確性。
  • OcrInput.DeNoise() - 移除數位噪音。此過濾器僅應在預期有噪音的情況下使用。
  • OcrInput.Invert() - 反轉每一個顏色。例如,白色變成黑色: 黑色變成白色。
  • OcrInput.Dilate() - 高级形态学。_膨胀_将像素添加到图像中对象的边界。与腐蚀相反
  • OcrInput.Erode() - 高级形态学。_腐蚀_删除物体边界上的像素相对于膨胀相反
  • OcrInput.Deskew() - 將圖像旋轉至正確方向並且垂直。這對於OCR非常有用,因為Tesseract對偏斜掃描的容忍度可能低至5度。
  • OcrInput.DeepCleanBackgroundNoise() - 嚴重的背景噪音去除。僅在已知有極端文件背景噪音的情況下使用此過濾器,因為此過濾器也會有降低乾淨文件OCR準確性的風險,且非常佔用CPU資源。
  • OcrInput.EnhanceResolution - 提高低品質圖像的解析度。通常不需要這個過濾器,因為 OcrInput.MinimumDPIOcrInput.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
VB   C#

這個結果的準確率為99.8%,相比基線的100%,但快了35%。

读取图像的裁剪区域

正如下面的代码示例所示,Iron 的 Tesseract OCR 分支擅长读取图像的特定区域。

我们可以使用 System.Drawing.Rectangle 指定像素的影像讀取範圍。

當我們處理填寫好的標準化表單時,這可能非常有用,因為只有某個區域的文本會根據不同情況變化。

範例:掃描頁面的特定區域

我們可以使用一個 System.Drawing.Rectangle 指定我們要閱讀文件的區域。測量單位始終是像素

我們會發現,這樣做不僅能提高速度,還能避免閱讀不必要的文字。在這個例子中,我們將從標準化文件的中央區域讀取學生的姓名。


C# OCR 從 Tiff 掃描範例   C# OCR 從 Tiff 掃描範例


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

這帶來了41%的速度提升 - 並且允許我們具體化。這在_.NET OCR_場景中特別有用,特別是文件相似且一致的情況,例如發票、收據、支票、表格、費用報銷等。

ContentAreas (OCR 裁剪) 也支持讀取PDF。

國際語言

IronOCR通過語言包支援125種國際語言,這些語言包以DLL格式發佈,可以從此網站下載,也可以通過Visual Studio的NuGet包管理器下載。

我們可以通過瀏覽NuGet來安裝它們 (搜尋 "IronOcr.Languages") 或從 OCR 語言包頁面支持的語言包括:

  • 南非語
  • 阿姆哈拉語 也稱為 አማርኛ
  • 阿拉伯語 也稱為 العربية
  • 阿拉伯字母 也稱為 العربية
  • 亞美尼亞字母 也稱為 Հայերեն
  • 阿薩姆語 也稱為 অসমীয়া
  • 亞塞拜然語 也稱為 azərbaycan dili
  • 亞塞拜然西里爾語 也稱為 azərbaycan dili
  • 白俄羅斯語 也稱為 беларуская мова
  • 孟加拉語 也稱為 Bangla,বাংলা
  • 孟加拉字母 也稱為 Bangla,বাংলা
  • 藏語 也稱為 Tibetan Standard, Tibetan, Central ཡིག་
  • 波斯尼亞語 也稱為 bosanski jezik
  • 布列塔尼語 也稱為 brezhoneg
  • 保加利亞語 也稱為 български език
  • 加拿大土著字母 也稱為 Canadian First Nations, Indigenous Canadians, Native Canadian, Inuit
  • 加泰羅尼亞語 也稱為 català, valencià
  • 宿霧語 也稱為 Bisaya, Binisaya
  • 捷克語 也稱為 čeština, český jazyk
  • 切羅基字母 也稱為 ᏣᎳᎩ ᎦᏬᏂᎯᏍᏗ, Tsalagi Gawonihisdi
  • 中文簡體 也稱為 中文 (中文), 汉语, 漢語_
  • ChineseSimplifiedVertical 也称作 中文 (中文), 漢語, 汉语
  • ChineseTraditional 也稱為中文 (中文),汉语,漢語
  • ChineseTraditionalVertical 也称为 中文 (中文),汉语,漢語
  • Cherokee 也稱為 ᏣᎳᎩ ᎦᏬᏂᎯᏍᏗ,Tsalagi Gawonihisdi
  • Corsican 也稱為 corsu,lingua corsa
  • Welsh 也稱為 Cymraeg
  • CyrillicAlphabet 也稱為西里尔字母
  • Danish 也稱為 dansk
  • DanishFraktur 也稱為 dansk
  • German 也稱為 Deutsch
  • GermanFraktur 也稱為 Deutsch
  • DevanagariAlphabet 也稱為 Nagair,देवनागरी
  • Divehi 也稱為 ދިވެހި
  • Dzongkha 也稱為 རྫོང་ཁ
  • Greek 也稱為 ελληνικά
  • English
  • MiddleEnglish 也稱為 English (1100-1500 AD)_
  • 世界语
  • 爱沙尼亚语 也称为 eesti, eesti keel
  • 埃塞俄比亚字母 也称为 Ge'ez,ግዕዝ, Gəʿəz
  • 巴斯克语 也称为 euskara, euskera
  • 法罗语 也称为 føroyskt
  • 波斯语 也称为 فارسی
  • 菲律宾语 也称为菲律宾国语, 标准化的他加禄语
  • 芬兰语 也称为 suomi, suomen kieli
  • 财务文件 也称为 Financial, Numerical and Technical Documents
  • 法语 也称为 français, langue française
  • 斜体字母 也称为 Generic Fraktur, Calligraphic hand of the Latin alphabet
  • 法兰克语 也称为 Frenkisk, Old Franconian
  • 中古法语 也称为 Moyen Français, Middle French (公元約1400-1600年)_
  • WesternFrisian 也稱為 Frysk
  • GeorgianAlphabet 也稱為 ქართული
  • ScottishGaelic 也稱為 Gàidhlig
  • Irish 也稱為 Gaeilge
  • Galician 也稱為 galego
  • AncientGreek 也稱為 Ἑλληνική
  • GreekAlphabet 也稱為 ελληνικά
  • Gujarati 也稱為 ગુજરાતી
  • GujaratiAlphabet 也稱為 ગુજરાતી
  • GurmukhiAlphabet 也稱為 Gurmukhī, ਗੁਰਮੁਖੀ, Shahmukhi, گُرمُکھی‎, Sihk Script
  • HangulAlphabet 也稱為 Korean Alphabet, 한글, Hangeul, 조선글, hosŏn'gŭl
  • HangulVerticalAlphabet 也稱為 Korean Alphabet, 한글, Hangeul, 조선글, hosŏn'gŭl
  • HanSimplifiedAlphabet 也稱為 Samhan, 한어, 韓語
  • HanSimplifiedVerticalAlphabet 也稱為 Samhan, 한어, 韓語
  • HanTraditionalAlphabet 也稱為 Samhan, 한어, 韓語
  • HanTraditionalVerticalAlphabet 也稱為 Samhan, 한어, 韓語
  • Haitian 也稱為 Kreyòl ayisyen
  • Hebrew 也稱為 עברית
  • HebrewAlphabet 也稱為 עברית
  • Hindi 也稱為 हिन्दी, हिंदी
  • Croatian 也稱為 hrvatski jezik
  • Hungarian 也稱為 magyar
  • Armenian 也稱為 Հայերեն
  • Inuktitut 也稱為 ᐃᓄᒃᑎᑐᑦ
  • Indonesian 也稱為 Bahasa Indonesia
  • Icelandic 也稱為 Íslenska
  • Italian 也稱為 italiano
  • ItalianOld 也稱為 italiano
  • JapaneseAlphabet 也稱為 日本語 (日語)_
  • JapaneseVerticalAlphabet 也稱為 日本語 (日語)
  • 爪哇語 也被稱為basa Jawa
  • 日語 也被稱為日本語 (日語)_
  • JapaneseVertical 也称为 日本語 (日語)
  • 卡纳达 也称为 ಕನ್ನಡ
  • 卡纳达字母 也称为 ಕನ್ನಡ
  • 格鲁吉亚 也称为 ქართული
  • 古代格鲁吉亚 也称为 ქართული
  • 哈萨克 也称为 қазақ тілі
  • 高棉 也称为 ខ្មែរ, ខេមរភាសា, ភាសាខ្មែរ
  • 高棉字母 也称为 ខ្មែរ, ខេមរភាសា, ភាសាខ្មែរ
  • 柯尔克孜语 也称为 Кыргызча, Кыргыз тили
  • 北库尔德语 也称为 Kurmanji, کورمانجی ,Kurmancî‎
  • 朝鲜语 也称为 한국어 (韓國語),朝鲜语 (韩语)_
  • KoreanVertical 也被稱為 한국어 (韓國語),朝鲜语 (韩语)
  • 老撾 也叫作 ພາສາລາວ
  • 老撾字母 也叫作 ພາສາລາວ
  • 拉丁語 也叫作 latine, lingua latina
  • 拉丁字母 也叫作 latine, lingua latina
  • 拉脫維亞語 也叫作 latviešu valoda
  • 立陶宛語 也叫作 lietuvių kalba
  • 盧森堡語 也叫作 Lëtzebuergesch
  • 馬拉雅拉姆語 也叫作 മലയാളം
  • 馬拉雅拉姆字母 也叫作 മലയാളം
  • 馬拉地語 也叫作 मराठी
  • MICR 也叫作磁墨字符识别, MICR支票编码
  • 馬其頓語 也叫作 македонски јазик
  • 馬耳他語 也叫作 Malti
  • 蒙古語 也叫作 монгол
  • 毛利語 也叫作 te reo Māori
  • 馬來語 也叫作 bahasa Melayu, بهاس ملايو‎
  • 緬甸語 也叫作 Burmese ,ဗမာစာ
  • 緬甸字母 也叫作 Burmese ,ဗမာစာ
  • 尼泊爾語 也叫作 नेपाली
  • 荷蘭語 也叫作 Nederlands, Vlaams
  • 挪威語 也叫作 Norsk
  • 奧克語 也叫作 occitan, lenga d'òc
  • 奧里亞語 也叫作 ଓଡ଼ିଆ
  • 奧里亞字母 也叫作 ଓଡ଼ିଆ
  • 旁遮普語 也叫作 ਪੰਜਾਬੀ, پنجابی‎
  • 波蘭語 也叫作 język polski, polszczyzna
  • 葡萄牙語 也叫作 português
  • 普什圖語 也叫作 پښتو
  • 克丘亞語 也叫作 Runa Simi, Kichwa
  • 羅馬尼亞語 也叫作 limba română
  • 俄語 也叫作 русский язык
  • 梵語 也叫作 संस्कृतम्
  • 僧伽羅語 也叫作 සිංහල
  • 僧伽羅字母 也叫作 සිංහල
  • 斯洛伐克語 也叫作 slovenčina, slovenský jazyk
  • 斯洛伐克古德体 也叫作 slovenčina, slovenský jazyk
  • 斯洛文尼亞語 也叫作 slovenski jezik, slovenščina
  • 信德語 也叫作 सिन्धी, سنڌي، سندھی‎
  • 西班牙語 也叫作 español, castellano
  • 古西班牙語 也叫作 español, castellano
  • 阿爾巴尼亞語 也叫作 gjuha shqipe
  • 塞爾維亞語 也叫作 српски језик
  • 塞爾維亞拉丁文 也叫作 српски језик
  • 蘇丹尼語 也叫作 Basa Sunda
  • 斯瓦希里語 也叫作 Kiswahili
  • 瑞典語 也叫作 Svenska
  • 敘利亞語 也叫作 Syrian, Syriac Aramaic, ܠܫܢܐ ܣܘܪܝܝܐ‎, Leššānā Suryāyā
  • 敘利亞字母 也叫作 Syrian, Syriac Aramaic, ܠܫܢܐ ܣܘܪܝܝܐ‎, Leššānā Suryāyā
  • 泰米爾語 也叫作 தமிழ்
  • 泰米爾字母 也叫作 தமிழ்
  • 韃靼語 也叫作 татар теле, tatar tele
  • 泰盧固語 也叫作 తెలుగు
  • 泰盧固字母 也叫作 తెలుగు
  • 塔吉克語 也叫作 тоҷикӣ, toğikī, تاجیکی‎
  • 塔加洛語 也叫作 Wikang Tagalog, ᜏᜒᜃᜅ᜔ ᜆᜄᜎᜓᜄ᜔
  • 泰語 也叫作 ไทย
  • 魯姆語字母 也叫作 Taana, Tāna,  ތާނަ‎
  • 泰語字母 也叫作 ไทย
  • 藏語字母 也叫作 Tibetan Standard, Tibetan, Central ཡིག་
  • 提格里尼亞語 也叫作 ትግርኛ
  • 東加語 也叫作 faka Tonga
  • 土耳其語 也叫作 Türkçe
  • 維吾爾語 也叫作 Uyƣurqə, ئۇيغۇرچە‎
  • 烏克蘭語 也叫作 українська мова
  • 烏爾都語 也叫作 اردو
  • 烏茲別克語 也叫作 O‘zbek, Ўзбек, أۇزبېك‎
  • 烏茲別克西里爾語 也叫作 O‘zbek, Ўзбек, أۇزبېك‎
  • 越南語 也叫作 Tiếng Việt
  • 越南語字母 也叫作 Tiếng Việt
  • 伊迪帕語 也叫作 ייִדיש
  • 約魯巴語 也叫作 Yorùbá

示例:阿拉伯語的OCR (+ 還有更多)

在以下示例中,我們將展示如何掃描阿拉伯文檔。

PM> Install-Package IronOcr.Languages.Arabic
C# 阿拉伯語 OCR
: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
VB   C#

範例:同一文件中使用多種語言的 OCR。

在以下範例中,我們將展示如何將多種語言的 OCR 掃描到同一文件中。

這其實很常見,例如,一份中文文件可能包含英文單詞和 URL。

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

多頁文件

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

我們也可以輕鬆地對每一頁的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
VB   C#
: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
VB   C#

可搜索的PDF

在C#和VB.NET中將OCR結果導出為可搜索的PDF是IronOCR的一個流行功能。這對於數據庫填充、SEO以及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")
VB   C#

另一個光學字符識別(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")
VB   C#

同樣適用於使用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")
VB   C#

將 Hocr HTML 導出

我們同樣可以將 OCR 結果文件導出為 Hocr HTML。這是一個可以被 XML 讀取器解析的 XML 文件,或者標記為視覺效果出色的 HTML。

這允許某種程度的 PDF 到 HTMLTIFF 到 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")
VB   C#

在 OCR 文件中讀取條碼

IronOCR 相較於傳統的 tesseract,具備了一個獨特的優勢,那就是它也可以讀取條碼和 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
VB   C#

圖像轉文字 OCR 結果的詳細檢視

在本教程的最後一部分,我們將探討 OCR 結果對象。當我們讀取 OCR 時,我們通常只需要文字,但 IronOCR 實際上包含大量可能對高級開發者有用的信息。

在 OCR 結果對象中,我們有可以迭代的頁面集合。在每個頁面中,我們可能會找到條碼、功率圖、文本行、單詞和字符。

實際上,每個這些對象都包含:位置;X 坐標;Y 坐標;寬度和高度;與之關聯的圖像,可以進行檢查;字體名稱;字體大小;文本書寫方向;文本旋轉角度;以及 IronOCR 對於特定單詞、行或段落的統計信心。

總而言之,這允許開發者創造性地處理 OCR 數據,以任何他們選擇的方式檢查和導出信息。

我們還可以處理並導出任何來自 .NET OCR 結果對象的元素,例如段落、單詞或條碼,作為圖像或位圖。

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

概要

IronOCR 提供 C# 開發者最先進的 Tesseract API 我們知道在任何平台上都有的。

IronOCR 可以部署在 Windows、Linux、Mac、Azure、AWS、Lambda 上,並且支持 .NET Framework 項目以及 .NET Standard.NET Core

我們可以看到,即使我們將一份不完美的文件輸入 IronOCR,它也能準確地讀取其內容,統計準確度約為 99%,即使該文件格式不好,偏斜,並且有數字噪音。

我們還可以在 OCR 掃描中讀取條碼,甚至將我們的 OCR 另存為 HTML 和可搜索的 PDF。

這是 IronOCR 獨有的特性,是你在標準的 OCR 庫或原生 Tesseract 中找不到的功能。

前進

要繼續了解 IronOCR,我們建議您:

深入閱讀 MSDN風格API參考.

原始碼下載

您可能還會喜歡本部分中的其他 .NET OCR 教程。