在较大的图像中查找已知的子图像
image-manipulation
image-processing
java
5
0

有谁知道在较大图像中定位已知图像的算法(或搜索字词/说明)?

例如

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

有人知道这样的算法吗?

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

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

参考资料:
Stack Overflow
收藏
评论
共 3 个回答
高赞 时间 活跃

看看我写的论文: 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 * sx sy log_2(sx * sy)+ 3 * sx * sy个运算。

收藏
评论

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

收藏
评论

这是您要使用的代码框架:

// 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();
}

您可以考虑其他图像距离(请参阅类似的问题 )。对于您的应用程序,RMS误差可能是一个不错的选择。

可能有各种Java库可以为您有效地计算此距离。

收藏
评论
新手导航
  • 社区规范
  • 提出问题
  • 进行投票
  • 个人资料
  • 优化问题
  • 回答问题

关于我们

常见问题

内容许可

联系我们

@2020 AskGo
京ICP备20001863号