11

假设您有两个图像。在一个中,您有一个小图标(例如小于 300X300 像素)。第二个是一个非常大的,并且在您内部有一个(或多个)较小的图标实例(当然以不同的比例,旋转)。

手头的任务是在大图中找到图标的实例。你们将如何处理这个问题?

我尝试通过使用 OpenCV 库来使用基于特征的对象检测,但是对于拥挤的大图像(包含许多特征点),匹配是不确定的。我已经使用 BRUTE/FLAN 匹配算法尝试了 SURF/OBJ 特征提取器。

根据我的经验,匹配似乎没有注意两个图像上特征点之间的几何关系。作为可视化帮助,我附上了两个示例图像的特征点实例。在此处输入图像描述

这是任务的一个更难的例子。我已经突出显示了大图中的图标。在此处输入图像描述

4

2 回答 2

7

基于有限的经验,我对遇到此类问题的其他人提出三项建议。

1) 使用Mathieu Labbé 的 FindObject 进行实验

这是一个非常好的工具,它帮助我快速进行实验以找到用于特征检测/描述的良好设置组合。只需将您的图标加载为对象,并将您的示例大图像加载为场景。然后进行调整,直到为您的应用程序获得可靠的结果。作为奖励,他最近添加了 BRISK 和 FREAK 非专利保护特征检测/描述方法。

2)获得现实的解决方案

您的图标对象和您正在搜索的大场景中的实际图标的分辨率是如此不同。在我的理解中,这些方法的尺度不变性实际上是非常有限的。查看Ievgen Khvedchenia 所做的出色比较。通过将图像大小调整到您期望的范围的中间,您可能会获得更好的结果。

3)使图标示例图像更逼真(例如,模糊)

与 #2 相关,我发现在更逼真的场景中搜索时,拥有非常清晰的样本图像效果不佳。我对我的尖锐样本应用高斯,以使它们与我期望找到的更相似。下面有一个例子。奇怪的公式只是确保内核尺寸是奇数。

def proportional_gaussian(image):
    kernel_proportion = 0.005
    kernel_w = int(2.0 * round((image.shape[1]*kernel_proportion +1)/2.0)-1)
    kernel_h = int(2.0 * round((image.shape[0]kernel_proportion +1)/2.0)-1)
    return cv2.GaussianBlur(image, (kernel_w, kernel_h), 0)

希望对某人有所帮助。

于 2013-02-12T13:10:04.307 回答
3

您的特征匹配方法很好。如果可以使用颜色,请使用预处理来找到感兴趣的区域,例如直方图反投影,然后进行斑点提取和一些形状分析。

您应该匹配从大图像到小图像的所有特征。这导致许多匹配项很少有内点。

由于您的图标是平面的,您可以使用单应性作为匹配的几何约束。无需编写任何代码,您可以尝试 OpenCV 示例“descriptor_extractor_matcher”,该示例位于 OpenCV 源代码的示例目录中。

./descriptor_extractor_matcher SURF SURF BruteForce NoneFilter icon.jpg image.jpg 3

有关详细信息,请参阅descriptor_extractor_matcher 的帮助输出。

您可以尝试切换图像的顺序,我不记得哪个是训练图像,哪个是查询图像。

关于这种对象检测的论文是 David Lowe 的“Distinctive Image Features from Scale-Invariant Keypoints”。在本文的第 7.3 节中,他描述了他处理非常低的内点/异常值比率的方法,这似乎是您的情况。

祝你好运!

于 2012-07-24T09:40:46.923 回答