Python3 PIL库问题:ImageChops.difference返回None

遇到一个关于python PIL库的问题:在python3中,两张明显不同的图片,使用ImageChops.difference 方法计算他们的差异,diff.getbbox()返回值为None,相同的代码在python2中运行就没有问题:

1
2
3
4
5
im_source_obj = Image.open(self.im_source_path)
im_target_obj = Image.open(self.im_target_path)
diff = ImageChops.difference(im_source_obj, im_target_obj)
if diff.getbbox() is None:
print("图片相同")

我的python3版本为 Python 3.7.6,Pillow== 8.4.0;python2版本为 Python 2.7.16,Pillow == 6.2.2 。

解决方案:

stackoverflow上有类似的问题:https://stackoverflow.com/questions/61812374/imagechops-difference-not-working-with-simple-png-images

转换为RGB通道:

1
2
3
4
5
6
im_source_obj = Image.open(self.im_source_path).convert('RGB')
im_target_obj = Image.open(self.im_target_path).convert('RGB')
print(im_source_obj.mode)
diff = ImageChops.difference(im_source_obj, im_target_obj)
if diff.getbbox() is None:
print("图片相同")

Image.open() 方法默认返回的是RGBA模式,多一个alpha通道,用来记录图像的透明度。其实python2也返回的是RGBA模式,不知道具体是什么原因导致python3中需要转换为RGB通道,也可能是版本问题。

--THE END--

本文标题:Python3 PIL库问题:ImageChops.difference返回None

文章作者:hiyo

文章链接:https://hiyongz.github.io/posts/python-notes-for-pil-problem/

许可协议:本博客文章除特别声明外,均采用CC BY-NC-ND 4.0 许可协议。转载请保留原文链接及作者。

关注微信公众号,及时接收最新技术文章!