使用 C# OCR 讀取圖像中的文字
在本教程中,我們將學習如何在 C# 和其他 .NET 語言中將圖像轉換為文字。
如何在 C# 中將圖片轉換為文本
- 下載 OCR 圖像轉文字 IronOCR 庫
- 調整裁剪區域以讀取圖像的部分內容
- 使用語言包支持多達 125 種國際語言
- 匯出 OCR 掃描結果為文字或可搜尋的 PDF
在 .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 獲得最佳結果
立即開始在您的專案中使用IronPDF,並享受免費試用。
查看 IronOCR 上 Nuget 快速安裝和部署。已被下載超過800萬次,它正用C#改變OCR。
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)
導致以下文本的準確率達到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%。
高級使用 IronOCR Tesseract for C#
在大多數實際應用情況下,開發人員會希望其專案具備最佳效能。在這種情況下,我們建議您繼續使用 OcrInput
和 IronTesseract
在 IronOcr
命名空间中的類別。
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)
即使在中等質量的掃描上,我們也可以使用這個工具以100%的準確率。
如你所見,閱讀文本 (及條碼(可選)) 從掃描的圖像(例如 TIFF)中獲取內容相當容易。
這個 OCR 任務的準確率為 100%。
在處理現實世界的文件時,OCR 並不是一門完美的科學,然而 IronTesseract 已經達到了非常高的水準。
您還會注意到,IronOCR 可以自動讀取多頁文件,例如 TIFF,甚至是 從PDF文件中提取文本 自動化。
範例:低品質掃描
現在我們將嘗試使用相同頁面的低質量掃描,低 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)
不添加 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.MinimumDPI 和 OcrInput.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
這個結果的準確率為99.8%,相比基線的100%,但快了35%。
读取图像的裁剪区域
正如下面的代码示例所示,Iron 的 Tesseract OCR 分支擅长读取图像的特定区域。
我们可以使用 System.Drawing.Rectangle
指定像素的影像讀取範圍。
當我們處理填寫好的標準化表單時,這可能非常有用,因為只有某個區域的文本會根據不同情況變化。
範例:掃描頁面的特定區域
我們可以使用一個 System.Drawing.Rectangle
指定我們要閱讀文件的區域。測量單位始終是像素。
我們會發現,這樣做不僅能提高速度,還能避免閱讀不必要的文字。在這個例子中,我們將從標準化文件的中央區域讀取學生的姓名。
: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)
這帶來了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
: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
範例:同一文件中使用多種語言的 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
多頁文件
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
我們也可以輕鬆地對每一頁的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
: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
可搜索的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")
另一個光學字符識別(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")
同樣適用於使用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")
將 Hocr HTML 導出
我們同樣可以將 OCR 結果文件導出為 Hocr HTML。這是一個可以被 XML 讀取器解析的 XML 文件,或者標記為視覺效果出色的 HTML。
這允許某種程度的 PDF 到 HTML 和 TIFF 到 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")
在 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
圖像轉文字 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
概要
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,我們建議您:
- 開始使用我們的 C# Tesseract OCR 快速入門 指南。
- 探索 C# & VB 代碼示例
深入閱讀 MSDN風格API參考.
原始碼下載
您可能還會喜歡本部分中的其他 .NET OCR 教程。