如何在更大的图像中检测图像的位置?我有一个未修改的图像副本。然后将该图像更改为任意分辨率并随机放置在任意大小的更大图像中。不对生成的图像进行其他转换。Python 代码将是理想的,它可能需要libgd。如果您知道解决此问题的好方法,您将获得 +1。
4 回答
有一个快速而肮脏的解决方案,它只是在目标图像上滑动一个窗口并计算每个位置的一些相似性度量,然后选择具有最高相似性的位置。然后将相似度与阈值进行比较,如果分数高于阈值,则得出图像在那里并且就是位置的结论;如果分数低于阈值,则图像不存在。
作为相似性度量,您可以使用归一化相关性或平方差之和(又名 L2 范数)。正如人们所提到的,这不会处理规模变化。因此,您还可以多次重新缩放原始图像,并对每个缩放版本重复上述过程。根据输入图像的大小和可能的比例范围,这可能已经足够好了,而且很容易实现。
一个合适的解决方案是使用仿射不变量。尝试查找“宽基线立体匹配”,人们在这种情况下查看了这个问题。使用的方法通常是这样的:
原始图像的预处理
- 运行“兴趣点检测器”。这将在图像中找到一些易于定位的点,例如角落。有很多检测器,一种称为“harris-affine”的检测器运行良好并且非常流行(因此可能存在实现)。另一种选择是使用高斯差 (DoG) 检测器,它是为 SIFT 开发的,并且效果也很好。
- 在每个兴趣点,提取一个小的子图像(例如 30x30 像素)
- 对于每个子图像,计算一个“描述符”,即该窗口中图像内容的某种表示。同样,存在许多描述符。要看的是描述符对图像内容的描述程度(您希望两个描述符仅在它们相似时才匹配)以及它的不变性(即使在缩放之后您也希望它是相同的)。在您的情况下,我建议使用 SIFT。它不像其他一些描述符那样不变,但可以很好地应对规模,在你的情况下规模是唯一改变的东西。
在此阶段结束时,您将拥有一组描述符。
测试(使用新的测试图像)。
- 首先,您运行与步骤 1 中相同的兴趣点检测器并获得一组兴趣点。如上所述,您为每个点计算相同的描述符。现在您也有一组目标图像的描述符。
- 接下来,您寻找匹配项。理想情况下,对于原始图像中的每个描述符,目标图像中都会有一些非常相似的描述符。(由于目标图像更大,也会有“剩余”描述符,即与原始图像中的任何内容都不对应的点。)因此,如果足够多的原始描述符匹配足够的相似度,那么您就知道目标是那里。此外,由于描述符是特定于位置的,因此您还将知道原始图像在目标图像中的位置。
您可能需要cross-correlation。(自相关是将信号与其自身相关;互相关是将两个不同的信号相关。)
与简单地检查精确匹配相比,相关性对您的作用在于,它会告诉您最佳匹配在哪里,以及它们有多好。另一面是,对于二维图片,它类似于 O(N^3),并且不是那么简单的算法。但是一旦你让它工作,它就是神奇的。
编辑:啊,您指定了任意调整大小。这将破坏任何基于相关性的算法。抱歉,您现在超出了我的经验范围,因此不会让我删除此答案。
看看Scale-Invariant Feature Transforms;有许多不同的风格可能或多或少适合您碰巧使用的图像类型。