如何在Pillow与np.ndarray中手动提升图像亮度?
解决Image.fromarray转换np.ndarray时的亮度调整异常问题
问题根源
将PIL图像转为np.ndarray时,默认数据类型是uint8,取值范围被限制在0-255之间。直接对这类数组执行加法操作时,一旦原像素值加上亮度因子后超过255,就会触发无符号整数溢出:比如240+30=270,在uint8类型中会被截断为270-256=14,原本明亮的像素反而变成深色,最终导致图像出现异常效果。
修正逻辑解析
修正后的代码通过三个关键步骤解决了溢出问题:
- 提升数据精度:先将数组转换为
np.uint16类型(取值范围0-65535),给加法操作留出足够的空间,避免溢出。 - 约束像素范围:使用
np.clip()将所有像素值强制限制在0-255之间,确保结果符合RGB图像的标准取值范围。 - 还原数据类型:处理完成后再将数组转回
uint8类型,匹配PIL图像的格式要求。
原错误代码
from PIL import Image import numpy as np class Imagem: def __init__(self, path_imagem): self.image = Image.open(path_imagem) def brightness(self, factor): # 注:原代码中self.imagem应为self.image,属于笔误 array_imagem = np.array(self.image) array_imagem = array_imagem + factor self.image = Image.fromarray(array_imagem, mode='RGB') if __name__ == '__main__': img = Imagem('./assets/panda.png') img.brightness(30) img.image.show()
修正后代码
from PIL import Image import numpy as np class Imagem: def __init__(self, path_imagem): self.image = Image.open(path_imagem) def brightness(self, factor): array_imagem = np.array(self.image) array_imagem = array_imagem.astype(np.uint16) array_imagem = array_imagem + factor array_imagem = np.clip(array_imagem, a_min=0, a_max=255) self.image = Image.fromarray(array_imagem.astype(np.uint8), mode='RGB') if __name__ == '__main__': img = Imagem('./assets/panda.png') img.brightness(30) img.image.show()
内容的提问来源于stack exchange,提问作者Diogo Lima
相关产品推荐
相关产品推荐

