如何在另一个图像中找到一个图像?

时间:2010-03-18 18:42:40

标签: c# image image-processing

我有2个bmp图像。 ImageA是截图(示例) ImageB是其中的一个子集。比如说一个图标。

我想在ImageA中找到ImageB的X,Y坐标(如果存在)。

知道我该怎么做吗?

4 个答案:

答案 0 :(得分:16)

这是一个快速的样本,但它很慢需要大约4-6秒,但它完全符合您的要求,我知道这篇文章很老但是如果其他人最近访问这篇文章 你可以看看这个东西 您需要.NET AForge命名空间或框架谷歌并安装它 在项目中包含AForge名称空间,就是这样 它找到了另一个图片并给出了坐标。

System.Drawing.Bitmap sourceImage = (Bitmap)Bitmap.FromFile(@"C:\SavedBMPs\1.jpg");
            System.Drawing.Bitmap template = (Bitmap)Bitmap.FromFile(@"C:\SavedBMPs\2.jpg");
            // create template matching algorithm's instance
            // (set similarity threshold to 92.1%)

           ExhaustiveTemplateMatching tm = new ExhaustiveTemplateMatching(0.921f);
                // find all matchings with specified above similarity

                TemplateMatch[] matchings = tm.ProcessImage(sourceImage, template);
                // highlight found matchings

           BitmapData data = sourceImage.LockBits(
                new Rectangle(0, 0, sourceImage.Width, sourceImage.Height),
                ImageLockMode.ReadWrite, sourceImage.PixelFormat);
            foreach (TemplateMatch m in matchings)
            {

                    Drawing.Rectangle(data, m.Rectangle, Color.White);

                MessageBox.Show(m.Rectangle.Location.ToString());
                // do something else with matching
            }
            sourceImage.UnlockBits(data);

答案 1 :(得分:15)

  1. 那么ImageA中的ImageB是否有任何变形?
  2. 图片的“精确”程度,如像素为像素,它们将是相同
  3. 你有多少计算能力?
  4. 如果前两个问题的答案是,那么您有一个简单的问题。它也有助于了解 Q3 的答案。

    <强>更新

    基本思想是这样的:不是将imageB中每个像素周围的窗口与imageA中的每个像素相匹配并检查相关性,而是让我们识别两个图像中的感兴趣点(或特征)可跟踪。所以看起来角落确实是可跟踪的,因为它周围的区域有点相似(不详细说明) - 因此,让我们在两个图像中找到一些真正的角并搜索看起来最相似的角落。

    这减少了使用A搜索B中的每个像素来搜索B中的500个角以及A中的1000个角(或类似的东西)的问题 - 更快。

    令人敬畏的是,您可以在OpenCV中使用几个这样的角落探测器。如果您不想使用emguCV(C#varriant),请使用FAST检测器查找匹配的角,从而找到图像之间的多个要素。完成后,您可以找到图像左上角的位置。

答案 2 :(得分:1)

如果图像B是图像A的精确子集(意味着,像素值完全相同),这不是图像处理问题,它只是2D中的字符串匹配。在99%的情况下,从B的中间取一条线并将其与A的每一条线相匹配将做你想要的,超快速和mdhas;我猜C#有一个功能。在你得到你的比赛(通常是其中一些)后,只需检查整个B对A的适当部分。

我能看到的唯一问题是,在某些情况下你可以得到太多的比赛。例如。如果A是你的桌面,B是一个图标,你不幸选择B中仅包含背景的一行。这个问题很容易解决(你必须更仔细地选择B中的行),但这取决于问题的具体情况。

答案 3 :(得分:0)