2012-02-20 54 views
0

我有许多字母的图案图像字典,我也有一个必须被识别的位图! “两个”图像的高度是相同的!一些图案图像具有不同的宽度。在另一个图像中检测一个图像并返回它的值

如何迭代X轴并识别模式中的字母?

现在,我使用此功能检查,如果X位图列中有黑色像素:

static Boolean GetColumnState(Bitmap bmp, int x) 
{ 
    BitmapData pixelData = bmp.LockBits(
     new Rectangle(0, 0, bmp.Width, bmp.Height), 
     ImageLockMode.ReadOnly, 
     PixelFormat.Format32bppArgb); 
    Boolean state = false; 
    unsafe 
    { 
     int* pData = (int*)pixelData.Scan0.ToPointer(); 
     pData += x; 
     for (int i = 0; i < bmp.Height; ++i) 
     { 
      pData += bmp.Width; 
      if (Color.FromArgb(*pData) == Color.FromArgb(255, 0, 0, 0)) 
      { 
       state = true; 
       break; 
       //pixelColumn[i] = Color.FromArgb(*pData); 
      } 
     } 
    } 
    bmp.UnlockBits(pixelData); 

    return state; 
} 

如果CulumnState()返回true,那么我裁剪尺寸相同图案的图像图像和比较它们。

 int y = target.Count; 
     for (int i = 0; i < b1.Width; i++) 
     { 
      if (GetColumnState(b1, i + count) == true) 
      { 
         int trWidth = target[5].Value.Width; 
         int trHeight = target[5].Value.Height; 
         Bitmap bitm = new Bitmap(trWidth, trHeight); 
         Rectangle section = new Rectangle(new Point(0, b1.Height - trHeight-1), new Size(trWidth, trHeight)); 
         Bitmap cropped = CropImage(b1, section); 
         cropped.Save(@"C:\111.png"); 
         target[5].Value.Save(@"C:\000.png"); 
         if (CompareMemCmp(cropped, target[5].Value) == true) 
         { 
          //count = target[5].Value.Width; 
          textBox2.AppendText(target[5].Key); 
          break; 
         } 
         else { textBox2.AppendText("noo"); } 

       //textBox1.Text = "yes!"; 
      } 
      else 
      { 
       //textBox1.Text = "noo"; 
      } 
      break; 
     } 

不幸的是,即使经过裁剪的图片在视觉上看起来是一样的 - 它有不同的大小,以便memcmp(我比较的方法是基于这一点)返回 ..这有

位图被识别并且图案图像全部在BlackAndWhite颜色中..我想知道是否有更可靠的方式来比较另一个图像内的图像并通过字典(OCR)返回它的值。

+0

请不要在“C#”等前加上标题。这就是标签的用途。 – 2012-02-20 19:31:13

+0

好的,我也使用C#标签来缓和搜索..我一直认为这里是不同编程语言的专业人士,所以我为了不吸引PHP,C++或Java人员而故意进入C#..但无论如何我会把它作为警告,不会在将来重复这个错误 – Alex 2012-02-20 19:33:33

回答

0

基于像素的模式匹配值是否定的正如你所发现的那样。如果字体是完全可预测的并且一致地呈现,那么可以通过对图像进行规范化(对齐,缩放,旋转以匹配)并计算图像之间的均方差,然后接受它是否足够小来完成此工作。在面对未知字体或不同图像源(屏幕截图,相机,扫描等)的情况下,您需要基于某种类型的机器学习(ML)的更健壮的方案。识别位图中的数字是神经网络的经典介绍性例子,但许多其他ML方案也可以使用 - 请参阅Supervised learning#Approaches_and_algorithms on Wikipedia。请注意,这将涉及培训,这意味着您需要一组好的数据来训练它。

+0

我打算用它来识别已知字体..所有字母总是具有相同的像素等我已设法做识别结果100%,但只花了近1秒才能识别出4个字母。 ;(我会问一个关于优化的问题。如果速度还不够好 - 即使使用Tesseract或其他解决方案.. – Alex 2012-02-21 08:06:16

+0

问题修正:) – Alex 2012-02-21 14:27:21

相关问题