2012-03-30 67 views
1

我有一個包含所有字體字符的庫(在我的情況下是宋體)。例如:OCR由於字體細節而失敗

enter image description here

我使用這個庫從圖像OCR文字。

問題是,當您嘗試OCR諸如「j」,「/」,「t」等字符時,- 字符可能會相互重疊!所以OCR現在是不可能的,因爲字符不匹配圖案圖像(最多3個像素不同)。

enter image description here

如何做我必須處理這個問題呢?有沒有比較圖像更好的方法? (C#,WinForms應用程序)

我用這個方法進行比較:

unsafe public static bool CompareMemCmp(Bitmap b1, Bitmap b2) 
    { 
     if ((b1 == null) != (b2 == null)) return false; 
     if (b1.Size != b2.Size) return false; 

     var bd1 = b1.LockBits(new Rectangle(new System.Drawing.Point(0, 0), b1.Size), ImageLockMode.ReadOnly, PixelFormat.Format32bppArgb); 
     var bd2 = b2.LockBits(new Rectangle(new System.Drawing.Point(0, 0), b2.Size), ImageLockMode.ReadOnly, PixelFormat.Format32bppArgb); 

     try 
     { 
      IntPtr bd1scan0 = bd1.Scan0; 
      IntPtr bd2scan0 = bd2.Scan0; 

      int stride = bd1.Stride; 
      int len = stride * b1.Height; 

      return memcmp(bd1scan0, bd2scan0, len) == 0; 
     } 
     finally 
     { 
      b1.UnlockBits(bd1); 
      b2.UnlockBits(bd2); 
     } 
    } 

這是非常快速和可靠的..但如果從滿足上述條件,你不能得到一個結果..很遺憾。

+1

[所以,它已經到了這個。](http://xkcd.com/1015/) – Bob2Chiv 2012-03-30 15:35:08

+0

您發佈的代碼只是比較圖像,它根本不涉及字符識別部分。根據你如何處理這個,它不是一個真正的圖像比較問題:例如,你可以比較字符組合。但作爲一個圖像問題,比較單個像素,而不是整個圖像,並允許一些錯誤標準,但仍然返回一個可能的匹配。如果你將它連接到你的字符識別功能,你可以允許在經常被嚴格限制的字符中出現更多的錯誤。 – 2012-03-30 15:36:56

+0

@JamieF第一步是裁剪角色。第二步是通過字典(字典<字符串,位圖>)進行迭代,並在滿足條件image1 = image2時返回一個值。然後打破循環。這是我的算法來做OCR ..但實際上它更復雜;) – Alex 2012-03-30 15:44:41

回答

1

你可以製作這些字符對(儘管它們可能有不合理的數量)。 「-j」組合將被識別爲「-j」字符..

+0

這是我的計劃B ..但正如你所說,我不可能知道所有情況..可能是數十,可能是成千上萬的組合.. – Alex 2012-03-30 15:53:41

1

您可以爲每個角色返回一個分數。角色描述的角色的一種概率。

如果中心像素匹配與邊緣像素相比,那麼您可以使得得分更高,這樣您就可以更好地進行猜測。

+0

**不確定字符如「u」和「ü」會發生什麼情況**當找到字符時,通過庫的迭代停止,所以通過這個邏輯,返回的第一個字母是「u」如果它實際上是「ü」(因爲它們的分數幾乎相同)。 – Alex 2012-03-30 15:50:47

+0

然後不要停下來。繼續確認。正如我所建議的那樣,您可以返回按概率排序的字符列表。 – 2012-03-30 18:09:08

相關問題