2012-03-30 71 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

相关问题