检测另一个图像中的一个图像并将其返回';s值

本文关键字:图像 返回 一个 另一个 检测 | 更新日期: 2023-09-27 18:25:24

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

如何在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)返回其值。。

检测另一个图像中的一个图像并将其返回';s值

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

面对未知字体或不同的图像源(屏幕捕捉、相机、扫描等),您需要一个基于某种类型的机器学习(ML)的更稳健的方案。从位图中识别数字是神经网络的一个经典入门示例,但许多其他ML方案也会起作用——请参阅维基百科上的监督学习#Approaches_and_agorithms。请注意,这将涉及到训练,这意味着您需要一组良好的多样化数据来对其进行训练。