使用 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 比较(相似)图像的主要内容,如果未能解决你的问题,请参考以下文章