在大图中查找已知的子图像

有没有人知道一种算法(或搜索词/描述)可以在更大的图像中定位已知图像?

例如:

我有一个包含各种按钮和区域(目标)的单个桌面窗口的图像。我还有代码来捕获当前桌面的屏幕截图。我想要一种算法,可以帮助我在较大的桌面图像中找到目标图像(窗口所在的确切x和y坐标)。目标图像可能位于较大图像中的任何位置,并且可能不是100%完全相同(非常相似但不完全相同,可能是操作系统显示差异的b / c)

有谁知道这样的算法或算法类?

我发现了各种图像分割和计算机视觉算法,但它们似乎适用于区域的“模糊”分类,而不是在另一个区域中定位特定图像。

** 我的目标是创建一个框架,给定一些种子目标图像,可以在桌面上找到“查看”,找到目标区域并“监视”它的变化。 **


答案 1

看看我写的论文:http://werner.yellowcouch.org/Papers/subimg/index.html。它非常详细,似乎是唯一一篇讨论如何将傅里叶变换应用于子图像查找问题的文章。

简而言之,如果你想使用傅里叶变换,可以应用以下公式:当图像A在dx上移动时,图像A和图像B之间的相关性,dy在以下矩阵中给出:C=ifft(fft(A) x conjugate(fft(B))。因此,图像 C 中具有最高值的位置具有最高的相关性,并且该位置反映的是 dx,dy。

此结果适用于相对较大的子图像。对于较小的图像,需要做更多的工作,如本文所述。然而,这样的傅里叶变换非常快。它导致大约 3*sxsylog_2(sx*sy)+3*sx*sy 操作。


答案 2

你说你的图像可能不完全相同,但随后又说你不需要“模糊”算法。我不确定这些是否兼容。不过,总的来说,我认为你想看看图像配准算法。有一个名为ITK的开源C++包,可能会提供一些提示。此外,ImageJ是一个流行的开源Java包。如果您四处寻找,这两者都至少具有一些可用的注册功能。