【发布时间】:2011-02-05 22:02:24
【问题描述】:
我正在尝试使用 Python 2.6 和 PIL 计算两个图像的 相似度(阅读:Levenshtein 距离)。
我计划给我们 e python-levenshtein 库用于快速比较。
主要问题:
比较图像的好策略是什么?我的想法是这样的:
- 转换为 RGB(透明 -> 白色)(或者可能转换为单色?)
- 将较小的放大到较大的尺寸
- 将每个通道(= 唯一通道,如果转换为单色)转换为序列(项目值 = 像素的颜色值)
- 计算两个序列之间的 Levenshtein 距离
当然,这不会处理镜像图像、裁剪图像等情况。但是对于基本比较,这应该很有用。
是否有更好的策略记录在某处?
编辑: Aaron H 在速度问题上是对的。对于大于几百乘几百像素的图像,计算 Levelshtein 大约需要永远。但是,在我的示例中,缩小到 100x100 和 200x200 后的结果之间的差异小于 1%,因此将最大图像尺寸设置为 ~100px 左右可能是明智之举...
编辑:感谢 PreludeAndFugue,我一直在寻找这个问题。
顺便说一句,Levenshtein 距离似乎可以优化,但它给了我一些非常糟糕的结果,可能是因为背景中有很多冗余元素。得看看其他一些算法。
EIDT: 均方根偏差和峰值信噪比似乎是另外两个不太难实现的选项,而且看起来 CPU 开销也不是很大。但是,我似乎需要某种上下文分析来识别形状等。
无论如何,感谢所有链接,也感谢您指出 NumPy/SciPy 的方向。
【问题讨论】:
-
我无法直接回答,但我怀疑由于放大时数据的精度损失,两者之间会有很大的“距离”,其中缩小越大可能会拉近两人的关系。 -- 至于 Levenshtein 距离,我不知道,但是来自 wikipedia 的这句话让我怀疑它在这个应用程序中的用处:“Levenshtein 距离也可以在两个较长的字符串之间计算,但是计算它的成本,大致与两个字符串长度的乘积成正比,因此这不切实际。”
-
这个问题可能会有所帮助:stackoverflow.com/questions/613146/…
-
另外,将 PIL 图像转换为 numpy 数组以进行数学运算。 numpy 旨在处理大量数值数据。这个问题显示了程序:stackoverflow.com/questions/384759/pil-and-numpy
标签: python python-imaging-library fuzzy-logic fuzzy-comparison