有没有人知道一种算法(或搜索词/描述)可以在较大的图像中定位已知图像?
例如:
我有一个包含各种按钮和区域(目标)的单一桌面窗口的图像。我还有代码来捕获当前桌面的屏幕截图。我想要一个算法,可以帮助我在较大的桌面图像中找到目标图像(窗口所在的确切x和y坐标)。目标映像可能位于较大映像中的任何位置,并且可能不是100%完全相同(非常相似,但不完全相同,可能是操作系统显示差异的b/c )
有没有人知道这样一种算法或一类算法?
我发现了各种图像分割和计算机视觉算法,但它们似乎适合对区域进行“模糊”分类,而不是在另一幅图像中定位特定的图像。
**我的目标是创建一个框架,在给定一些种子目标图像的情况下,可以在桌面上找到“查看”,找到目标区域并“观察”它的变化。**
发布于 2008-11-18 03:20:16
你说你的图像可能不完全一样,但又说你不想要“模糊”算法。我不确定这些是不是兼容的。不过,总的来说,我认为您应该看看image registration算法。有一个名为ITK的开源C++包,它可能会提供一些提示。此外,ImageJ是一个流行的开源Java包。如果你到处看看,这两个都至少有一些注册功能。
发布于 2010-09-26 14:54:38
看看我写的论文:http://werner.yellowcouch.org/Papers/subimg/index.html。它非常详细,似乎是唯一一篇讨论如何将傅里叶变换应用于子图像查找问题的文章。
简而言之,如果你想使用傅立叶变换,你可以应用下面的公式:当图像A在dx上移动时,图像A和图像B之间的相关性在下面的矩阵中给出: C=ifft(fft(A) x共轭(fft(B)。所以,图像C中的位置具有最高的值,具有最高的相关性,该位置反映了dx,dy。
此结果适用于相对较大的子图像。对于较小的图像,需要做更多的工作,如本文所述。然而,这样的傅立叶变换是相当快的。它产生大约3*sx_sy_log_2(sx*sy)+3*sx*sy操作。
发布于 2008-11-18 12:03:41
下面是你想要使用的代码框架:
// look for all (x,y) positions where target appears in desktop
List<Loc> findMatches(Image desktop, Image target, float threshold) {
List<Loc> locs;
for (int y=0; y<desktop.height()-target.height(); y++) {
for (int x=0; x<desktop.width()-target.width(); x++) {
if (imageDistance(desktop, x, y, target) < threshold) {
locs.append(Loc(x,y));
}
}
}
return locs;
}
// computes the root mean squared error between a rectangular window in
// bigImg and target.
float imageDistance(Image bigImg, int bx, int by, Image target) {
float dist = 0.0;
for (int y=0; y<target.height(); y++) {
for (int x=0; x<target.width(); x++) {
// assume RGB images...
for (int colorChannel=0; colorChannel<3; colorChannel++) {
dist += Math.pow(target.getPixel(x,y) - bigImg.getPixel(bx+x,by+y), 2);
}
}
}
return Math.sqrt(dist) / target.width() / target.height();
}
您可以考虑其他图像距离(请参阅a similar question)。对于您的应用程序,RMS错误可能是一个很好的选择。
可能有各种Java库可以有效地为您计算此距离。
https://stackoverflow.com/questions/297762
复制相似问题