フッターコンテンツにスキップ
他のコンポーネントと比較する

IronOCRとDynamsoft OCRの比較

光学文字認識、またはOCRは、手書きまたは印刷されたテキストの認識とデジタル化を伴うデータ入力プロセスです。 これは、印刷されたテキストのデジタル写真を他のプログラムで使用可能な文字や数字に変換するために画像解析を使用するコンピュータ技術です。 テキストは文字コードに変換され、コンピュータ上で検索および変更できるようになります。

かつてはすべてのドキュメントが物理的で、将来はすべてのドキュメントがデジタルになるかもしれませんが、現在は変革の途中にあります。 物理的なドキュメントとデジタルドキュメントはこの移行期に共存しており、そのためOCRのような技術は双方向の変換において不可欠です。

ドキュメントの復元、データ入力、アクセシビリティーはOCRの用途の一部に過ぎません。 OCRアプリケーションの大半はスキャンされた書類から派生していますが、写真も時折使用されます。 OCRは資料を再入力するしかない場合に貴重な時間節約となります。 以下はOCRの使用例です:

  • スキャンされたドキュメント、例えばファックスから編集可能なテキストファイルを復元する。
  • 書籍のスキャンを使用して検索可能で編集可能な電子書籍を作成する。
  • スクリーンショット画像を使用してテキストを検索および変更する。
  • テキスト読み上げ技術を使用して視覚障害者が書籍を読む。

これらはOCRの用途の一部に過ぎませんが、広範な業界における技術の柔軟性を示しています。 ほとんどすべての企業の従業員は日常的に大量のドキュメントに依存しているため、ビジネス用途はOCRシステム開発の重要な考慮事項です。

本記事では、最も強力な2つのOCRリーダーを比較します:

  • IronOCR
  • Dynamsoft OCR

IronOCRとDynamsoft OCRは、スキャンされた画像の変換およびPDFドキュメントのOCR処理をサポートする2つの.NET OCRライブラリです。 数行のコードで画像を検索可能なテキストに変換できます。 個々の単語、文字、および段落を取得することもできます。

IronOCR — 優れた特徴

IronOCRは、正確にスキャンされていない画像やPDFドキュメントからテキストを検出、読み取り、解釈する独自の能力を提供します。 IronOCRは、たとえ常に最速であるわけではなくても、低品質のスキャンを自動でシャープにし、傾斜、歪み、背景ノイズ、視点の問題を低減し、解像度とコントラストを向上させることで、ドキュメントや写真からテキストを抽出する最も簡単な方法を提供します。

IronOCRは、開発者が単一または複数ページのスキャンされた画像を送信できるようにし、それがすべてのテキスト、バーコード、およびQR情報を返します。 OCRライブラリのクラスセットは、Webベース、デスクトップ、またはコンソールアプリケーションにOCR機能を追加します。 Tesseract OCR C#、およびnetアプリJPG、PNG、TIFF、PDF、GIF、BMPは入力として使用できるフォーマットの一例です。

IronOCRの光学式文字認識(OCR)エンジンは、多くの一般的なフォント、イタリック体、ウエイト、およびアンダーラインで用意されたテキストを読み取ることができます。 クロッピングクラスにより、OCRは迅速かつ正確に作業できます。 複数ページのドキュメントを扱う際、IronOCRのマルチスレッドエンジンはOCRを加速します。

IronOCR 機能

Tesseractの管理においては、IronOCRは以下の点でユニークです:

  • 純粋な.NETで箱から出してすぐに動作します
  • Tesseractをマシンにインストールする必要はありません
  • 最新のエンジンを実行します:Tesseract 5(およびTesseract 4 & 3)
  • すべての.NETプロジェクトで使用可能:.NET Framework 4.5 +、.NET Standard 2 +、.NET Core 2, 3 & .NET 5
  • 従来のTesseractに比べて精度と速度が向上しています
  • Xamarin、Mono、Azure、Dockerをサポートしています
  • NuGetパッケージを使用して複雑なTesseract辞書システムを管理します
  • PDF、MultiFrame Tiffs、そしてすべての主要な画像フォーマットを設定なしでサポートします
  • 低品質および傾斜したスキャンを修正してTesseractから最良の結果を得ることができます。

Dynamsoft OCR — 機能

Dynamsoft.NET OCRライブラリは、高速で信頼性のある光学式文字認識を提供する.NETコンポーネントです。 C#またはVB.NETで.NETデスクトップアプリケーションを作成するために使用されます。 基本的なOCR APIを使用すると、PDFや写真の不要なテキストをデジタルテキストに変換して編集、検索、アーカイブ、その他に使用するコードを簡単に作成できます。

スキャナーおよびその他のTWAIN準拠デバイスから画像を取得する方法:

  • ネイティブ、バッファーメモリ、ディスクファイル画像転送メカニズムがサポートされています。
  • 自動ドキュメントフィーダーを使用してバッチスキャンが可能です(ADF)。
  • TWAIN属性を使用して一般的なデバイスの機能を変更できます。
  • IfAutoFeed、IfAutoScan、解像度、BitDepth、明るさ、コントラスト、単位、両面、その他の機能を変更可能です。
  • 白紙検出をサポートします。
  • スキャナープロファイルの変更と保存が可能です。

UVCおよびWIA準拠のWebcamから画像をキャプチャ:

  • 選択されたWebカメラから画像をキャプチャする際にライブビデオフィードを表示します。
  • カメラの設定をカスタマイズします:明るさ、コントラスト、色相、飽和、シャープネス、ガンマ、白バランス、バックライト補正、ゲイン、カラーイネーブル、ズーム、フォーカス、露出、絞り、パン、ティルト、ロール。

堅牢な画像の読み込み/表示

  • BMP、JPEG、PNG、TIFF、およびマルチページTIFF形式の画像を読み込むことができます。
  • 画像のズームインとズームアウトがサポートされています。
  • 画像はローカルドライブ、FTPサーバー、HTTPサーバー、またはデータベースから取得できます。
  • .NETイメージングコンポーネントの最も包括的なセットの1つを使用してBMP、JPEG、PNG、およびTIFFの画像デコードを行います。

保存およびアップロード/ダウンロード

  • ファイルストリーム経由で画像を読んだり書いたりできます。
  • キャプチャされた画像をBMP、JPEG、PNG、TIFF、またはマルチページTIFFとしてローカルドライブ、Webサーバー、またはデータベースに保存できます。
  • RLE、G3/G4、LZW、PackBits、TIFF圧縮がサポートされています。
  • HTTPSアップロードとダウンロードをサポートしています。
  • 利用可能な最も広範な .NET イメージング コンポーネント セットの 1 つは、BMP、JPEG、PNG、および TIFF イメージ エンコーディングをサポートしています。
  • 新しく取得した写真を既存の TIFF ファイルに添付できます。

ASP.NET でスキャンした PDF やその他の画像からテキストを読み取る (光学文字認識)

今日の急速に変化する世界では、顧客は仕事が早く完了することを望んでいます。 緊急プロジェクトを抱えるお客様から頻繁にお問い合わせをいただきます。 プロジェクトに画像を含む書類のスキャンが含まれる場合、当社のテクノロジーは画像の内容を簡単に認識し、テキストに変換できます。 光学式文字認識 (OCR) を使用すると、企業の時間とコストを節約できるだけでなく、データ入力エラーも削減できます。

全体として、Tesseract.NET SDKはこのテストに失敗しています。

IronOCR は IronOcr.IronTesseract クラスを使用して OCR 変換を実行します。

この基本的な例では、IronOcr.IronTesseract クラスを使用して画像からテキストを読み取り、その結果を文字列として自動的に返します。

// PM> Install-Package IronOcr
using IronOcr;

class Program
{
    static void Main(string[] args)
    {
        // Create a new instance of the IronTesseract class
        var ironOcr = new IronTesseract();

        // Read the text from the image
        var result = ironOcr.Read(@"img\Screenshot.png");

        // Output the text to the console
        Console.WriteLine(result.Text);
    }
}
// PM> Install-Package IronOcr
using IronOcr;

class Program
{
    static void Main(string[] args)
    {
        // Create a new instance of the IronTesseract class
        var ironOcr = new IronTesseract();

        // Read the text from the image
        var result = ironOcr.Read(@"img\Screenshot.png");

        // Output the text to the console
        Console.WriteLine(result.Text);
    }
}
' PM> Install-Package IronOcr
Imports IronOcr

Friend Class Program
	Shared Sub Main(ByVal args() As String)
		' Create a new instance of the IronTesseract class
		Dim ironOcr = New IronTesseract()

		' Read the text from the image
		Dim result = ironOcr.Read("img\Screenshot.png")

		' Output the text to the console
		Console.WriteLine(result.Text)
	End Sub
End Class
$vbLabelText   $csharpLabel

その結果、次の段落は 100 パーセント正確です。

IronOCRの簡単な例

この簡単な例では、C# OCRライブラリの精度をテストしてPNGからテキストを読み取ります。
画像。 これは非常に基本的なテストですが、チュートリアルが進むにつれて、より複雑になっていきます。

素早い茶色のキツネが怠け者の犬を飛び越える

表面的には単純に見えるかもしれませんが、その裏では、画像の配置、品質、解像度をスキャンし、その属性を確認し、OCR エンジンを最適化し、最後に人間と同じようにテキストを読み取るという高度な動作が行われています。

OCR は機械にとって難しい作業であり、読み取り速度は人間の速度に匹敵する場合があります。 言い換えれば、OCR は迅速な手順ではありません。 しかし、この場合はそれは完全に正しいです。

C# OCRアプリケーションの結果の精度

実際のほとんどのシナリオでは、開発者はプロジェクトをできるだけ早く実行したいと考えています。 このシナリオでは、代わりに IronOCR アドオン名前空間の OcrInput クラスと IronTesseract クラスを利用することをお勧めします。

OcrInput を使用すると、次のような OCR ジョブの正確な機能を設定できます。

  • JPEG、TIFF、GIF、BMP、PNGは使用できる画像形式のほんの一部です。
  • PDF文書全体または一部をインポートする
  • 画像のコントラスト、解像度、サイズを向上させる
  • 回転、スキャンノイズ、デジタルノイズ、スキュー、ネガティブ画像補正

アイアンテッセラクト

数百のパッケージ化された言語と方言から選択

  • Tesseract 5、4、または3 OCRエンジンをすぐに使用
  • スクリーンショット、スニペット、またはドキュメント全体を表示する場合は、ドキュメントの種類を指定します
  • バーコードを認識する
  • 検索可能なPDF、Hocr HTML、DOM、文字列はすべてOCR結果のオプションです
using IronOcr;

class Program
{
    static void Main(string[] args)
    {
        // Create an instance of IronTesseract
        var ocr = new IronTesseract();

        // Use the OcrInput class to read from an image file
        using (var input = new OcrInput(@"img\Potter.tiff"))
        {
            // Perform the OCR operation
            var result = ocr.Read(input);

            // Output the recognized text to the console
            Console.WriteLine(result.Text);
        }
    }
}
using IronOcr;

class Program
{
    static void Main(string[] args)
    {
        // Create an instance of IronTesseract
        var ocr = new IronTesseract();

        // Use the OcrInput class to read from an image file
        using (var input = new OcrInput(@"img\Potter.tiff"))
        {
            // Perform the OCR operation
            var result = ocr.Read(input);

            // Output the recognized text to the console
            Console.WriteLine(result.Text);
        }
    }
}
Imports IronOcr

Friend Class Program
	Shared Sub Main(ByVal args() As String)
		' Create an instance of IronTesseract
		Dim ocr = New IronTesseract()

		' Use the OcrInput class to read from an image file
		Using input = New OcrInput("img\Potter.tiff")
			' Perform the OCR operation
			Dim result = ocr.Read(input)

			' Output the recognized text to the console
			Console.WriteLine(result.Text)
		End Using
	End Sub
End Class
$vbLabelText   $csharpLabel

中品質のスキャンでも 100% の精度で使用できます。

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

ご覧のとおり、TIFF などのスキャンされた画像からテキスト (および必要に応じてバーコード) を読み取るのはかなり簡単でした。 この OCR ジョブの精度は 100 パーセントです。

次に、同じページを低 DPI で、歪みやデジタル ノイズが多く、元の紙に損傷がある状態で、はるかに低品質にスキャンしてみます。

C# OCR デジタルノイズ付き低解像度スキャン

これは、Tesseract などの他の OCR ライブラリと比較して IronOCR が真に優れている点です。他の OCR プロジェクトでは、100% の OCR 精度を達成するためにデジタルで作成された非現実的に"完璧な"テスト ケースではなく、実際のスキャンされたイメージでの OCR の使用について議論することを避けていることがわかります。

using IronOcr;

class Program
{
    static void Main(string[] args)
    {
        // Create an instance of IronTesseract
        var ocr = new IronTesseract();

        // Use the OcrInput class to read from a low-quality image file
        using (var input = new OcrInput(@"img\Potter.LowQuality.tiff"))
        {
            // Deskew the image to improve accuracy
            input.Deskew();

            // Perform the OCR operation
            var result = ocr.Read(input);

            // Output the recognized text to the console
            Console.WriteLine(result.Text);
        }
    }
}
using IronOcr;

class Program
{
    static void Main(string[] args)
    {
        // Create an instance of IronTesseract
        var ocr = new IronTesseract();

        // Use the OcrInput class to read from a low-quality image file
        using (var input = new OcrInput(@"img\Potter.LowQuality.tiff"))
        {
            // Deskew the image to improve accuracy
            input.Deskew();

            // Perform the OCR operation
            var result = ocr.Read(input);

            // Output the recognized text to the console
            Console.WriteLine(result.Text);
        }
    }
}
Imports IronOcr

Friend Class Program
	Shared Sub Main(ByVal args() As String)
		' Create an instance of IronTesseract
		Dim ocr = New IronTesseract()

		' Use the OcrInput class to read from a low-quality image file
		Using input = New OcrInput("img\Potter.LowQuality.tiff")
			' Deskew the image to improve accuracy
			input.Deskew()

			' Perform the OCR operation
			Dim result = ocr.Read(input)

			' Output the recognized text to the console
			Console.WriteLine(result.Text)
		End Using
	End Sub
End Class
$vbLabelText   $csharpLabel

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

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

Dynamsoft OCRの使用

Dynamic Web TWAIN を使用して JavaScript で TWAIN スキャンとクライアント側 OCR を実行するためのコード スニペットをいくつか紹介します。

画像をスキャン

Dynamic Web TWAIN のシンプルな API を使用して、スキャン設定を変更したり、TWAIN スキャナーから写真を取得したりできます。

function acquireImage() {
    // Select an available TWAIN scanner
    DWObject.SelectSourceByIndex(document.getElementById("source").selectedIndex);

    // Set scanning settings like pixel type, resolution, ADF, etc.
    DWObject.IfShowUI = false; // Do not show the user interface of the scanner
    DWObject.PixelType = 1; // Scan in grayscale
    DWObject.Resolution = 300;
    DWObject.IfFeederEnabled = true; // Scan from auto feeder
    DWObject.IfDuplexEnabled = false;
    DWObject.IfDisableSourceAfterAcquire = true;

    // Acquire images from scanners
    DWObject.AcquireImage();
}
function acquireImage() {
    // Select an available TWAIN scanner
    DWObject.SelectSourceByIndex(document.getElementById("source").selectedIndex);

    // Set scanning settings like pixel type, resolution, ADF, etc.
    DWObject.IfShowUI = false; // Do not show the user interface of the scanner
    DWObject.PixelType = 1; // Scan in grayscale
    DWObject.Resolution = 300;
    DWObject.IfFeederEnabled = true; // Scan from auto feeder
    DWObject.IfDuplexEnabled = false;
    DWObject.IfDisableSourceAfterAcquire = true;

    // Acquire images from scanners
    DWObject.AcquireImage();
}
JAVASCRIPT

OCRプロフェッショナルモジュールをダウンロード

クライアント側 OCR に OCR Professional モジュールを使用するには、ヘッダーにocrpro.jsを含め、OCR Pro DLL もダウンロードする必要があります。

<script type="text/javascript" src="Resources/addon/dynamsoft.webtwain.addon.ocrpro.js"></script>
<script type="text/javascript" src="Resources/addon/dynamsoft.webtwain.addon.ocrpro.js"></script>
HTML

.js ファイルを編集します。

// Define base path
var CurrentPathName = unescape(location.pathname);
var CurrentPath = CurrentPathName.substring(0, CurrentPathName.lastIndexOf("/") + 1);

// Download the OCR Pro add-on
DWObject.Addon.OCRPro.Download(CurrentPath + "Resources/addon/OCRPro.zip", OnSuccess, OnFailure);
// Define base path
var CurrentPathName = unescape(location.pathname);
var CurrentPath = CurrentPathName.substring(0, CurrentPathName.lastIndexOf("/") + 1);

// Download the OCR Pro add-on
DWObject.Addon.OCRPro.Download(CurrentPath + "Resources/addon/OCRPro.zip", OnSuccess, OnFailure);
JAVASCRIPT

OCRを使用してテキストを認識する

JS OCR 認識 API を使用してスキャンした画像からテキストを抽出するのは、以下のコードを挿入するだけです。

// Recognize text from the image at index 0
DWObject.Addon.OCRPro.Recognize(0, GetOCRProInfo, GetErrorInfo); // 0 is the index of the image
// Recognize text from the image at index 0
DWObject.Addon.OCRPro.Recognize(0, GetOCRProInfo, GetErrorInfo); // 0 is the index of the image
JAVASCRIPT

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

どちらのソフトウェア セットも、OCR 用に画像を切り抜くソリューションを提供します。

IronOCRで切り取られた領域を読み取る

Iron の Tesseract OCR ブランチは、次のコード サンプルに示すように、画像の特定の領域の読み取りに適しています。

System.Drawing.Rectangleを使用して、読み取る画像の正確な領域をピクセル単位で記述します。

標準化されたフォームに入力し、その内容の一部のみがケースごとに変更される場合、これは非常に便利です。

ページのセクションのスキャン: System.Drawing.Rectangleを使用してドキュメントから読み取る領域を指定し、速度と精度を向上させます。

C# TIFFからのOCRスキャンの例
C# TIFFからのOCRスキャンの例
using IronOcr;
using System.Drawing;

class Program
{
    static void Main(string[] args)
    {
        // Create an instance of IronTesseract
        var ocr = new IronTesseract();

        using (var input = new OcrInput())
        {
            // Define content area of interest
            var contentArea = new Rectangle() { X = 215, Y = 1250, Height = 280, Width = 1335 };

            // Add the specific region to the input
            input.AddImage("img/ComSci.png", contentArea);

            // Perform OCR operation
            var result = ocr.Read(input);

            // Output recognized text to console
            Console.WriteLine(result.Text);
        }
    }
}
using IronOcr;
using System.Drawing;

class Program
{
    static void Main(string[] args)
    {
        // Create an instance of IronTesseract
        var ocr = new IronTesseract();

        using (var input = new OcrInput())
        {
            // Define content area of interest
            var contentArea = new Rectangle() { X = 215, Y = 1250, Height = 280, Width = 1335 };

            // Add the specific region to the input
            input.AddImage("img/ComSci.png", contentArea);

            // Perform OCR operation
            var result = ocr.Read(input);

            // Output recognized text to console
            Console.WriteLine(result.Text);
        }
    }
}
Imports IronOcr
Imports System.Drawing

Friend Class Program
	Shared Sub Main(ByVal args() As String)
		' Create an instance of IronTesseract
		Dim ocr = New IronTesseract()

		Using input = New OcrInput()
			' Define content area of interest
			Dim contentArea = New Rectangle() With {
				.X = 215,
				.Y = 1250,
				.Height = 280,
				.Width = 1335
			}

			' Add the specific region to the input
			input.AddImage("img/ComSci.png", contentArea)

			' Perform OCR operation
			Dim result = ocr.Read(input)

			' Output recognized text to console
			Console.WriteLine(result.Text)
		End Using
	End Sub
End Class
$vbLabelText   $csharpLabel

これにより、速度が 41 パーセント向上し、より具体的な指定も可能になります。 これは、請求書、領収書、小切手、フォーム、経費請求書など、比較可能で一貫性のあるドキュメントを扱う .NET OCR アプリケーションにとって非常に役立ちます。

PDF の読み取り時には、ContentAreas (OCR 切り取り) もサポートされます。

Dynamsoft OCRで切り取られた領域を読み取る

まず、Visual Studio を起動して新しい C# Windows フォーム アプリケーションをビルドするか、既存のアプリケーションを開きます。 DynamicDotNetTWAIN.dllDynamicOCR.dll 、および適切な言語パッケージを含める必要があります。

  1. [ツール] -> [ツールボックス アイテムの選択] に移動し、[.NET Framework コンポーネント] タブで [参照] ボタンをクリックし、 DynamicDotNetTWAIN.dllを見つけます。

  2. ソリューション エクスプローラーでプロジェクト ファイルを右クリックし、[追加] -> [既存の項目...] を選択します。 次に、OCR リソース ディレクトリから必要な項目を追加します。

これは LoadImage ボタンをクリックするためのコードです。

private void button1_Click(object sender, EventArgs e) 
{
    OpenFileDialog filedlg = new OpenFileDialog(); 
    if (filedlg.ShowDialog() == DialogResult.OK) 
    { 
        dynamicDotNetTwain1.LoadImage(filedlg.FileName);
        // Choose an image from your local disk and load it into Dynamic .NET TWAIN
    } 
}

private void dynamicDotNetTwain1_OnImageAreaSelected(short sImageIndex, int left, int top, int right, int bottom) 
{
    dynamicDotNetTwain1.OCRTessDataPath = "../../"; 
    dynamicDotNetTwain1.OCRLanguage = "eng";
    OcrResultFormat ocrResultFormat = Dynamsoft.DotNet.TWAIN.OCR.ResultFormat.Text;

    byte [] sbytes = dynamicDotNetTwain1.OCR(dynamicDotNetTwain1.CurrentImageIndexInBuffer, left, top, right, bottom);
    // OCR the selected area of the image

    if (sbytes != null) 
    { 
        SaveFileDialog filedlg = new SaveFileDialog(); 
        filedlg.Filter = "Text File(*.txt)| *.txt"; 
        if (filedlg.ShowDialog() == DialogResult.OK) 
        {
            FileStream fs = File.OpenWrite(filedlg.FileName); 
            fs.Write(sbytes, 0, sbytes.Length);
            // Save the OCR result as a text file
            fs.Close(); 
        }
        MessageBox.Show("OCR successful");
    } 
    else 
    {
        MessageBox.Show(dynamicDotNetTwain1.ErrorString); 
    }
}
private void button1_Click(object sender, EventArgs e) 
{
    OpenFileDialog filedlg = new OpenFileDialog(); 
    if (filedlg.ShowDialog() == DialogResult.OK) 
    { 
        dynamicDotNetTwain1.LoadImage(filedlg.FileName);
        // Choose an image from your local disk and load it into Dynamic .NET TWAIN
    } 
}

private void dynamicDotNetTwain1_OnImageAreaSelected(short sImageIndex, int left, int top, int right, int bottom) 
{
    dynamicDotNetTwain1.OCRTessDataPath = "../../"; 
    dynamicDotNetTwain1.OCRLanguage = "eng";
    OcrResultFormat ocrResultFormat = Dynamsoft.DotNet.TWAIN.OCR.ResultFormat.Text;

    byte [] sbytes = dynamicDotNetTwain1.OCR(dynamicDotNetTwain1.CurrentImageIndexInBuffer, left, top, right, bottom);
    // OCR the selected area of the image

    if (sbytes != null) 
    { 
        SaveFileDialog filedlg = new SaveFileDialog(); 
        filedlg.Filter = "Text File(*.txt)| *.txt"; 
        if (filedlg.ShowDialog() == DialogResult.OK) 
        {
            FileStream fs = File.OpenWrite(filedlg.FileName); 
            fs.Write(sbytes, 0, sbytes.Length);
            // Save the OCR result as a text file
            fs.Close(); 
        }
        MessageBox.Show("OCR successful");
    } 
    else 
    {
        MessageBox.Show(dynamicDotNetTwain1.ErrorString); 
    }
}
Private Sub button1_Click(ByVal sender As Object, ByVal e As EventArgs)
	Dim filedlg As New OpenFileDialog()
	If filedlg.ShowDialog() = DialogResult.OK Then
		dynamicDotNetTwain1.LoadImage(filedlg.FileName)
		' Choose an image from your local disk and load it into Dynamic .NET TWAIN
	End If
End Sub

Private Sub dynamicDotNetTwain1_OnImageAreaSelected(ByVal sImageIndex As Short, ByVal left As Integer, ByVal top As Integer, ByVal right As Integer, ByVal bottom As Integer)
	dynamicDotNetTwain1.OCRTessDataPath = "../../"
	dynamicDotNetTwain1.OCRLanguage = "eng"
	Dim ocrResultFormat As OcrResultFormat = Dynamsoft.DotNet.TWAIN.OCR.ResultFormat.Text

	Dim sbytes() As Byte = dynamicDotNetTwain1.OCR(dynamicDotNetTwain1.CurrentImageIndexInBuffer, left, top, right, bottom)
	' OCR the selected area of the image

	If sbytes IsNot Nothing Then
		Dim filedlg As New SaveFileDialog()
		filedlg.Filter = "Text File(*.txt)| *.txt"
		If filedlg.ShowDialog() = DialogResult.OK Then
			Dim fs As FileStream = File.OpenWrite(filedlg.FileName)
			fs.Write(sbytes, 0, sbytes.Length)
			' Save the OCR result as a text file
			fs.Close()
		End If
		MessageBox.Show("OCR successful")
	Else
		MessageBox.Show(dynamicDotNetTwain1.ErrorString)
	End If
End Sub
$vbLabelText   $csharpLabel

アプリケーションの外観は次のようになります。

Dynamic .NET TWAIN OCR SDK を使用した Zone OCR のデモ アプリ

画像パフォーマンスのチューニング

入力画像の品質は、OCR タスクの速度を決定する最も重要な要素です。 背景ノイズが低く、dpi が高いほど (目標値は約 200 dpi)、OCR 出力はより高速かつ正確になります。

Dynamsoft OCRの画像処理技術

携帯電話でクレジットカード番号をスキャンしたり、紙の文書からテキストを抽出したりするなど、さまざまな状況で OCR を使用する必要があります。 OCR 機能は、Dynamsoft Label Recognition (DLR) および Dynamic Web TWAIN (DWT) に含まれています。

一般的に優れた性能を発揮しますが、さまざまな画像処理技術を使用することで、さらに成果を向上させることができます。

影を明るくする/消す

照明が不十分だと OCR の結果に影響が出る可能性があります。 結果を改善するために、写真を白くしたり、画像から影を取り除いたりすることができます。

Invert

OCR エンジンは暗い色のテキストを対象にトレーニングされることが多いため、明るい色のテキストは検出して認識するのが難しくなります。

明るいテキスト

色を反転すると認識しやすくなります

ライトテキストが反転しました

反転を実行するには、DLR のGrayscaleTransformationModesパラメータを使用できます。

JSON 設定は次のとおりです。

"GrayscaleTransformationModes": [
    {
        "Mode": "DLR_GTM_INVERTED"
    }
]

DLR .netの読み取り結果:

ライトテキスト結果

Rescale

文字の高さが低すぎると、OCR エンジンが適切な結果を生成しない可能性があります。 一般に、画像の DPI は少なくとも 300 である必要があります。

DLR 1.1 には、文字を拡大できるScaleUpModesパラメータがあります。 もちろん、画像の拡大縮小は自分で行うこともできます。

画像を直接読み取ると、間違った結果になります。

1x画像

画像を 2 倍に拡大すると、結果は正しくなります。

2倍の画像

Deskew

文字が多少歪んでいても大丈夫です。 しかし、それが過度に歪んでいる場合、結果は悪くなるでしょう。 結果を改善するには、画像をトリミングする必要があります。

これを実現するには、OpenCV と Python の Hough Line Transform を使用できます。

上記の画像の傾きを修正するコードは次のとおりです。

import cv2
import numpy as np
import math
from PIL import Image

def deskew():
    src = cv2.imread("neg.jpg", cv2.IMREAD_COLOR)
    gray = cv2.cvtColor(src, cv2.COLOR_BGR2GRAY)
    kernel = np.ones((5,5), np.uint8)
    erode_img = cv2.erode(gray, kernel)
    eroDil = cv2.dilate(erode_img, kernel)
    show_and_wait_key("eroDil", eroDil)

    canny = cv2.Canny(eroDil, 50, 150)
    show_and_wait_key("canny", canny)

    lines = cv2.HoughLinesP(canny, 0.8, np.pi / 180, 90, minLineLength=100, maxLineGap=10)
    drawing = np.zeros(src.shape[:], dtype=np.uint8)

    maxY = 0
    degree_of_bottomline = 0
    index = 0
    for line in lines:
        x1, y1, x2, y2 = line[0]
        cv2.line(drawing, (x1, y1), (x2, y2), (0, 255, 0), 1, lineType=cv2.LINE_AA)
        k = float(y1-y2)/(x1-x2)
        degree = np.degrees(math.atan(k))
        if index == 0:
            maxY = y1
            degree_of_bottomline = degree
        else:        
            if y1 > maxY:
                maxY = y1
                degree_of_bottomline = degree
        index += 1
    show_and_wait_key("houghP", drawing)

    img = 画像。fromarray(src)
    rotate_img = img.rotate(degree_of_bottomline)
    rotate_img_cv = np.array(rotate_img)
    cv2.imshow("rotateImg", rotate_img_cv)
    cv2.imwrite("deskewed.jpg", rotate_img_cv)
    cv2.waitKey()

def show_and_wait_key(win_name, img):
    cv2.imshow(win_name, img)
    cv2.waitKey()

if __name__ == "__main__":
    deskew()
import cv2
import numpy as np
import math
from PIL import Image

def deskew():
    src = cv2.imread("neg.jpg", cv2.IMREAD_COLOR)
    gray = cv2.cvtColor(src, cv2.COLOR_BGR2GRAY)
    kernel = np.ones((5,5), np.uint8)
    erode_img = cv2.erode(gray, kernel)
    eroDil = cv2.dilate(erode_img, kernel)
    show_and_wait_key("eroDil", eroDil)

    canny = cv2.Canny(eroDil, 50, 150)
    show_and_wait_key("canny", canny)

    lines = cv2.HoughLinesP(canny, 0.8, np.pi / 180, 90, minLineLength=100, maxLineGap=10)
    drawing = np.zeros(src.shape[:], dtype=np.uint8)

    maxY = 0
    degree_of_bottomline = 0
    index = 0
    for line in lines:
        x1, y1, x2, y2 = line[0]
        cv2.line(drawing, (x1, y1), (x2, y2), (0, 255, 0), 1, lineType=cv2.LINE_AA)
        k = float(y1-y2)/(x1-x2)
        degree = np.degrees(math.atan(k))
        if index == 0:
            maxY = y1
            degree_of_bottomline = degree
        else:        
            if y1 > maxY:
                maxY = y1
                degree_of_bottomline = degree
        index += 1
    show_and_wait_key("houghP", drawing)

    img = 画像。fromarray(src)
    rotate_img = img.rotate(degree_of_bottomline)
    rotate_img_cv = np.array(rotate_img)
    cv2.imshow("rotateImg", rotate_img_cv)
    cv2.imwrite("deskewed.jpg", rotate_img_cv)
    cv2.waitKey()

def show_and_wait_key(win_name, img):
    cv2.imshow(win_name, img)
    cv2.waitKey()

if __name__ == "__main__":
    deskew()
PYTHON

検出された行:

検出された線

傾き:

歪んだ画像

IronOCRの画像処理技術

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() — 高度な形態学。 膨張は、画像内のオブジェクトの端にピクセルを追加するプロセスです。 (Inverse of Erode)
  • OcrInput.Erode() — 高度な形態学関数。 侵食は、オブジェクトの端からピクセルを除去するプロセスです。 (Inverse of Dilate)
  • OcrInput.Deskew() — 画像を直交かつ正しい向きになるように回転します。Tesseractはスキャンの傾きを5度まで許容できるため、OCR処理に非常に便利です。
  • DeepCleanBackgroundNoise() — 大量の背景ノイズを除去します。このフィルターは、鮮明な文書のOCR精度を低下させる可能性があり、CPU負荷も非常に高いため、文書に大量の背景ノイズが含まれていることが分かっている場合にのみ使用してください。
  • OcrInput.EnhanceResolution — 低解像度の写真の解像度を向上します。 OcrInputのため、このフィルターはほとんど使用されません。 OcrInput低解像度を自動的に検出して解決します。

高品質のスキャンで OCR を高速化するには、IronTesseract を使用することをお勧めします。 速度を重視する場合は、ここから始めて、適切なバランスが得られるまで機能を再度オンにしていくとよいでしょう。

using IronOcr;

class Program
{
    static void Main(string[] args)
    {
        var ocr = new IronTesseract();

// Configuration for speed tuning
        ocr.Configuration.BlackListCharacters = "~`$#^*_}{][|\\";
        ocr.Configuration.PageSegmentationMode = TesseractPageSegmentationMode.Auto;
        ocr.Configuration.TesseractVersion = TesseractVersion.Tesseract5;
        ocr.Configuration.EngineMode = TesseractEngineMode.LstmOnly;
        ocr.Language = OcrLanguage.EnglishFast;

        using (var input = new OcrInput(@"img\Potter.tiff"))
        {
            var result = ocr.Read(input);
            Console.WriteLine(result.Text);
        }
    }
}
using IronOcr;

class Program
{
    static void Main(string[] args)
    {
        var ocr = new IronTesseract();

// Configuration for speed tuning
        ocr.Configuration.BlackListCharacters = "~`$#^*_}{][|\\";
        ocr.Configuration.PageSegmentationMode = TesseractPageSegmentationMode.Auto;
        ocr.Configuration.TesseractVersion = TesseractVersion.Tesseract5;
        ocr.Configuration.EngineMode = TesseractEngineMode.LstmOnly;
        ocr.Language = OcrLanguage.EnglishFast;

        using (var input = new OcrInput(@"img\Potter.tiff"))
        {
            var result = ocr.Read(input);
            Console.WriteLine(result.Text);
        }
    }
}
Imports IronOcr

Friend Class Program
	Shared Sub Main(ByVal args() As String)
		Dim ocr = New IronTesseract()

' Configuration for speed tuning
		ocr.Configuration.BlackListCharacters = "~`$#^*_}{][|\"
		ocr.Configuration.PageSegmentationMode = TesseractPageSegmentationMode.Auto
		ocr.Configuration.TesseractVersion = TesseractVersion.Tesseract5
		ocr.Configuration.EngineMode = TesseractEngineMode.LstmOnly
		ocr.Language = OcrLanguage.EnglishFast

		Using input = New OcrInput("img\Potter.tiff")
			Dim result = ocr.Read(input)
			Console.WriteLine(result.Text)
		End Using
	End Sub
End Class
$vbLabelText   $csharpLabel

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

ライセンスと価格

Dynamsoft のライセンスと価格

年間ライセンス。 すべての料金には、無料のソフトウェア アップグレードとプレミアム サポートを含む 1 年間のメンテナンスが含まれています。

Dynamsoft は次の 2 種類のライセンスを提供しています。

クライアントデバイスライセンスごと

"1クライアントデバイスライセンス"は、同一オリジン(同一プロトコル、同一ホスト、同一ポート)のアプリケーションへのアクセスを提供し、単一のクライアントデバイスからソフトウェアの機能を使用できます。非アクティブなクライアントデバイスとは、90日間連続してソフトウェア機能にアクセスしていないデバイスを指します。 非アクティブなクライアントデバイスのライセンスシートは即座に解放され、他のアクティブなクライアントデバイスで使用できるようになります。ライセンスシートの最大数に達した場合、Dynamsoftは緊急使用のためにクライアントデバイス割り当ての10%を追加提供します。 追加のクライアント デバイスの許容量が使い果たされると、ライセンス シートが再び利用可能になるまで、新しいクライアント デバイスはソフトウェアにアクセスして使用できなくなります。 クライアント デバイスの許容量を超過しても、すでにライセンスが付与されているクライアント デバイスには影響がないことをご留意ください。

サーバーごとのライセンス

アプリケーションを単一のサーバーに展開するには、"1 サーバー ライセンス"が必要です。 サーバーは物理サーバーと仮想サーバーの両方を指し、運用サーバー、フェイルオーバー サーバー、テストにも使用される開発サーバー、品質保証サーバー、テスト サーバー、ステージング サーバーなどが含まれますが、これらに限定されません。これらすべてにライセンスが必要です。 継続的インテグレーション サーバー (ビルド サーバー) またはローカルホスト開発サーバーには追加のライセンスは必要ありません。 サーバーごとのライセンスはオンプレミスのサーバー インストールに対してのみ有効であり、クラウド展開に対しては有効ではありません。

Dynamsoft OCR の価格は年間 1,249 ドルから始まります。

IronOCRのライセンスと価格

開発者として、私たちは皆、可能な限り最小限の資金とリソースでプロジェクトを達成したいと考えています。そのため、予算編成は非常に重要です。 表を調べて、どのライセンスが要件と予算に最も適しているかを判断します。

IronOCR は、開発者、プロジェクト、場所の数をカスタマイズできるライセンスを提供しているため、必要な範囲に対してのみ料金を支払いながらプロジェクトのニーズを満たすことができます。

IronOCR ライセンス キーを使用すると、透かしなしで製品を公開できます。

ライセンスは$799から始まり、1 年間のサポートとアップグレードが含まれます。

試用ライセンス キーを使用して IronOCR を無料で試すこともできます。

結論

Mac、Windows、Linux 上の Tesseract OCR、Azure OCR、Docker はすべて、C# 用の IronOCR で利用できます。 .NET Framework 4.0 以上が必要です。.NET Standard 2.0+、.NET Core 2.0+、.NET 5、macOS および Linux 用の Mono、macOS 用の Xamarin はすべてクロスプラットフォーム開発の例です。 IronOCR は最新の Tesseract 5 エンジンを使用して、すべての主要な画像および PDF 形式からテキスト、バーコード、QR コードを読み取ります。 このライブラリを使えば、デスクトップ、コンソール、ウェブアプリにわずか数分でOCR機能を追加できます。OCRはPDFや複数ページのTIFFも読み取ることができ、OCRスキャンで検索可能なPDFドキュメントまたはXHTMLとして保存できます。 データ出力の選択肢には、プレーンテキスト、バーコード データ、段落、行、単語、文字を含む OCR 結果クラスなどがあります。 アラビア語、中国語、英語、フィンランド語、フランス語、ドイツ語、ヘブライ語、イタリア語、日本語、韓国語、ポルトガル語、ロシア語、スペイン語を含む 125 の言語で利用できますが、カスタム言語パックも生成できることに留意してください。

Dynamic .NET TWAIN OCR アドオンは、C# または VB .NET で記述された WinForms および WPF アプリケーションで使用できる、光学式文字認識用の高速で信頼性の高い .NET コンポーネントです。 Dynamic .NET TWAIN の画像キャプチャ モジュールを使用してドキュメントをスキャンしたり、Web カメラから写真をキャプチャしたりし、画像に対して OCR を実行して、画像内のテキストをテキスト、検索可能な PDF ファイル、または文字列に変換できます。 英語に加えて、アラビア語など複数のアジア言語も提供されています。

IronOCR は Dynamsoft OCR よりも優れたライセンスを提供します。 IronOcr は 1 年間の無料期間付きで$799から始まり、Dynamsoft は無料トライアル付きで $1249 から始まります。 IronOCR は複数のユーザー向けのライセンスも提供していますが、Dynamsoft ではユーザーごとにライセンスが 1 つしか提供されません。

どちらのソフトウェア セットも、バーコードの OCR 読み取り、画像からテキストへの変換、画像からテキストへの変換に関して最高のパフォーマンスを提供することを目指していますが、IronOCR は、状態がかなり悪い画像でも優れた性能を発揮する点で際立っています。 洗練されたチューニング方法を自動的に導入し、最高の OCR 結果を提供します。 IronOCR は Tesseract も利用して、エラーがほとんどまたは全くない最適な結果を提供します。

Iron Software は、顧客とユーザーに対し、わずか 2 回のクリックでソフトウェア スイート全体を入手できるオプションも提供しています。 つまり、Iron Software スイートのコンポーネント 2 つの価格で、現在 5 つのコンポーネントすべてと中断のないサポートを入手できることになります。

ご注意Dynamsoft OCR は、それぞれの所有者の登録商標です。 このサイトは、Dynamsoft OCR と提携、承認、または後援されていません。 すべての製品名、ロゴ、およびブランドは各所有者の所有物です。 比較は情報提供のみを目的としており、執筆時点で公開されている情報を反映しています。

よくある質問

テキストの画像をC#を使用してデジタル形式に変換するにはどうすればよいですか?

C#でIronOCRを利用して、テキストの画像をデジタル形式に変換することができます。IronOCRは、低品質のスキャンを自動的にシャープにし、補正するためのメソッドを提供し、さまざまな画像形式をテキストに変換するのに最適です。

IronOCRは、低品質のスキャンを扱う際にどのような利点を提供しますか?

IronOCRは、傾き、歪み、背景ノイズを減らしながら、解像度とコントラストを改善することで、低品質のスキャンを自動的に強化し、テキスト認識の精度を高めます。

クロスプラットフォームアプリケーションに適したOCRライブラリはどれですか?

IronOCRは、XamarinやAzureのような環境をサポートしており、さまざまなプラットフォームで作業する開発者に柔軟性を提供するため、クロスプラットフォームアプリケーションに適しています。

IronOCRはどのような画像形式をサポートしていますか?

IronOCRは幅広い画像形式をサポートしており、さまざまなOCRアプリケーションに対応することで、柔軟性を提供します。画像やPDFドキュメントを処理でき、さまざまな入力ソースを扱うことが可能です。

OCR技術は企業の文書管理に役立ちますか?

はい、OCR技術は物理的な文書をデジタル化し、検索可能で編集可能にすることで文書管理を大幅に改善します。これにより手動でのデータ入力が減り、エラーが最小限に抑えられ、アクセス性が向上します。

Dynamsoft OCRはデバイスからの画像取得をどのように処理しますか?

Dynamsoft OCRはTWAIN準拠のデバイスやウェブカメラからの画像取得をサポートしており、効率的な画像処理のためにバッチスキャンとスキャナー属性の変更が可能です。

IronOCRの価格設定オプションは他のライブラリと比べてどのようですか?

IronOCRは開発者の数、プロジェクト、場所に応じてカスタマイズ可能なライセンスを提供し、他のライブラリと比較してより柔軟かつコスト効率の良いオプションを提供します。

OCR技術を使用するときに直面する一般的な問題は何ですか?

OCR技術に関する一般的な問題には、低解像度の画像、歪み、さまざまなテキストフォントの処理があります。しかし、IronOCRのようなライブラリにはこれらの問題を解決するための内蔵機能があり、OCRの精度を向上させます。

Kannaopat Udonpant
ソフトウェアエンジニア
ソフトウェアエンジニアになる前に、Kannapatは北海道大学で環境資源の博士号を修了しました。博士号を追求する間に、彼はバイオプロダクションエンジニアリング学科の一部である車両ロボティクスラボラトリーのメンバーになりました。2022年には、C#のスキルを活用してIron Softwareのエンジニアリングチームに参加し、IronPDFに注力しています。Kannapatは、IronPDFの多くのコードを執筆している開発者から直接学んでいるため、この仕事を大切にしています。同僚から学びながら、Iron Softwareでの働く社会的側面も楽しんでいます。コードやドキュメントを書いていない時は、KannapatはPS5でゲームをしたり、『The Last of Us』を再視聴したりしていることが多いです。