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

Posted

技术标签:

【中文标题】使用 Python/PIL 比较(相似)图像【英文标题】:Comparing (similar) images with Python/PIL 【发布时间】: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 距离也可以在两个较长的字符串之间计算,但是计算它的成本,大致与两个字符串长度的乘积成正比,因此这不切实际。” 这个问题可能会有所帮助:***.com/questions/613146/… 另外,将 PIL 图像转换为 numpy 数组以进行数学运算。 numpy 旨在处理大量数值数据。这个问题显示了程序:***.com/questions/384759/pil-and-numpy 【参考方案1】:

查看imgSeek:

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

【讨论】:

【参考方案2】:

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

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

【讨论】:

好吧,事实证明,距离计算的问题在于它不适合在图像中找到相似的内容,因为很多背景是相同的;我想我在这里需要一个更强大的算法。 在这种情况下,您可能需要傅立叶分析来检测图像中的线条并比较形状。但这有点棘手。尽管 scipy 可能会在该领域为您提供很多帮助。

以上是关于使用 Python/PIL 比较(相似)图像的主要内容,如果未能解决你的问题,请参考以下文章

python pil 怎么安装

如何使图像亮度均匀(使用 Python/PIL)

如何使用 Python PIL 模糊图像的非矩形或圆形区域?

使用 Python / PIL 进行多边形裁剪/剪辑

使用 Python PIL 的隐写算法

如何使用 Python PIL 或 CV 裁剪图像?