在较大图像中检测图像的位置

问题描述

一个快速而又肮脏的解决方案,那就是简单地在目标图像上滑动一个窗口,并在每个位置计算相似度,然后选择相似度最高的位置。然后,您将相似度与阈值进行比较,如果得分高于阈值,则可以得出图像在那里,那就是位置。如果分数低于阈值,则图像不存在。

作为相似性度量,可以使用归一化的相关性或平方差之和(又称为L2范数)。就像人们提到的那样,这不会处理规模变化。因此,您还要多次缩放原始图像,并对每个缩放版本重复上述过程。取决于输入图像的大小和可能的缩放范围,这可能已经足够好,并且易于实现。

正确的解决方案是使用仿射不变量。尝试查找“宽基线立体声匹配”,人们就在这种情况下研究了该问题。通常使用的方法如下:

原始图像的预处理

  • 运行“兴趣点检测器”。这将在图像中找到一些易于定位的点,例如角落。有很多检测器,一个叫做“ harris-affine”的检测器工作良好并且非常流行(因此可能存在实现)。另一种选择是使用高斯差分(DoG)检测器,它是针对SIFT开发的,也可以很好地工作。
  • 在每个兴趣点上,提取一个小的子图像(例如30x30像素)
  • 对于每个子图像,计算一个“描述符”,即该窗口中图像内容的某种表示形式。同样,存在许多描述符。要看的事情是描述符描述图像内容的程度(您希望两个描述符只有在它们相似时才匹配)以及它的不变性(即使缩放后也希望它们相同)。您的情况下,建议使用SIFT。它不像其他一些描述符那样不变,但是可以很好地应付规模,在您的情况下,规模是唯一发生变化的事情。

在此阶段结束时,您将具有一组描述符。

测试(带有新的测试图像)。

  • 首先,您运行与步骤1中相同的兴趣点检测器,并获得一组兴趣点。如上所述,您为每个点计算相同的描述符。现在,您还有一组用于目标图像的描述符。
  • 接下来,您寻找匹配项。理想情况下,对于原始图像中的每个描述符,目标图像中都会有一些非常相似的描述符。(由于目标图像较大,因此还会有“剩余”描述符,即与原始图像中的任何点都不对应的点。)因此,如果足够多的原始描述符以足够的相似性进行匹配,则您知道目标是那里。此外,由于描述符是特定于位置的,因此您还将知道原始图像在目标图像中的位置。

解决方法

如何在较大图像中检测图像的位置?我有图像的未修改副本。然后将此图像更改为任意分辨率,并随机放置在具有任意大小的更大图像中。不会对生成的图像进行其他任何变换。Python代码将是理想的,并且可能需要libgd。如果您知道解决此问题的好方法,您将获得+1。