You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 10:00:05