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

9

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

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

主要问题:

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

  • 将图像转换为RGB格式(透明 -> 白色)(或者可能转换为单色?)
  • 将较小的图像缩放到与较大的图像相同的大小
  • 将每个通道(如果转换为单色,则只有一个通道)转换为序列(项值=像素的颜色值)
  • 计算两个序列之间的Levenshtein距离

当然,这种方法无法处理镜像图像、裁剪图像等情况。但对于基本比较,这应该是有用的。

是否有更好的策略在某个地方有记录?

编辑:Aaron H关于速度问题是正确的。计算Levenshtein距离对于几百乘以几百像素以上的图像需要很长时间。然而,在将图像缩小到100x100和200x200后的结果之间的差异在我的示例中不到1%,因此可能明智地设置最大图像大小为~100px左右... 编辑:谢谢PreludeAndFugue,那个问题正是我在寻找的。
顺便说一句,Levenshtein距离似乎可以进行优化,但它给我带来了一些非常糟糕的结果,也许是因为背景中有大量冗余元素。必须看一些其他算法。 编辑:均方根偏差和峰值信噪比似乎是另外两个选择,它们不太难实现,并且似乎不太耗费CPU。然而,似乎我需要某种上下文分析来识别形状等。
无论如何,感谢所有链接,还有指向NumPy/SciPy方向的指引。

1
我无法直接回答,但我怀疑由于放大时数据失去精度,你将会在两者之间有很多"距离",而缩小较大的可能会导致两者之间更接近的关系。至于Levenshtein距离,我不知道,但这句引用自维基百科的话让我对它在此应用中的有用性持怀疑态度:"Levenshtein距离也可以在两个较长的字符串之间计算,但计算成本(大致与两个字符串长度的乘积成比例)使这种方法不可行。" - Aaron H.
这个问题可能会有所帮助:https://dev59.com/FnRB5IYBdhLWcg3weHLx - Gary Kerr
此外,将PIL图像转换为numpy数组以进行数学操作。numpy旨在操作大量的数值数据数组。此问题展示了该过程:https://dev59.com/h3RC5IYBdhLWcg3wMd5S - Gary Kerr
2个回答

5

请查看imgSeek

imgSeek是一组自由开源的视觉相似性项目。查询(您要查找的图像)可以表示为用户绘制的草图或您提供的另一张图像(或您收藏的图像)。搜索算法利用查询和数据库图像的多分辨率小波分解。


2
您可以查看stsci库,它是用于比较和分析图像的。它应该能够给您想要的,但可能有点过度。如果您想保持简单,可以先减少颜色和分辨率,然后再计算距离。

事实证明,距离计算的问题在于它并不适用于在图像中查找相似内容,因为很多背景是相同的;我认为我需要一个更强大的算法。 - Attila O.
1
在这种情况下,您可能需要傅里叶分析来检测图像中的线条并比较形状。但这有点棘手。尽管scipy在这方面可能会对您有很大帮助。 - Wolph

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接