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

use*_*979 7 opencv compare image image-processing

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

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

我试图计算两个图像的欧几里德距离,但结果只有当像素完全相互适合时才有效.现在我正在寻找替代品.

到目前为止,我考虑使用标准化的互相关,但我真的不知道它是否适合我的任务.

问题是,如果规范化的互相关值得尝试,或者有更好的方法来解决我的问题!

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

非常感谢


谢谢你的建议.我有点困惑,因为标准化的交叉相关和Haussdorff距离似乎有利于在大图中找到一个小图案.

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

以下是必须比较的2张图像的示例.目前我正在比较大约120张图片 - 一对一秒.

太糟糕了,我不能以新用户的身份发布图片.所以这是直接链接:http: //s14.directupload.net/file/d/2674/t8qzbq9i_png.htm

mev*_*ron 1

您还可以检查余弦相似度。我使用它在检测视频流中的过场动画方面取得了巨大成功。本质上,您将整个图像视为一维向量,并继续进行余弦相似度测量。基本上,小角度意味着紧密匹配,而大值意味着不匹配。阈值需要对您的数据集进行一些调整,但它可能有效,而且速度非常快。

归一化互相关应该更稳健,但需要更多时间。既然您提到需要处理不同的姿势,您还应该查看特征检测和提取解决方案。查看 opencv 的matcher_simple.cppmatching_to_many_images.cpp示例。这些技术对比例和旋转差异有一定的容忍度。

希望这有帮助!