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")
  • 测试效果图
    处理后,亮暗分明,符合预期.
相关推荐
欧特克_Glodon1 天前
OpenCV计算机视觉开发入门与实践<二十七>:图像分割概述
c++·人工智能·opencv·计算机视觉
hahaha60161 天前
HLS高层次综合设计技巧--C++类和模板
图像处理·人工智能·算法·计算机视觉
qq_25294131682 天前
航拍羊群目标检测数据集 | 航拍羊群 智慧畜牧业 动物检测 无人机巡检5010期
人工智能·yolo·目标检测·计算机视觉·无人机·羊群识别·羊群
AndrewHZ2 天前
图像处理入门021 | 直方图:图像像素分布的可视化 —— cv2.calcHist 与 4 类典型分布
图像处理·opencv·直方图·直方图均衡化·cdf·灰度直方图·多通道直方图
音视频牛哥2 天前
拆解人形机器人:从关节、灵巧手到VLA与媒体神经系统
机器学习·计算机视觉·机器人
爱吃火鸡面呀2 天前
OpenCV 实战:文档扫描与神经风格迁移完整指南
人工智能·opencv·计算机视觉
java1234_小锋2 天前
YOLO26 计算机视觉 - 训练自己的 YOLO26 模型
人工智能·yolo·机器学习·计算机视觉·yolo26
Hello-FPGA2 天前
量子计算滨松c15550-22up单光子相机与PCIe1004采集卡
人工智能·计算机视觉·fpga开发
梦想的颜色2 天前
【AI科普】什么是计算机视觉:硬核科普,它和大 AI 大模型到底是什么关系
人工智能·深度学习·计算机视觉·多模态·aiagent·#vlm·ai工程实战
hahaha60162 天前
HLS高层次综合设计技巧--循环merge和循环split
人工智能·算法·计算机视觉