使用Python/PIL比较(类似)图像

Att*_* O. 8 python fuzzy-logic fuzzy-comparison python-imaging-library

我正在尝试使用Python 2.6和PIL 计算两个图像的相似度(读取:Levenshtein距离).

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

主要问题:

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

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

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

在某处记录了更好的策略吗?

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

编辑:感谢PreludeAndFugue,这个问题就是我想要的.

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

EIDT:均方根偏差和峰值信噪比似乎是另外两个选项,不是很难实现,看起来不是很昂贵.但是,似乎我需要某种上下文分析来识别形状等.

无论如何,感谢所有的链接,并指出朝向NumPy/SciPy的方向.

Udi*_*Udi 5

看看imgSeek:

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


Wol*_*lph 2

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

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