【opencv】关于调整对比度与亮度的视觉算法

方法1:线性调整对比度与亮度

如公式1所示,表示原先像素点的像素值,c表示的权重值,b表示加权和后的图像的偏移量,表示调整后改像素点的像素值。在该算法中,将对比度与亮度设计为线性关系。

v’ = v*c+b
代码:

def Change_contrast_brightness(img, c, b):
    h, w, d = img.shape
    blank = np.zeros([h, w, d], dtype=np.uint8)
    dst = cv2.addWeighted(img, c, blank, 1 - c, b)
    return dst
    
img = cv2.imread(path_org)
dst1 = Change_contrast_brightness(img, 1.5, 10)

效果:会出现过度曝光,画面失真,噪点多。
【opencv】关于调整对比度与亮度的视觉算法
【opencv】关于调整对比度与亮度的视觉算法
(左侧第一张为原图)

方法2:gamma变换

Gamma变换又称为指数变换或幂次变换,是另外一种常用的灰度非线性变换。图像灰度的伽马变换一般表示如公式(5)所示。首先,需要先进行归一化,然后将gamma作为指数求出新的像素值,最后再还原。
【opencv】关于调整对比度与亮度的视觉算法
Gamma变换如图5所示,当 gamma<1时,如蓝线所示,在低灰度值区域内,动态范围变大,进而图像对比度增强;在高灰度值区域内,动态范围变小,图像对比度降低。
当 gamma >1时,如红线所示,低灰度值区域的动态范围变小,高灰度值区域在动态范围内变大,降低了低灰度值区域图像对比度。提高了高灰度值区域图像对比度。同时,图像整体的灰度值变小。当 gamma=1时,该灰度变换是线性的,此时通过线性方式改变原图像。

【opencv】关于调整对比度与亮度的视觉算法

代码:

def gamma_trans(img, gamma):
    gamma_table = [np.power(x / 255.0, gamma) * 255.0 for x in range(256)]
    gamma_table = np.round(np.array(gamma_table)).astype(np.uint8)

    return cv2.LUT(img, gamma_table)  

img = cv2.imread(path_org)
img2 = gamma_trans(img,1.5)

效果:
采用Gamma变换的图像质量显然更好,亮度不会过度曝光,噪声少,图像整体协调,能够带来非常令人舒适的画面效果,非常适合于优化图像视觉效果。
将这个变换添加入图像增强,随机调节对比度与亮度,可以有效提升模型性能!
例如:

im = gamma_trans(im, random.uniform(0.5, 2.0))

【opencv】关于调整对比度与亮度的视觉算法
【opencv】关于调整对比度与亮度的视觉算法
(左侧第一张为原图)

上一篇:Mind the Box: $\ell_1$-APGD for Sparse Adversarial Attacks on Image Classifiers


下一篇:常用连续分布