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

时间:2010-02-14 21:21:56

标签: python image image-processing gdlib

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

4 个答案:

答案 0 :(得分:7)

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

作为相似性度量,您可以使用归一化相关或平方差之和(也称为L2范数)。正如人们所提到的,这不会涉及规模变化。因此,您还要多次重新缩放原始图像,并使用每个缩放版本重复上述过程。根据输入图像的大小和可能的比例范围,这可能足够好,而且很容易实现。

正确的解决方案是使用仿射不变量。尝试查找“宽基线立体匹配”,人们在那个环境中查看了这个问题。使用的方法通常是这样的:

原始图像的预处理

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

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

测试(使用新的测试图像)。

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

答案 1 :(得分:3)

你可能想要cross-correlation。 (自相关是将信号与自身相关联;互相关是将两个不同的信号相关联。)

与简单检查完全匹配相比,你有什么相关性,它会告诉你最佳匹配在哪里,以及它们有多好。翻转方面是,对于二维图像,它类似于O(N ^ 3),并不是那么简单的算法。但是一旦你开始工作,这就是魔力。

编辑:Aargh,你指定了一个任意调整大小。这将打破任何基于相关性的算法。对不起,您现在不在我的经验范围内,因此我不会删除此答案。

答案 2 :(得分:2)

答案 3 :(得分:2)

看看Scale-Invariant Feature Transforms;有许多不同的口味可能或多或少地适合您正在使用的图像类型。