方法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)
效果:会出现过度曝光,画面失真,噪点多。
(左侧第一张为原图)
方法2:gamma变换
Gamma变换又称为指数变换或幂次变换,是另外一种常用的灰度非线性变换。图像灰度的伽马变换一般表示如公式(5)所示。首先,需要先进行归一化,然后将gamma作为指数求出新的像素值,最后再还原。
Gamma变换如图5所示,当 gamma<1时,如蓝线所示,在低灰度值区域内,动态范围变大,进而图像对比度增强;在高灰度值区域内,动态范围变小,图像对比度降低。
当 gamma >1时,如红线所示,低灰度值区域的动态范围变小,高灰度值区域在动态范围内变大,降低了低灰度值区域图像对比度。提高了高灰度值区域图像对比度。同时,图像整体的灰度值变小。当 gamma=1时,该灰度变换是线性的,此时通过线性方式改变原图像。
代码:
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))
(左侧第一张为原图)