特征检测 - 大图中的小物件

11
假设您有两个图像。其中一个包含一个小图标(小于300X300像素)。第二个是非常大的,其中包含一个(或多个)图标的较小实例(当然在不同的比例、旋转下)。
任务是在大图像中找到图标的实例。你们会如何处理?
我尝试使用基于特征的对象检测,使用OpenCV库,但对于拥挤的大图像(包含许多特征点),匹配结果不确定。我尝试了SURF/OBJ特征提取器和BRUTE/FLAN匹配算法。
从我的经验来看,匹配似乎没有注意到两个图像上的特征点之间的几何关系。作为可视化帮助,我附上了两个示例图像的特征点实例。enter image description here 这是一个更难的任务示例。我在大图像中突出显示了图标。 enter image description here

1
你的颜色看起来相当独特。你可以尝试一个两阶段的过程,首先使用blob检测搜索该颜色,然后使用特征检测限制在该区域内查找其姿态,以消除误报。当然,如果图像中有太多其他部分是明亮的红色,这种方法会完全失败... - Hammer
2个回答

7

根据有限的经验,我对于任何遇到这种问题的人有三个建议。

1) 尝试使用 FindObject by Mathieu Labbé 进行实验

这是一个非常好用的工具,可以帮助我快速实验出特征检测/描述的最佳设置组合。只需将图标加载为对象,将样本大图像加载为场景,然后进行微调,直到获得适用于您的应用程序的可靠结果。作为奖励,他最近添加了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)

希望能对某人有所帮助。

3
您的特征匹配方法不错。如果可以使用颜色,请使用预处理来找到感兴趣的区域,例如直方图反向投影,然后进行斑点提取和一些形状分析。
您应该将大图像中的所有特征与小图像进行匹配。这会导致许多匹配但很少的内点。
由于您的图标是平面的,因此可以使用单应性作为几何约束进行匹配。 而无需编写任何代码,您可以尝试OpenCV示例“descriptor_extractor_matcher”,该示例可以在OpenCV源代码的samples目录中找到。
./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节中,他描述了处理非常低的匹配精度的方法,这似乎是您的情况。
祝你好运!

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接