在 MatLab 中识别最大的 SURF 点簇

Identify largest cluster of SURF Points in MatLab

我有两张图片:小狗的大图片(场景)和鼻子的一小部分(目标):

我已经为目标和场景收集了 SURF 点,然后匹配它们。我已经在场景图像上显示了最佳匹配如下:

识别匹配冲浪点的最大集群的最佳方法是什么?

在这个例子中,所有的点都很好地聚集在一起。但是,在其他一些示例中,有几个我想排除的异常值。

谢谢。

更新: KDE 很适合我。谢谢大家,太好了

你基本上是在寻找由匹配点引起的密度函数的mode。也就是说,在图像的 2D space 中,每个匹配点表示来自图像和 "target" 之间匹配的概率函数的 "sample"。您正在寻找 2D 中此密度函数具有 "peak" 的点:即大多数匹配所在的中心。

有一个众所周知的算法可以从函数中找到给定样本的密度函数的模式,它被称为Mean shift。将均值偏移应用于图像中匹配项的 XY 坐标(我会使用大小与 "target" 的大小成比例的圆形或三角形内核)应该得到中心的坐标"target"位于图像中。

在 google 中的快速搜索建议 this implementation 进行均值偏移聚类。

注意:请不要混淆 Comaniciu 和 Meer 的 mean shift segmentation

您不需要聚类分析。

您要查找的是密度最高的区域。这可能是真正匹配的地方。

有很多密度估计方法,特别是对于低维数。如果您负担得起,请考虑内核密度估计 KDE。

如果您负担不起密度估计,但需要非常快的东西,试试这个:

  1. 在每个维度中,计算中位数。

  2. 将中位数组合成一个向量以用作估计值。

中位数比均值对离群值更稳健,但除此之外,它基本上采用所有点的(稳健)均值。这没问题,除非在同一图像中有 多个匹配项 。然后上面讨论的密度估计会更好。