在输入中应用关键点检测器而不执行任何类型的预处理是查找相关有趣匹配点的一种非常糟糕的方法。
鉴于您的图像,数学形态学提供了很好的工具来预处理它们,并希望在以后的步骤中获得更好的匹配。其中一种工具称为形态重建,其概括称为 Levelings,它将基于标记图像合并和扩展平坦区域。如您所见,您的图像非常有噪点,因为到处都有山谷(那些暗点),所以您想要抑制其中的大部分。实现 Levelings 一点也不难,但由于我不知道免费提供的工具(实际上有一个主要在法国开发的大型框架,我相信它包含它,但我不记得名字了),让我们坚持更标准的形态重建。我们也没有标记图像,但这很容易构建:用一些结构元素腐蚀你的图像并应用形态重建,这被一些作者称为测地线开口。这将抑制一些嘈杂的山谷。
此时您的图像可能适合与某些关键点检测器一起使用,但我建议将其二值化,因为您要匹配的内容与灰度色调无关。典型的自动方法是由 Otsu 给出的,但还有其他的方法,比如用于直方图熵最小化的 Kapur 方法。我没有使用 Otsu 只是因为它很常见,对于 Stackoverflow 的一些新奇,我选择了另一种方法:P(是的,非常糟糕的理由)。最后,二值化后,您可以继续处理您的图像。一个单一的形态关闭在这里可能就足够了,因为您想要移除一些剩余的噪声点(它们不一定与组件断开连接,因此现在移除组件可能是一个糟糕的选择)。
为了简短起见,这里是第一张图像的测地线开口和最终预处理(使用上面的点):
这是其他两个图像的最终结果(应用完全相同的过程,没有不断修改或其他任何东西):
如果我现在继续使用典型的 SURF 方法匹配这些,我会得到大部分完美匹配,从而使另一个问题(定位一个相对于另一个)非常容易解决。我不包括我得到的匹配结果(除非有人想比较结果),因为我相信你现在应该使用 OpenCV 或任何其他正确的实现得到相同的结果。
如果重要的话,这里是 Mathematica 中实现上述预处理的单行代码:
g = Closing[Binarize[GeodesicOpening[f, DiskMatrix[5]], Method -> "Entropy"], 1]
其中f
是灰度输入图像,g
是生成的二值图像。