使用Python/PIL比较(相似)图像
我正在尝试用 Python 2.6 和 PIL 计算两张图片的相似度(也就是莱文斯坦距离)。
我打算使用python-levenshtein这个库来快速比较。
主要问题是:
比较图片的好方法是什么?我想的步骤大概是:
- 把图片转换成 RGB 颜色模式(透明的部分变成白色)(或者也许转换成单色?)
- 把较小的图片放大到较大图片的大小
- 把每个颜色通道(如果转换成单色,就是唯一的通道)转换成一个序列(每个值代表像素的颜色值)
- 计算这两个序列之间的莱文斯坦距离
当然,这样的方法不能处理镜像图片、裁剪过的图片等情况。但对于基本的比较,这应该是有用的。
有没有更好的方法被记录下来呢?
补充:Aaron H 说得对,速度确实是个问题。对于几百像素的图片,计算莱文斯坦距离的时间会很长。不过,在我的例子中,把图片缩小到 100x100 和 200x200 后,结果的差别不到 1%,所以可能设置一个最大图片大小在 100 像素左右是明智的……
补充:谢谢 PreludeAndFugue,这个问题正是我想要的。
顺便说一下,莱文斯坦距离似乎可以优化,但我得到的结果很糟糕,可能是因为背景中有很多冗余元素。我得看看其他算法。
补充:均方根偏差和峰值信噪比似乎是另外两个不难实现且对 CPU 负担不大的选项。不过,我似乎需要某种上下文分析来识别形状等。
总之,感谢大家提供的链接,也感谢你们指引我朝 NumPy/SciPy 的方向前进。