openISP学习15-BCC — Brightness/Contrast Control(亮度/对比度控制)

文章目录

1.算法原理

对 Y(亮度)通道进行全局亮度和对比度调整。

  • 增加亮度: 原理就是在原像素的基础上,加上一定的亮度
    bcc_img = self.img + self.brightness
  • 增加对比度:
    对比度调整的目的就是,亮的更亮,暗的更暗 .注意下面我们是以127为分界线的,这个值可以动态调整.
    从下面可以看到,当当前像素亮度超过 127,那么(self.img - 127) * self.contrast 将会是一个正值,在加上之前的像素值,则处理后的像素更亮. 反之如果亮度值小于127,那么(self.img - 127) * self.contrast得到的是一个负值, 则运算后图像亮度更低.
    self.img + (self.img - 127) * self.contrast

关键数学公式

复制代码
output = input + brightness + (input - 127) × contrast
       = input × (1 + contrast) + brightness - 127 × contrast

等效于以 127 为中心点的线性变换(斜率=1+contrast,截距=brightness-127×contrast)。

  • brightness > 0 → 整体变亮;brightness < 0 → 整体变暗
  • contrast > 0 → 对比度增加(亮更亮,暗更暗);contrast < 0 → 对比度降低

2.代码实现

实现细节

  • 使用 int16 中间类型防止溢出
  • 主程序中 contrast 在传入前额外除以 2^5=32(避免重复),使用时注意这个缩放
  • 最终 clip 到 [0, bcc_clip]

关键参数

参数 说明 典型值
brightness 亮度偏置,范围 -255, 255 10
contrast 对比度系数,范围 -1, 4(除以 32 后) ~0.31
clip 输出 clip 255
python 复制代码
class BCC:
    'Brightness Contrast Control'

    def __init__(self, img, brightness, contrast, clip):
        self.img = img
        self.brightness = brightness
        self.contrast = contrast
        self.clip = clip

    def clipping(self):
        np.clip(self.img, 0, self.clip, out=self.img)
        return self.img

    def execute(self):
        img_h = self.img.shape[0]
        img_w = self.img.shape[1]
        bcc_img = np.empty((img_h, img_w), np.int16)
        bcc_img = self.img + self.brightness
        bcc_img = bcc_img + (self.img - 127) * self.contrast
        self.img = bcc_img
        return self.clipping()

2.测试程序

亮度增加测试

生成一个,8x8的灰度图,每个灰度值为100,然后再原来亮度的基础上增加50.

python 复制代码
    def test_brightness_increase(self):
        """brightness=50 时,所有像素应增加约 50。"""
        img = make_gray(8, 8, val=100).astype(np.int16)
        bcc = BCC(img.copy(), brightness=50, contrast=0, clip=255)
        out = bcc.execute()
        show_gray_images(img, out,"left", "right-bright")
        np.testing.assert_array_equal(out, 130)
  • 测试效果图
    如预期,图像整体亮度得到提升.

对比度增加

这里构建了一个8x8亮暗的图像,初始图像对比度不高,图像看起来灰蒙蒙的,对比度增加2倍后,亮暗分明.

python 复制代码
    def test_contrast_increase(self):
        bright_img = make_gray(8, 8, val=150).astype(np.int16)
        bright_img[:] = [
            [100, 100, 100, 100, 100, 100, 100, 100],
            [130, 130, 130, 130, 130, 130, 130, 130],
            [80, 80, 80, 80, 80, 80, 80, 80],
            [150, 150, 150, 150, 150, 150, 150, 150],
            [50, 50, 50, 50, 50, 50, 50, 50],
            [160, 160, 160, 160, 160, 160, 160, 160],
            [100, 100, 100, 100, 100, 100, 100, 100],
            [160, 160, 160, 160, 160, 160, 160, 160]
        ]

        bcc_bright = BCC(bright_img.copy(), brightness=0, contrast=2.0, clip=255)
        out_bright = bcc_bright.execute()
        show_gray_images(bright_img, out_bright,"left", "right-contrast")
  • 测试效果图
    处理后,亮暗分明,符合预期.
相关推荐
拜小白10 小时前
【论文解读】《DeepPanoContext:用全局场景关系图 + 可微关系优做全景 3D 场景理解
深度学习·计算机视觉·全景图
山顶夕景11 小时前
【VLM】AdaCodec:用“预测视觉码”替代逐帧RGB输入
计算机视觉·视频问答·多模态理解·视觉token压缩
深圳市快瞳科技有限公司12 小时前
野外鸟类AI识别落地实录:输入适配、结构化输出、去重聚合与置信度分流的工程实践
算法·计算机视觉·鸟类识别·鸟类ai识别·野外鸟类观测·林业调查
zwc321043205520 小时前
Day 2:图像内存、数据类型与stride
c++·人工智能·opencv·算法·计算机视觉
誰能久伴不乏21 小时前
OpenCV 入门(二):像素访问、ROI 与深浅拷贝
人工智能·opencv·计算机视觉
zwc32104320551 天前
第四周第五天——重构成类
c++·人工智能·opencv·算法·计算机视觉
Solange__1 天前
物流园区怎么用AI生成3D调度预演?从道路底图、车辆转弯到网页评审
图像处理·人工智能·游戏·3d·ai·自然语言处理·关卡设计
椒颜皮皮虾྅1 天前
模型部署不再卡在环境上:DeploySharp 四大推理引擎与 Windows/Linux 离线交付实战
linux·运维·开发语言·人工智能·windows·计算机视觉·cuda
zwc32104320551 天前
Day 5:threshold与inRange阈值分割
c++·图像处理·人工智能·opencv·算法·计算机视觉
拜小白2 天前
【论文解读】ZInD:带标注平面图、360° 全景与 3D 房间布局的 Zillow 室内数据集
深度学习·计算机视觉·全景图