C# OCRで画像からテキストを読み取る

チャクニット・ビン
チャクニット・ビン
2018年8月28日
更新済み 2024年10月20日
共有:
This article was translated from English: Does it need improvement?
Translated
View the article in English

このチュートリアルでは、C#(シーシャープ)やその他の.NET言語で画像をテキストに変換する方法を学びます。

.NETアプリケーションで画像からテキストを読み取る

私たちは、画像内のテキストを認識するためにIronOcr.IronTesseractクラスを使用し、.NETで画像からテキストを読み取る際に、精度と速度の面で最高のパフォーマンスを引き出すための_Iron Tesseract OCR_の使用法のニュアンスを見ていきます。

画像からテキストへ」を実現するために、IronOCRライブラリをVisual Studioプロジェクトにインストールします。

これを行うには、IronOcr DLLをダウンロードするか、NuGetを使用します。

Install-Package IronOcr

なぜIronOCR なのか?

私たちがテッセラクトの管理にIronOCR を使っているのは、それがユニークだからです:

  • 純粋な.NETでそのまま動作します
  • Tesseractがマシンにインストールされている必要はない。
  • 最新のエンジンを実行: Tesseract 5 (Tesseract 4 & 3も含む)
  • は、.NET Framework 4.5+、.NET Standard 2+、および.NET Core 2、3、5 以上の任意の.NET プロジェクトで利用可能です!
  • 従来のテッセラクトよりも精度とスピードが向上している。
  • Xamarin、Mono、Azure、Dockerをサポート
  • NuGetパッケージを使用した複雑なTesseract辞書システムの管理
  • PDFS、MultiFrame Tiff、およびすべての主要な画像フォーマットを設定なしでサポート
  • テッセラクトから最良の結果を得るために、低品質で歪んだスキャンを修正することができる。

    今日から無料トライアルでIronOCRをあなたのプロジェクトで使い始めましょう。

    最初のステップ:
    green arrow pointer

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

その結果、次のような文章で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アプリケーションの結果の精度

C#(シーシャープ)のためのIronOCR テッセラクトの高度な使用;

現実世界のほとんどのユースケースでは、開発者は自分のプロジェクトで可能な限り最高のパフォーマンスを求めるだろう。 この場合、IronOcr 名前空間内の OcrInput クラスと IronTesseract クラスを使用することをお勧めします。

OcrInput は、OCRジョブの特定の特性を設定する機能を提供します。例えば:

  • JPEG、TIFF、GIF、BMP、PNGなど、ほとんどすべての種類の画像を扱うことができます。
  • PDF文書の全体または一部を取り込む
  • コントラスト、解像度、サイズの向上
  • 回転、スキャンノイズ、デジタルノイズ、傾き、ネガ画像の補正

    IronTesseract

  • 何百ものパッケージ化された言語と言語バリエーションから選ぶ
  • Tesseract 5、4、または3のOCRエンジンを "そのまま "使用可能
  • スクリーンショットか、スニペットか、文書全体か、文書タイプを指定する。
  • バーコードの読み取り
  • 結果の出力先検索可能なPDF、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)
$vbLabelText   $csharpLabel

中程度の画質のスキャンでも100%の精度で使用できる。

TIFFからC# OCRスキャンの例

ご覧のとおり、TIFFのようなスキャン画像からテキスト(オプションでバーコード)を読み取ることは非常に簡単でした。

このOCRジョブは100%の精度を達成します。

OCRは実世界の文書に関しては完璧な科学ではないが、IronTesseractはそれに匹敵するほど優れている。

また、IronOCRがTIFFファイルやPDFドキュメントからテキストを自動的に抽出するなど、複数ページのドキュメントを自動的に読み取ることができることも注目します。

例低品質スキャン


デジタルノイズを含む低解像度スキャンにおけるC# OCR

今度は、同じページを低DPIで、歪みとデジタルノイズが多く、原紙にダメージがある、もっと低画質でスキャンしてみよう。

これがIronOCRがTesseractのような他のOCRライブラリに対して真に輝くところです。我々は、他のOCRプロジェクトが議論を避ける場面を見つけるでしょう。 OCRの精度を100%にするためにデジタルで作成された非現実的な「完璧な」テストケースではなく、現実のスキャン画像でOCRを行う。

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

画像をまっすぐにするためにInput.Deskew()を追加しないと、精度は52.5%になります。 十分ではない。

Input.Deskew() を追加することで、99.8% の精度に達し、これは高品質スキャンのOCRとほぼ同等の精度です。

画像フィルターは実行に少し時間がかかるかもしれないが、OCR処理時間を短縮することもできる。開発者が入力文書を知るには、絶妙なバランスが必要だ。

確信が持てないのであれば:

  • Input.Deskew() は、安全で非常に成功したフィルターです。
  • 次に、かなりのデジタルノイズを修正するためにInput.DeNoise()を試してください。

パフォーマンス・チューニング

OCRジョブのスピードにおいて最も重要な要素は、実は入力画像の品質である。 背景ノイズが少なく、dpiが高いほど、完璧な目標dpiは約200dpiで、最も速く正確なOCR結果が得られる。

しかし、これは必須ではありません。IronOCR は不完全な文書を修正する際に優れているためです(ただし、これは時間がかかり、OCR ジョブがより多くの CPU サイクルを使用する原因となります)。

可能であれば、TIFFやPNGのようにデジタルノイズが少ない入力画像形式を選択すると、JPEGのような損失圧縮の画像形式よりも速い結果が得られることがあります。

イメージフィルター

次のようなイメージフィルターを使用すると、パフォーマンスを向上させることができます:

  • OcrInput.Rotate(double degrees) - イメージを指定した度数だけ時計回りに回転させます。反時計回りにするには、負の数を使用します。
  • OcrInput.Binarize() - この画像フィルターは、すべてのピクセルを中間色なしで黒または白に変換します。 OCRのパフォーマンスをテキストと背景のコントラストが非常に低い場合に改善する可能性があります。
  • OcrInput.ToGrayScale() - この画像フィルターは、すべてのピクセルをグレースケールの階調に変換します。 OCRの精度を向上させる可能性は低いが、速度の向上は期待できる。
  • OcrInput.Contrast() - コントラストを自動的に高めます。 このフィルターは、低コントラストのスキャンにおいて、OCRの速度と精度を向上させることがよくあります。
  • OcrInput.DeNoise() - デジタルノイズを除去します。このフィルターは、ノイズが予測される場合にのみ使用する必要があります。
  • OcrInput.Invert() - すべての色を反転させます。 例えば、白が黒になります:黒が白になります。
  • OcrInput.Dilate() - 高度な形態学。 _Dilation_は、画像内のオブジェクトの境界にピクセルを追加します。 「Erode」の反対語
  • OcrInput.Erode() - 高度な形態学。 Erosion_オブジェクトの境界上のピクセルを取り除くDilateの反対語
  • 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
$vbLabelText   $csharpLabel

この結果はベースラインの100%と比較して99.8%の精度がありますが、35%速くなっています。

画像の切り抜き領域の読み取り

以下のコードサンプルでわかるように、(アイアン)のTesseract OCRのフォークは、画像の特定の領域を読み取ることに長けている。

画像を読み取るための正確な領域をピクセルで指定するために、System.Drawing.Rectangle を使用することができます。

これは、定型化されたフォームに記入され、特定の領域だけがケースごとに変わるテキストを扱う場合に、非常に便利である。

例ページの領域をスキャンする

ドキュメントを読み取る領域を指定するために、System.Drawing.Rectangleを使用できます。 測定単位は常にピクセルです。

これは、速度の向上を提供し、不必要なテキストの読み取りを回避することができることがわかります。 この例では、標準化された文書の中央領域から生徒の名前を読み取ります。

TIFFからC# OCRスキャンの例 どのコンテンツを日本語に翻訳しますか?提供いただいた詳細な内容をお知らせいただければ、迅速かつ正確に翻訳いたします。 TIFFからC# OCRスキャンの例


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

これにより、41%スピードが向上し、具体的に指示を出すことができます。 .NET OCRは、請求書、領収書、小切手、フォーム、経費請求書など、ドキュメントが類似しており、一貫性がある場合に非常に便利です。

PDFを読み取る際にContentAreas(OCRクロッピング)もサポートされています。

国際的な言語

IronOCRは、125の国際的な言語をサポートしており、言語パックはDLLとして配布されています。これらはこのウェブサイトやVisual StudioのNuGetパッケージマネージャーからダウンロードできます。

これらをインストールするには、NuGet で ("IronOcr.Languages" を検索) またはOCR 言語パックのページから行うことができます。

対応言語は以下の通り:

  • アフリカーンス語
  • アムハラ語 別名:አማኛ
  • アラビア語 別名 العربية
  • アラビア文字 別名 العربية
  • アルメニアアルファベット 別名:Հայերեն
  • アッサム語 ⦿ またの名を ⦿
  • アゼルバイジャン語 別名:azərbaycan dili
  • アゼルバイジャン語キリル文字 別名:azərbaycan dili
  • ベラルーシ語 別名 беларуская мова
  • ベンガル語 別名:バングラ語,탕탕লা
  • ベンガル語アルファベット 別名:バングラ語、াল
  • チベット語 別名:チベット標準語、チベット語、中央ཡག་
  • ボスニア語 _別名:bosanski jezik
  • ブルトン人_またの名をブレゾネグ_。
  • ブルガリア語 別名:български език
  • CanadianAboriginalAlphabet _別名:カナディアン・ファースト・ネーションズ、インディヘナ・カナディアン、ネイティブ・カナディアン、イヌイット_カナダ先住民
  • カタロニア語 _カタラ、バレンシアとしても知られる
  • セブアノ語_ビサヤ語、ビニサヤ語としても知られる。
  • チェコ語 _čeština, český jazykとしても知られる。
  • CherokeeAlphabet Also known as ᏣijĹĶᏬIJᎯᏍķ, Tsalagi Gawonihisdi
  • ChineseSimplified または 中文 (Zhōngwén), 汉语, 漢語 としても知られています
  • 中国語簡体縦書き または 中文 (Zhōngwén), 汉语, 漢語 としても知られています
  • 繁体中国語中文(Zhōngwén)、汉语、漢語としても知られる
  • ChineseTraditionalVertical 別名 中文 (Zhōngwén), 汉语, 漢語
  • チェロキー別名:ᏣᎳĹᏂᎯᏣᏍķ, Tsalagi Gawonihisdi
  • コルシカ語 別名:corsu、lingua corsa
  • ウェールズ語 別名 Cymraeg
  • キリル文字 _キリル文字としても知られる。
  • デンマーク語 別名 dansk
  • デンマーク語 別名 dansk
  • ドイツ語 _別名 Deutsch
  • ドイツ語_ドイツ語としても知られている
  • デーヴァナーガリー文字 別名:Nagair, देवनागरी
  • ディベヒ_別名:ދހވެ
  • ゾンカ語 _別名:ར ོང ་ཁ_ཁ
  • ギリシャ語 別名 ελληνικά
  • 英語
  • 中英語(1100年から1500年の英語としても知られる)
  • エスペラント
  • エストニア語 別名:eesti、eesti keel
  • エチオピックのアルファベット 別名:Ge'ez,ግዝ, Gə+əəz
  • バスク語 別名euskara, euskera
  • フェロー語 別名 føroyskt
  • ペルシア語 別名 فارسی
  • フィリピノ語 _別名:フィリピン国語、標準タガログ語_英語
  • フィンランド語 別名:suomi、suomen kieli
  • 財務 _財務書類、数値書類、技術書類としても知られる。
  • フランス語 別名:français、langue française
  • FrakturAlphabet一般的なFrakturとしても知られる、ラテンアルファベットのカリグラフィーの手
  • フランク語 _別名フレンキスク、古フランコニア語
  • 中期フランス語(Moyen Françaisとも呼ばれる)は、中期フランス語(約。 1400-1600 AD)
  • 西フリジア語 _別名フリスク語
  • グルジア語アルファベット 別名 ქართული
  • スコットランド・ゲール語 別名Gàidhlig(ガイドリグ
  • アイルランド語 _ゲール語としても知られる
  • ガリシア語 別名 galego
  • AncientGreek 別名:Ἑληνική
  • ギリシャ文字 別名 ελληνικά
  • グジャラート語 _別名:ગર ીત ી_ગ ી
  • グジャラート語アルファベット _別名:ગુજાતી_જ
  • グルムキー文字 別名:Gurmukhī, ਗ ੁ, ਰ ਮ ੁ ਖ ੀ, Shahmukhi, گُرمُکھی, Sihk Script (グルムキー文字)。
  • ハングル_ハングル、한글、ハングル、조선글、hosŏn'gŭl_としても知られています。
  • HangulVerticalAlphabet _別名:ハングル、한글、ハングル、조선글、hosŏn'gŭl_ハングル縦書きアルファベット
  • 漢簡またの名を三韓、한어、韓語
  • HanSimplifiedVerticalAlphabet 別名:Samhan, 한어, 韓語|日本語検索・英語翻訳サイト
  • 漢語またの名を三韓語、한어、韓語
  • 漢訳縦書アルファベットまたの名を三韓、한어、韓語
  • ハイチ語またの名をKreyòl ayisyen
  • ヘブライ語 עברית としても知られている。
  • ヘブライ語アルファベット 別名 עברית
  • ヒンディー語 別名:हिन्दी, हिंदी
  • クロアチア語 別名 hrvatski jezik
  • ハンガリー語 別名 magyar
  • アルメニア語 別名:Հայերն
  • イヌクティット語 _別名 ᑎᑐᑦᑎᑎᑐᑦᑎᒃ
  • インドネシア語 別名 Bahasa Indonesia
  • アイスランド語 別名 Íslenska
  • イタリア語
  • ItalianOld 別名: italiano
  • JapaneseAlphabet Also known as 日本語 (にほんご)
  • 日本語縦書きアルファベット Also known as 日本語 (にほんご)
  • ジャワ_またの名をバサ・ジャワ_。
  • 日本語 別名 日本語 (にほんご)
  • JapaneseVertical 別名 日本語 (にほんご)
  • カンナダ語 別名 ಕನ ್ಡ
  • KannadaAlphabet _別名:ಕನ್_ಡ
  • グルジア語 ქართული_
  • グルジア語_ქართული_としても知られています。
  • カザフ語 қазақ тілі としても知られている。
  • クメール語 別名:ខ្មែរ, ខេមរភាស, ភŶស្មែរែរ
  • クメール語アルファベット _別名:ខ្ម, ខរűមរ𗅶ស, ភŶសរ_ŲមŲរ_ខ
  • キルギス語 別名:Кыргызча, Кыргыз тили
  • 北クルド語 別名クルマンジ、کورمانجی ,Kurmancî
  • 韓国語 別名として 한국어 (韓國語), 조선어 (朝鮮語)
  • KoreanVertical 韓国語(한국어)、朝鮮語(조선어)としても知られています
  • ラオス人 別名:ພາວ
  • ラオスのアルファベット _別名:ພາວ_ラオスのアルファベット
  • ラテン語 _別名:ラテン語、ラテン言語
  • ラテンアルファベット _別名:ラテン語、ラテン言語
  • ラトビア語 別名 latviešu valoda
  • リトアニア語 別名 lietuvių kalba
  • ルクセンブルク語 別名 Lëtzebuergesch
  • マラヤーラム語 _別名:മലയ ാള ം_യ
  • マラヤーラム語アルファベット _別名:മലയാളം_യ
  • マラーティー語 別名 मारठी
  • MICR _別名:磁気インク文字認識、MICR小切手エンコーディング
  • マケドニア語 別名:македонски јазик
  • マルタ語 _別名:マルティ
  • モンゴル語 別名 монгол
  • マオリ_またの名をテ・レオ・マオリ_。
  • マレー語 バハサ・ムラユとしても知られる بهاس ملايو
  • ミャンマー 別名ビルマ語 ,ဗမာစာ
  • ミャンマー語アルファベット ビルマ語としても知られる ဗမာစာ
  • ネパール語 _नेपालीとしても知られる。
  • オランダ語 別名:Nederlands, Vlaams
  • ノルウェー語 _別名:ノルスク語
  • オック語_オック語としても知られる。
  • オリヤー語 _別名:ଓ습니다
  • オリヤーアルファベット _別名:ଓ습니다
  • パンジャブ語 別名:ਪ↪A70↩ਜੀ, پنجابی
  • ポーランド語 _język polski、polszczyzna_としても知られる。
  • ポルトガル語 _別名:português_ポルトガル語
  • パシュトゥー語 別名 پښتو
  • ケチュア語 _別名:ルナ・シミ、キチュワ語
  • ルーマニア語 別名 limba română
  • ロシア語 別名:русский зык
  • サンスクリット語 _別名:संस्क↪n943↩तम्
  • シンハラ語 _別名:ස↪DC4↩ිහි
  • シンハラ語アルファベット _別名:ස̫හහස
  • スロバキア語 別名 slovenčina, slovenský jazyk
  • SlovakFraktur _別名:slovenčina, slovenský jazyk _スロベニア語
  • スロベニア語 別名 slovenski jezik, slovenščina
  • シンド語 別名:सिन्धी, سنڌي سندھی
  • スペイン語_español, castellanoとしても知られる。
  • スペイン語_español, castellanoとしても知られる。
  • アルバニア語 別名:gjuha shqipe
  • セルビア語 別名 српски језик
  • セルビア語ラテン語 別名 српски језик
  • スンダ_別名:バサ・スンダ
  • スワヒリ語 _別名キスワヒリ語
  • スウェーデン語 _スヴェンスカとしても知られる
  • シリア語 シリア語、シリア語アラム語、ܠܫܢܐ ܣܘܪܝܝܐ, Lešānā Suryāyā としても知られる。
  • SyriacAlphabet シリア語、シリア語アラム語、ܠܫܢܐ ܣܘܪܝܐ, Lešānā Suryāyā としても知られる。
  • タミル語 _別名:தம்_ழ
  • タミル語アルファベット _別名:தம்_த
  • タタール語 別名:татар теле, tatar tele
  • テルグ語 _別名:తెలు ు
  • TeluguAlphabet_別名:త̑ెలు
  • タジク語 別名:тоάик, toğikī, تاجیکی
  • タガログ語 _別名:Wikang Tagalog, ᜏ ᜅ ᜒ ᜃ ᜔ ᜆ ᜄ ᜎ ᜓ ᜄ ᜔_ᜄ
  • タイ語 別名 ไทย
  • Thaanaアルファベット 別名:Taana , Tāna , ތާނނ
  • タイアルファベット 別名 ไทย
  • TibetanAlphabet 別名:チベット標準語、チベット語、中央ཡག་
  • ティグリニャ語 別名 ትግኛ
  • トンガ_別名:ファカ・トンガ
  • トルコ語_Türkçe_としても知られる。
  • ウイグル語 別名:Uyƣurqə, ئۇيغۇرچە.
  • ウクライナ語 別名:українська мова
  • ウルドゥー語 別名 اردو
  • ウズベク語 別名:O'zbek, Ўзбек, أۇزبېك
  • ウズベク・キリル語 別名:O'zbek, Ўзбек, أۇزبېك
  • ベトナム語_別名:Tiếng Việt(ティエン・ヴィエット
  • ベトナム語アルファベット 別名Tiếng Việt
  • イディッシュ語 別名 ייִדיש
  • ヨルバ語_ヨルバとしても知られる。

例アラビア語の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
$vbLabelText   $csharpLabel

例同じ文書内の複数の言語で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
$vbLabelText   $csharpLabel

マルチページ・ドキュメント

IronOCRは、複数のページや画像を単一のOcrResultに結合することができます。 これは、複数の画像からドキュメントを作成する場合に非常に便利です。 IronTesseractのこの特別な機能は、OCR入力から検索可能なPDFやHTMLファイルを作成するのに非常に便利であることは後述します。

IronOcrは、画像、TIFFフレーム、PDFページを1つの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
$vbLabelText   $csharpLabel

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

検索可能な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")
$vbLabelText   $csharpLabel

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

IronTesseractを使って1ページ以上の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")
$vbLabelText   $csharpLabel

HocrのHTMLエクスポート

同様に、OCR結果文書をHocr HTMLにエクスポートすることもできます。 これは、XMLリーダーでパースしたり、視覚的に魅力的なHTMLにマークアップすることができるXML文書です。

これにより、ある程度の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")
$vbLabelText   $csharpLabel

OCRドキュメントのバーコード読み取り

IronOCRは、バーコードや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
$vbLabelText   $csharpLabel

画像からテキストへのOCR結果を詳しく見る

このチュートリアルで最後に見るのは、OCR結果オブジェクトです。 私たちがOCRを読むとき、通常はテキストだけを取り出すことを望むが、IronOCRには実は高度な開発者に役立つかもしれない膨大な情報が含まれている。

OCR結果オブジェクトの中には、反復可能なページのコレクションがある。 各ページには、バーコード、パワーグラフ、テキスト行、単語、文字がある。

これらのオブジェクトは、実際にはそれぞれ「場所」を含んでいる; X座標; Y座標; 幅と高さ; それに関連する画像を検査することができる; フォント名; フォントサイズ;テキストが書かれる方向; テキストの回転; と、IronOCRがその特定の単語、行、段落に対して持っている統計的信頼性。

つまり、開発者は創造性を発揮し、情報を検査したりエクスポートしたりするために、どのような方法でもOCRデータを扱うことができる。

また、.NET OCR結果オブジェクトから、段落、単語、バーコードなどの任意の要素を操作し、画像またはBitMapとしてエクスポートすることもできます。

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

サマリー

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についてさらに詳しくお知りになりたい方は、以下をお勧めします:

ソースコードダウンロード

チャクニット・ビン
ソフトウェアエンジニア
ChaknithはIronXLとIronBarcodeで作業しています。彼はC#と.NETに深い専門知識を持ち、ソフトウェアの改善と顧客サポートを支援しています。ユーザーとの対話から得た彼の洞察は、より良い製品、文書、および全体的な体験に貢献しています。