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

9 投票
2 回答
10959 浏览
提问于 2025-04-15 21:23

我正在尝试用 Python 2.6 和 PIL 计算两张图片的相似度(也就是莱文斯坦距离)。

我打算使用python-levenshtein这个库来快速比较。

主要问题是:

比较图片的好方法是什么?我想的步骤大概是:

  • 把图片转换成 RGB 颜色模式(透明的部分变成白色)(或者也许转换成单色?)
  • 把较小的图片放大到较大图片的大小
  • 把每个颜色通道(如果转换成单色,就是唯一的通道)转换成一个序列(每个值代表像素的颜色值)
  • 计算这两个序列之间的莱文斯坦距离

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

有没有更好的方法被记录下来呢?

补充:Aaron H 说得对,速度确实是个问题。对于几百像素的图片,计算莱文斯坦距离的时间会很长。不过,在我的例子中,把图片缩小到 100x100 和 200x200 后,结果的差别不到 1%,所以可能设置一个最大图片大小在 100 像素左右是明智的……

补充:谢谢 PreludeAndFugue,这个问题正是我想要的。

顺便说一下,莱文斯坦距离似乎可以优化,但我得到的结果很糟糕,可能是因为背景中有很多冗余元素。我得看看其他算法。

补充:均方根偏差和峰值信噪比似乎是另外两个不难实现且对 CPU 负担不大的选项。不过,我似乎需要某种上下文分析来识别形状等。

总之,感谢大家提供的链接,也感谢你们指引我朝 NumPy/SciPy 的方向前进。

2 个回答

5

看看 imgSeek

imgSeek 是一组免费的开源视觉相似性项目。你要找的图片可以是用户自己画的粗略草图,也可以是你提供的另一张图片(或者你收藏中的一张图片)。它的搜索算法使用了一种叫做多分辨率小波分解的方法来处理你要找的图片和数据库中的图片。

2

你可以看看这个 stsci 库,它是专门用来比较和分析图像的。这个库应该能满足你的需求,不过可能功能有点多,使用起来会比较复杂。

如果你想简单点,可以先减少图像的颜色数量和分辨率,然后再计算它们之间的距离。

撰写回答