【问题标题】:How do I compare two edge-images (in OpenCV)?如何比较两个边缘图像(在 OpenCV 中)?
【发布时间】:2011-12-04 15:36:24
【问题描述】:

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

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

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

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

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

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

非常感谢


感谢您的建议。我有点困惑,因为归一化互相关和豪斯多夫距离似乎有利于在大图中找到小模式。

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

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

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

【问题讨论】:

  • 示例链接已发布。
  • +1 有趣的问题。您也可以在边缘检测之前发布图像吗?这将有助于为您的问题添加一些上下文。
  • 一般来说,上图只显示了第二张图中显示的建筑物的渲染模型。两幅图像都是 8 位灰度图像。现在的任务是将虚拟相机设置在与现实相机相同的位置和方向。这必须通过将大量渲染(具有不同相机姿势)与真实照片进行比较来实现。

标签: image image-processing opencv compare


【解决方案1】:

以 Haussdorff 距离为起点进行实验怎么样?总体思路和c实现here。文章在这里:

Comparing images using the Hausdorff distance,DP Huttenlocher - 1993 年。

【讨论】:

    【解决方案2】:

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

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

    希望对你有帮助!

    【讨论】:

    • 对于高维数据,例如图像,我预计欧几里得距离和余弦相似度之间不会有任何显着差异。
    猜你喜欢
    • 2014-11-18
    • 2014-11-07
    • 1970-01-01
    • 2011-06-18
    • 1970-01-01
    • 2016-04-18
    • 1970-01-01
    • 1970-01-01
    • 2021-07-05
    相关资源
    最近更新 更多