如何在另一个内部find一个图像?

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

我想在ImageA中findImageB的X,Y坐标(如果存在的话)。

任何想法我会怎么做?

  1. 那么在ImageA中有没有ImageB的变形?
  2. 图像的“精确”如何,像素对像素是相同的
  3. 你有多less计算能力?

如果前两个问题的答案是否和 ,那么你有一个简单的问题。 这也有助于了解Q3的答案。

更新:

其基本思想是:将imageB中的每个像素的每个像素与imageA中的每个像素进行匹配,然后检查相关性,然后确定两个图像中可以追踪的兴趣点(或特征)。 所以看起来像angular落是真正可追踪的,因为它周围的区域是相似的(不进入细节) – 因此,让我们find两个图像中的一些真正强大的angular落,并寻找最相似的angular落。

这样可以减less用AsearchB中的每一个像素的问题,比如searchB中的500个拐angular,在A中有1000个拐angular(或类似的东西) – 要快得多。

真棒的是你在OpenCV中有几个这样的angular落探测器 。 如果您不觉得使用emguCV (C#varriant),那么使用FAST检测器来查找匹配的angular点,从而find图像之间的多个特征。 一旦你有了,你可以find图像的左上angular的位置。

这里是一个快速示例,但它需要大约4-6秒的时间,但它确实是你正在寻找的,我知道这个post是旧的,但如果任何人最近访问这个post,你可以看看这个东西,你需要.NET的AForge命名空间或框架谷歌它并安装它包括您的项目中的AForge名称空间,这就是它find与另一个图片,并给出了坐标。

 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); 

在图像中查找子图像
在图像中查找图像
检查图像是否存在于另一个图像

如果图像B是图像A的精确子集(意思是像素值完全相同),这不是一个image processing问题,它只是2D中的string匹配。 在99%的情况下,从B中间取一条线,并与A的每一行相匹配,就可以做到你想要的,并且超级快捷。 我猜C#有一个function。 当你得到你的比赛(通常,其中一些),只是检查整个B对A的适当部分。

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