【问题标题】:Detecting one image within another and returning it's value在另一个图像中检测一个图像并返回它的值
【发布时间】:2012-02-20 19:28:27
【问题描述】:

我有一个包含许多字母的图案图像字典,还有一个必须识别的位图! “两个”图像的高度相同!一些图案图像具有不同的宽度。

如何遍历 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;
}

如果GetColumnState() 返回 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(我的比较方法基于此)返回 false..

必须识别的位图和图案图像都是黑白颜色..我想知道是否有更可靠的方法来比较另一个图像中的一个图像并通过字典(OCR)返回其值..

【问题讨论】:

  • 请不要在标题前加上“C#”之类的前缀。这就是标签的用途。
  • 好吧,我也用C#标签来方便搜索。。我一直以为这里有不同编程语言的专业人士,所以我故意输入C#,以免吸引PHP,C++或 Java 人.. 但无论如何我会把它当作一个警告,以后不会重复这个错误

标签: c# image


【解决方案1】:

如您所见,基于像素值的模式匹配并不可靠。如果字体是完全可预测且一致渲染的,您可以通过标准化图像(对齐、缩放、旋转以匹配)并计算图像之间的均方差,然后接受它是否足够小来完成这项工作。

面对未知字体或变化的图像来源(截屏、摄像头、扫描等),您需要基于某种类型的机器学习 (ML) 的更强大的方案。从位图中识别数字是神经网络的经典介绍性示例,但许多其他 ML 方案也可以使用 - 请参阅 Supervised learning#Approaches_and_algorithms on Wikipedia。请注意,这将涉及训练,这意味着您需要一组良好的多样化数据来训练它。

【讨论】:

  • 我打算用它来识别已知字体..所有字母总是有相同的像素,等等。我已经设法以 100% 的结果进行识别,但花了将近 1 秒的时间只认识 4 个字母。 ;(我会再问一个关于优化的问题。如果速度还不够好——我使用 Tesseract 或其他解决方案。
猜你喜欢
  • 1970-01-01
  • 2012-07-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-28
  • 2014-03-15
  • 1970-01-01
相关资源
最近更新 更多