9

我正在尝试使用 Python 2.6 和 PIL 计算两个图像的相似度(阅读:Levenshtein distance)。

我计划使用python-levenshtein库进行快速比较。

主要问题:

比较图像的好策略是什么?我的想法是这样的:

  • 转换为 RGB(透明 -> 白色)(或者可能转换为单色?)
  • 将较小的放大到较大的尺寸
  • 将每个通道(= 唯一通道,如果转换为单色)转换为序列(项目值 = 像素的颜色值)
  • 计算两个序列之间的 Levenshtein 距离

当然,这不会处理镜像图像、裁剪图像等情况。但是对于基本比较,这应该很有用。

是否有更好的策略记录在某处?

编辑: Aaron H 在速度问题上是对的。对于大于几百乘几百像素的图像,计算 Levelshtein 大约需要永远。但是,在我的示例中,缩小到 100x100 和 200x200 后的结果之间的差异小于 1%,因此将最大图像尺寸设置为 ~100px 左右可能是明智之举......

编辑:谢谢 PreludeAndFugue,这个问题就是我要找的。

顺便说一句,Levenshtein 距离似乎可以优化,但它给了我一些非常糟糕的结果,可能是因为背景中有很多冗余元素。必须看看其他一些算法。

EIDT:均方根偏差和峰值信噪比似乎是另外两个不太难实现的选项,而且看起来 CPU 开销也不是很大。但是,似乎我需要某种上下文分析来识别形状等。

无论如何,感谢所有链接,也感谢您指出 NumPy/SciPy 的方向。

4

2 回答 2

5

查看imgSeek

imgSeek 是一个免费的开源视觉相似性项目的集合。查询(您正在查找的图像)可以表示为用户绘制的粗略草图,也可以表示为您提供的另一个图像(或您收藏中的图像)。搜索算法利用查询和数据库图像的多分辨率小波分解。

于 2011-10-27T06:03:21.793 回答
2

您可以查看stsci库,它用于比较和分析图像。它应该给你你想要的,但可能有点矫枉过正。

如果你想保持简单,你可以先减少颜色数量和分辨率,然后计算距离。

于 2010-04-08T23:01:01.177 回答