调用PIL.ImageChops.overlay报AttributeError找不到方法该如何解决
问题解决方案
报错原因
ImageChops.overlay 是Pillow 9.1.0版本才新增的接口,出现该报错是因为你本地安装的Pillow版本低于要求的最低版本。
修复步骤
- 第一步:查看本地Pillow版本,执行命令:
pip show pillow
查看返回结果里的Version字段,如果数值小于9.1.0即可确认是版本问题。 - 第二步:升级Pillow到最新版本,执行命令:
pip install --upgrade pillow
如果使用conda管理环境,对应执行:conda update pillow - 注意事项:如果升级后仍然报错,确认你运行代码的Python解释器和执行升级命令的pip属于同一环境,避免多环境下升级错位置的问题。
低版本兼容替代方案
如果暂时无法升级Pillow,可以手动实现overlay混合效果,对应逻辑和代码如下:
overlay混合算法规则:
对两个图层的每个像素点做计算:若底层像素值≤128,结果值=2上层像素值底层像素值/255;若底层像素值>128,结果值=255 - 2*(255-上层像素值)*(255-底层像素值)/255
对应代码替换原有ImageChops.overlay调用即可:
from PIL import Image import matplotlib.pylab as plt import numpy as np im1= Image.open(r'.\white.jpg') im2= Image.open(r'.\green.jpg') # 手动实现overlay效果 im1_arr = np.array(im1).astype(np.float32) im2_arr = np.array(im2).astype(np.float32) mask = im1_arr <= 128 result_arr = np.zeros_like(im1_arr) result_arr[mask] = 2 * im1_arr[mask] * im2_arr[mask] / 255 result_arr[~mask] = 255 - 2 * (255 - im1_arr[~mask]) * (255 - im2_arr[~mask]) / 255 result = Image.fromarray(result_arr.astype(np.uint8)) plt.imshow(result)
内容的提问来源于stack exchange,提问作者Lyrk
相关产品推荐
相关产品推荐

