我正在尝试使用 Python 2.6 和 PIL 计算两个图像的相似度(阅读:Levenshtein distance)。
我计划使用python-levenshtein库进行快速比较。
主要问题:
比较图像的好策略是什么?我的想法是这样的:
- 转换为 RGB(透明 -> 白色)(或者可能转换为单色?)
- 将较小的放大到较大的尺寸
- 将每个通道(= 唯一通道,如果转换为单色)转换为序列(项目值 = 像素的颜色值)
- 计算两个序列之间的 Levenshtein 距离
当然,这不会处理镜像图像、裁剪图像等情况。但是对于基本比较,这应该很有用。
是否有更好的策略记录在某处?
编辑: Aaron H 在速度问题上是对的。对于大于几百乘几百像素的图像,计算 Levelshtein 大约需要永远。但是,在我的示例中,缩小到 100x100 和 200x200 后的结果之间的差异小于 1%,因此将最大图像尺寸设置为 ~100px 左右可能是明智之举......
编辑:谢谢 PreludeAndFugue,这个问题就是我要找的。
顺便说一句,Levenshtein 距离似乎可以优化,但它给了我一些非常糟糕的结果,可能是因为背景中有很多冗余元素。必须看看其他一些算法。
EIDT:均方根偏差和峰值信噪比似乎是另外两个不太难实现的选项,而且看起来 CPU 开销也不是很大。但是,似乎我需要某种上下文分析来识别形状等。
无论如何,感谢所有链接,也感谢您指出 NumPy/SciPy 的方向。