跳過到頁腳內容
與其他組件的比較

IronOCR 和 Dynamsoft OCR 之間的比較

光學字符識別(OCR)是一種數據輸入過程,涉及識別和數字化書寫和印刷的文本。 它是一種計算機技術,利用圖像分析將印刷文本的數字照片轉換為字母和數字,可以被其他程序如文字處理器使用。 文本被轉換為字符碼,以便可以在計算機上進行搜索和更改。

過去所有的文件都是實體的,未來可能是所有文件都是數字的社會,而現在則處於變化之中。 在這種過渡狀態,實體和數字文件共存,因此像OCR這樣的技術對於來回轉換至關重要。

文件恢復、數據輸入和無障礙設計只是OCR應用的一些例子。 大多數OCR應用來自於掃描的文件,儘管偶爾也使用照片。 OCR是個有價值的省時工具,因為重新輸入材料通常是唯一的其他選擇。 以下是一些OCR的使用示例:

  • 可編輯的文本文件可以從掃描的文件中恢復,包括傳真。
  • 使用圖書掃描創建可搜索和可編輯的電子書。
  • 使用截圖照片搜索和更改文本。
  • 文本轉語音技術用於閱讀書籍給視力受損的人。

雖然這些只是OCR應用的一部分,但它們展示了該技術在各行業中的靈活性。 幾乎所有公司員工每天都會大量依賴文件,因此商業用途是OCR系統開發的一個關鍵考量因素。

在本文中,我們將比較兩個最強大的OCR讀取器:

  • IronPDF
  • Dynamsoft OCR

IronOCR和Dynamsoft OCR是兩個.NET OCR庫,支持掃描圖像的轉換和PDF文件的OCR處理。 您可以只需幾行代碼將圖像轉換為可搜索的文本。 您還可以檢索單詞、字母和段落。

IronOCR——卓越的特性

IronOCR提供了獨特的能力來檢測、閱讀和解釋沒有精確掃描的圖片和PDF文件中的文本。 IronOCR提供了從文檔和照片中提取文本的最簡單途徑,即使它不總是最快的,因為它會自動銳化和校正低質量的掃描,減少歪斜、失真、背景噪音和透視問題,同時還提高分辨率和對比度。

IronOCR允許開發人員傳遞單頁或多頁掃描的圖像,並將返回所有的文本、條碼和QR信息。 OCR庫中的一組類為基於Web的桌面或控制台應用添加了OCR功能。 Tesseract OCR C#,以及我們的程序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字典系統
  • 無需配置即可支持PDFS、多幀TIFF以及所有主要圖像格式
  • 可以校正低質量和歪斜的掃描以獲得Tesseract的最佳結果。

Dynamsoft OCR——功能特徵

Dynamsoft.NET OCR庫是一個.NET組件,提供快速和可靠的光學字符識別。 它用於在C#或VB.NET中創建.NET桌面應用程序。 使用基本的OCR API,您可以輕鬆創建代碼以將PDF或照片中無用的文本轉換為數字文本進行編輯、搜索、存檔等更多操作。

可以通過以下方式獲得來自掃描儀及其他TWAIN兼容設備的圖像:

  • 支持本機、緩衝內存和磁盤文件圖像傳輸機制。
  • 通過自動文件進紙器,可以進行批量掃描(ADF)。
  • 可以使用TWAIN屬性修改常見設備功能。
  • 可以更改IfAutoFeed、IfAutoScan、分辨率、比特深度、亮度、對比度、單位、雙面和其他功能。
  • 支持檢測空白頁。
  • 可以更改和保存掃描儀配置文件。

捕獲符合UVC和WIA標準的網絡攝像頭圖像:

  • 在捕捉來自所選網絡攝像頭的照片時顯示實時視頻。
  • 自定義攝像頭的設置:亮度、對比度、色調、飽和度、清晰度、伽馬、白平衡、背光補償、增益、色彩啟用、變焦、對焦、曝光、光圈、平移、傾斜、滾動。

穩健的圖像加載/查看

  • 可以加載BMP、JPEG、PNG、TIFF和多頁TIFF格式的圖像。
  • 支持對圖像的放大和縮小。
  • 可以從本地驅動器、FTP服務器、HTTP服務器或數據庫中檢索圖像。
  • 使用最全面的.NET成像組件之一進行BMP、JPEG、PNG和TIFF的圖像解碼

保存與上傳/下載

  • 允許通過文件流讀寫圖片。
  • 支持以BMP、JPEG、PNG、TIFF或多頁TIFF保存捕獲的照片到本地驅動器、Web服務器或數據庫中。
  • 支持RLE、G3/G4、LZW、PackBits和TIFF壓縮。
  • 支持HTTPS的上傳和下載。
  • 可供選擇的其中一套最齊全的.NET成像組件支持BMP、JPEG、PNG和TIFF的圖像編碼。
  • 允許將新獲得的照片附加至現有的TIFF文件。

從掃描的PDF或其他影像中讀取文本於ASP.NET(光學字符識別)

在當今快節奏的世界中,客戶希望工作能夠迅速完成。 有緊急項目的客戶經常與我們聯繫。 如果項目涉及掃描含有影像的紙張文件,我們的技術可以簡單地識別影像的內容並將其轉換為文本。 光學字符識別(OCR)可以為您的公司節省時間和金錢,同時減少數據輸入錯誤。

使用IronOCR

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不是一個快速的過程。 但在這個例子中,它是完全正確的。

class="content-img-align-center">

class="center-image-wrapper"> ![C# OCR application results accuracy](/static-assets/pdf/blog/dynamsoft-ocr-alternatives/dynamsoft-ocr-alternatives-1.png)

在大多數現實場景中,開發人員希望他們的項目盡可能快地運行。

在這種情境下,我們建議您使用IronOCR附加組的OcrInput和IronTesseract類。 您可以使用OcrInput設置OCR任務的精確特性,例如:

  • JPEG、TIFF、GIF、BMP和PNG只是一部分可以使用的圖像格式

  • 對PDF文件整體或部分的導入
  • 增強圖像的對比度,分辨率和大小
  • 旋轉、掃描噪音、數字噪音、歪斜和反相影像校正 從數百種預先打包的語言和方言中進行選擇

從數百種預先打包的語言和方言中進行選擇

  • 立即使用Tesseract 5、4或3的OCR引擎

  • 如果我們要查看的是截圖、片段或整個文檔,指定文檔類型
  • 識別條形碼
  • 可搜索的PDF、Hocr HTML、DOM和字符串都是OCR結果的選項 即使在中等質量的掃描中,我們也可以使用這個方法達到100%的準確率。
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
class="content-img-align-center">
class="center-image-wrapper"> ![C# OCR Scan From Tiff Example](/static-assets/pdf/blog/dynamsoft-ocr-alternatives/dynamsoft-ocr-alternatives-2.png)

如您所見,從掃描圖像(如TIFF)中讀取文本和(如果需要的話)條形碼非常容易。

此OCR任務的準確率為100%。 接下來,我們將嘗試相同頁面的低得多質量的掃描,DPI低並且有大量的失真和數字噪音,以及對原始文檔的損害。

class="content-img-align-center">
class="center-image-wrapper"> ![C# OCR Low Resolution Scan with Digital Noise](/static-assets/pdf/blog/dynamsoft-ocr-alternatives/dynamsoft-ocr-alternatives-3.png)

這就是IronOCR在與其他OCR庫(例如Tesseract)比較時真正大放異彩的地方,我們會發現其他OCR項目避免討論在實際掃描的圖像上使用OCR,而不是為了達到100% OCR準確率而虛构的'完美'數字化測試案例。

如果不添加Input.Deskew()來拉直圖像,我們得到的是52.5%的準確率。

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()使我們達到99.8%的準確率,幾乎與高質量掃描的OCR相當。

使用Dynamsoft OCR

我們將展示一些代碼片段,使用Dynamic Web TWAIN來進行TWAIN掃描和客戶端OCR的JavaScript代碼。

掃描影像

您可以使用Dynamic Web TWAIN的簡單API更改掃描設置並從TWAIN掃描儀中獲取照片。

下載OCR專業模塊

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專業模塊,您需要在head中包含ocrpro.js,同時還下載OCR Pro DLL。

對.js文件進行編輯:

<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

使用OCR識別文本

// 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

使用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來指定要從文檔中讀取的區域,提高速度和準確性。

class="content-img-align-center">
class="center-image-wrapper"> ![C# OCR Scan From Tiff Example](/static-assets/pdf/blog/dynamsoft-ocr-alternatives/dynamsoft-ocr-alternatives-4.png)
class="content-img-align-center">
class="center-image-wrapper"> C# OCR Scan From Tiff Example

這導致速度提升了41%,同時也讓我們的特異性更強。

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

這對於涉及相似和一致文檔的.NET OCR應用程序非常有價值,包括發票、收據、支票、表單、費用報銷單等。 在閱讀PDF時,也支持ContentAreas(OCR裁切)。

使用Dynamsoft OCR來閱讀裁切區域

首先,啟動Visual Studio並建立一個新的C#Windows Forms Application,或者打開現有的。

我們將需要添加DynamicDotNetTWAIN.dllDynamicOCR.dll以及適當的語言包。 1. 導航到工具->選擇工具箱項,然後轉至.NET Framework 組件選項卡,點擊瀏覽按鈕並找到DynamicDotNetTWAIN.dll

  1. 在方案瀏覽器中,右擊項目文件,選擇添加->現有項目...

然後從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
class="content-img-align-center">
class="center-image-wrapper"> ![Demo App of Zone OCR using Dynamic .NET TWAIN OCR SDK](/static-assets/pdf/blog/dynamsoft-ocr-alternatives/dynamsoft-ocr-alternatives-6.png)

圖像性能調優

輸入圖像的質量是OCR任務速度的最關鍵決定因素。

背景噪音越低,DPI越高,目標值大約200 DPI,OCR輸出越快且越準確。 #### Dynamsoft OCR的圖像處理技術

我們需要在多種情境下使用OCR,如使用手機掃描信用卡號碼或從紙質文件中提取文本。

Dynamsoft標籤識別(DLR)和Dynamic Web TWAIN(DWT)中包含了OCR能力。 雖然它們總體上可以做得非常好,但我們可以通過使用各種圖像處理技術來改善結果。

減輕/消除影子

光照不足可能會影響OCR結果。

為了提高效果,我們可以美白照片或從影像中消除影子。 反轉

因為OCR引擎通常是針對黑色文字進行訓練的,淺色文字可能更難於發現和識別。

class="content-img-align-center">
class="center-image-wrapper"> ![Light text](/static-assets/pdf/blog/dynamsoft-ocr-alternatives/dynamsoft-ocr-alternatives-8.png)

如果我們反轉其顏色更易於識別

class="content-img-align-center">
class="center-image-wrapper"> ![Light text inverted](/static-assets/pdf/blog/dynamsoft-ocr-alternatives/dynamsoft-ocr-alternatives-9.png)

為了執行反轉,我們可以在DLR中使用GrayscaleTransformationModes參數。

以下是JSON設置:

DLR .net的讀取結果:

"GrayscaleTransformationModes": [
    {
        "Mode": "DLR_GTM_INVERTED"
    }
]
class="content-img-align-center">
class="center-image-wrapper"> ![Light text result](/static-assets/pdf/blog/dynamsoft-ocr-alternatives/dynamsoft-ocr-alternatives-10.png)

重調

如果字母的高度太低,OCR引擎可能不會產生好的結果。

一般來說,圖像的DPI應至少達到300。 DLR 1.1中有ScaleUpModes參數,允許您放大字母。

當然,我們也可以自己縮放圖像。 直接閱讀圖像得到的結果是不正確的:

class="content-img-align-center">
class="center-image-wrapper"> ![1x image](/static-assets/pdf/blog/dynamsoft-ocr-alternatives/dynamsoft-ocr-alternatives-11.png)

將圖像放大2倍後,結果是正確的:

class="content-img-align-center">
class="center-image-wrapper"> ![2x image](/static-assets/pdf/blog/dynamsoft-ocr-alternatives/dynamsoft-ocr-alternatives-12.png)

去斜

如果文本稍微失真也沒關係。

但是,如果歪斜過度,則會嚴重影響結果。 為了提高結果,我們需要裁剪圖像。 為了實現這一點,我們可以在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
class="content-img-align-center">
class="center-image-wrapper"> ![Lines detected](/static-assets/pdf/blog/dynamsoft-ocr-alternatives/dynamsoft-ocr-alternatives-14.png)

去斜後:

class="content-img-align-center">
class="center-image-wrapper"> ![Deskewed image](/static-assets/pdf/blog/dynamsoft-ocr-alternatives/dynamsoft-ocr-alternatives-15.png)

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()— 高級形態學。 膨脹是在圖像中向對象的邊緣添加像素的過程。 (侵蝕的逆行) OcrInput.Erode()— 高級形態學功能。 侵蝕是從對象邊緣移除像素的過程。 (擴張的逆行) * OcrInput.Deskew()— 旋轉圖像,使其正交和朝正確方向。由於Tesseract對於歪斜掃描的容忍度可能低至5度,這對於OCR非常有用。
  • DeepCleanBackgroundNoise()— 去除大量背景噪音。僅在您知道文檔有大量背景噪音時才使用這個過濾器,因為它可能會降低清晰文檔的OCR準確度,並且對CPU相當耗用。
  • OcrInput.EnhanceResolution— 提高低分辨率照片的分辨率。 由於OcrInput的存在,這個過濾器很少使用。 OcrInput將自動檢測和解決低分辨率。 我們可能想用IronTesseract來加速高質量掃描的OCR。

如果我們追求速度,可以從這裡開始,然後逐漸打開功能,直到達到適當的平衡。 比較基線100%的準確度,這個結果有99.8%的準確度—但快35%。

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

Dynamsoft的許可和定價

許可證和定價

每年授權。

所有價格均包括一年的維護,其中包括免費軟件升級和高級支持。 Dynamsoft提供兩種類型的許可:

按客戶端設備授權

“一客戶端設備授權”允許訪問同源應用,從單一客戶端設備使用軟件的功能(同一協議、主機和端口)。一個非活躍的客戶端設備是指連續90天未訪問任何軟件功能。

一個非活躍客戶端設備的授權席位將立即被釋放,並可以供其他任何活躍的客戶端設備使用。當您達到最大許可席位數量時,Dynamsoft會為您提供額外10%的客戶端設備限額供緊急使用。 一旦額外的客戶端設備限額用完,沒有新的客戶端設備能夠訪問和使用軟件,直到再次有可用的許可席位。 請注意,超過客戶端設備限額不會影響任何已被授權的客戶端設備。 每台服務器授權

將應用程序部署到單台服務器需要“一台服務器授權”。

服務器指的是物理和虛擬服務器,包括但不限於生產服務器、故障轉移服務器、同樣用於測試的開發服務器、質量檢驗服務器、測試服務器和暫存服務器,所有這些都需要授權。 連續集成服務器(構建服務器)或本地主開發服務器不需要額外的許可。 按服務器的許可僅適用於本地服務器安裝,不適用於雲部署。 Dynamsoft OCR的定價從USD 1,249/年起。

IronOCR的許可和定價

作為開發人員,我們都希望以最少的成本和資源完成項目——預算編製非常重要。

檢查圖表以確定哪種信息最符合您的需求和預算。 IronOCR提供了許可證,允許您可以根據自己的需求和預算來定制開發人員、項目和位置的數量。

使用IronOCR許可密鑰可以發布您的產品而不帶水印。

許可證從$799起價,包括一年支援和升級。

您也可以使用試用許可密鑰免費嘗試IronOCR。

IronOCR for C#提供適用於Mac、Windows、Linux、Azure OCR和Docker的Tesseract OCR。

結論

.NET Framework 4.0或更高版必須具備, .NET Standard 2.0+ 、 .NET Core 2.0+ 、.NET 5、macOS和Linux的Mono, 以及macOS 的Xamarin都是跨平台開發的例子。 該庫可以在幾分鐘內為您的桌面、控制台或Web應用程序添加OCR功能!OCR還可以讀取PDF和多頁TIFF,並可在任何OCR掃描中保存為可搜索的PDF文件或XHTML。 其數據輸出選項包括普通文本、條形碼數據以及包羅段落、行、單詞和字符的OCR結果類。 可提供125種語言,包括阿拉伯語、中文、英語、芬蘭語、法語、德語、希伯來語、意大利語、日語、韓語、葡萄牙語、俄語和西班牙語,但請記住也可以生成自定義語言包。 Dynamic .NET TWAIN OCR附加組件是一個快速可靠的.NET組件,用於光學字符識別,可以在C#或VB.NET編寫的WinForms和WPF應用程序中使用。 您可以使用Dynamic .NET TWAIN的圖像捕獲模塊來掃描文檔或捕獲來自網絡攝像頭的照片,然後在圖像上執行OCR以將影像中的文字轉換為文本、可搜索PDF文件或字符串。

多種亞洲語言以及阿拉伯語,除了英語還有提供。 IronOCR提供更好的許可證比Dynamsoft OCR; IronOcr從$799開始附帶一年免費,而Dynamsoft從1249美元起附帶免費試用。

IronOCR還提供多用戶許可證,而Dynamsoft則每位用戶僅能獲得一張許可證。 雖然這兩套軟件的目標都是提供在條碼OCR讀取、影像轉文字和影像轉文本方面的最佳性能,但IronOCR因其在處理狀況較差的影像時表現卓越而脫穎而出。 它自動應用其復雜的調優方法以獲得最佳OCR結果。

IronOCR還使用Tesseract來給您提供最佳的結果,幾乎沒有或沒有錯誤。 Iron Software還為其客戶和用戶提供選擇,只需兩次點擊即可獲得其整套軟件。 這意味著只需支付這兩個組件的價格,您就可以立即獲得Iron Software套件的所有五個組件以及不間斷的支持。

[{i:(Dynamsoft OCR是其各自所有者的註冊商標。 本網站與Dynamsoft OCR無關聯、未得到它的認可,也未得到它的贊助。

[{i:(Dynamsoft OCR is a registered trademark of its respective owner. This site is not affiliated with, endorsed by, or sponsored by 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 從日本北海道大學完成了環境資源博士學位。在追逐學位期间,Kannapat 還成為了生產工程系一部份——汽車机器人实验室的成員。2022 年,他利用他的 C# 技能加入 Iron Software 的工程團隊, 專注於 IronPDF。Kannapat 珍惜他的工作,因为他直接向编写大部分 IronPDF 使用的代码的开发者学习。除了同行学习,Kannapat 还喜欢在 Iron Software 工作的社交十环。当他不编写代码或文档时,Kannapat 通常在他的 PS5 上打游戏或重看《The Last of Us》。