使用PIL的ImageChops.add混合黑白得到白色而非灰色问题咨询
问题原因
你调用的ImageChops.add()的运算逻辑是两个图片对应像素点的RGB通道值直接相加,大于255的结果会被截断为255:
- 红绿混合的场景下,红色
[255,0,0]和绿色[0,255,0]各通道相加后结果为[255,255,0],没有超过255阈值,刚好是你预期的黄色,所以结果正常。 - 黑白混合的场景下,黑色
[0,0,0]和白色[255,255,255]各通道相加后结果为[255,255,255],和原白色数值一致,因此最终输出还是白色,不会得到灰色。
解决方案
如果你需要实现两张图片等比例混合得到中间色的效果,替换ImageChops.add为ImageChops.blend方法即可,该方法支持自定义混合权重:
from PIL import Image, ImageChops import matplotlib.pylab as plt im1 = Image.open(r'.\black.jpg') im2 = Image.open(r'.\white.jpg') # 第三个参数alpha为0.5代表两张图片的权重各占50% result = ImageChops.blend(im1, im2, 0.5) plt.imshow(result)
用上述代码混合黑白图片时,每个通道的计算逻辑为0 * 0.5 + 255 * 0.5 = 127.5,取整后得到[127,127,127],就是你预期的中性灰色。
内容的提问来源于stack exchange,提问作者Lyrk
相关产品推荐
相关产品推荐

