opencv调整图像亮度对比度的示例代码
python-OpenCV 图像处理 -- 改变图像对比度和亮度
采用按像素的方式改变图像对比度和亮度,公式如下
g(x)=αf(x)+β
其中 αα调节对比度, ββ调节亮度
def Contrast_and_Brightness(alpha, beta, img): blank = np.zeros(img.shape, img.dtype) # dst = alpha * img + beta * blank dst = cv2.addWeighted(img, alpha, blank, 1-alpha, beta) return dst
cv2.addWeighted用于两个图片融合
线性变换有个问题,如下图,α=1.3 and β=40,提高原图亮度的同时,导致云几乎看不见了.如果要看见云的话,建筑的亮度又不够.
这个时候就引入了非线性变换. 称之为Gamma correction
(O = \left( \frac{I}{255} \right)^{\gamma} \times 255)
与线性变换不同,对不同的原始亮度值,其改变强度是不同的,是非线性的.
在 γ<1的时候,会提高图片亮度.>1时,降低亮度.
如果查看不同变换下的灰度直方图的话可以看到.中间是原图的灰度直方图,可以看到低亮度值的像素点很多.
左边是做了线性变换的,整体直方图产生了右移,并且在255处出现峰值.因为每个像素点都增加了亮度嘛.导致了白云和蓝天过于明亮无法区分.
而右边做了gamma校正的图像亮度分布比较均匀,即使得低亮度值的部分得以加强,又不至于过度曝光使得白云无法区分.
实现Gamma correction的代码如下.
lookUpTable = np.empty((1,256), np.uint8) for i in range(256): lookUpTable[0,i] = np.clip(pow(i / 255.0, gamma) * 255.0, 0, 255) res = cv.LUT(img_original, lookUpTable)
其中cv.LUT就是个变换函数.从lookUpTable里找到变换关系,生成新的图像矩阵.https://docs.opencv.org/master/d2/de8/group__core__array.html