我如何比较两个边缘图像(在OpenCV)



在我的项目中,我需要比较图像。一个图像显示了渲染模型,另一个图像是照片,其中显示了模型中表示的真实对象。我到底想要什么:

  • 算法必须比较两张图像并返回一个描述相似性的数字。假设数字越小,图像就越适合在一起。
  • 这两个图像都表示为二值图像,只包含真实渲染图像/照片的轮廓/边缘。
  • 照片比渲染图有更多的对象。所以我只想检查渲染对象的视点是否与照片中真实对象的视点几乎相同。(例:汽车的模型很接近真车。我从一个特殊的位置和方向给真车拍了一张照片。现在我想检查一下,如果我的虚拟相机的位置和方向看渲染车是几乎相同的,比我的现实生活中的相机的位置和方向)。解决方案是将渲染图像的白色像素与照片的像素(作为边缘图像)进行比较。其他像素点不有趣。
  • 当虚拟摄像机的方向和位置与真实摄像机的方向和位置越接近时,图像比较的返回值应该越小。

我试图计算两幅图像的欧几里德距离,但只有当像素完全适合彼此时,结果才好。现在我正在寻找替代方案。

直到现在我考虑使用归一化相互关系,但我真的不知道它是否适合我的任务。

问题是,如果归一化的相互关系值得一试,或者是否有更好的方法来解决我的问题!

算法应该尽可能快,因为我比较了很多图像。

Thanks a lot


谢谢你的建议。我有点困惑,因为标准化的交叉相关和Haussdorff距离似乎很适合在大图中找到一个小模式。

问题是:这两种算法是否也适用于比较2张相同大小的图片?

这是一个必须比较的2个图像的例子。目前,我每秒比较大约120对图片。

可惜我不能以新用户的身份发布图片。这是直接的联系:http://s14.directupload.net/file/d/2674/t8qzbq9i_png.htm

用Haussdorff距离作为起点怎么样?总体思路和c实现。文章:

使用Hausdorff距离比较图像,由DP Huttenlocher - 1993。

您还可以检查余弦相似度。我将其用于检测视频流中的过场动画,并取得了巨大成功。本质上,你把整个图像当作一个1D向量,然后进行余弦相似度度量。基本上,小的角度意味着接近匹配,大的值意味着不匹配。阈值需要针对您的数据集进行一些调优,但它可能有效,而且非常快。

归一化的相互关系应该更健壮,但它将花费更多的时间。既然你提到需要处理不同的姿势,你也应该看看特征检测和提取解决方案。请查看opencv的matcher_simple.cpp和matching_to_many_images.cpp示例。这些技术对尺度和旋转差异有一定的容忍度。

希望这对你有帮助!

最新更新