原理
假设输入图像为I,宽为W、高为H,输出图像记为O,图像的线性变换可以利用以下公式定义:
\[O(r,c) = a*I(r,c) + b, 0 \leq r< H, 0 \leq c < W\]
当a=1,b=0时,O为I的一个副本;如果a>1,则输出图像O的对比度比I有所增大;如果a<1,则O的对比度比I有所 减小。 而b值的改变,影响的是输出图像的亮度,当b>0时,亮度增加; 当b<0时,亮度减小。
代码
# !/usr/bin/env python
# -*-encoding: utf-8-*-
# author:LiYanwei
# version:0.1
import cv2
import numpy as np
if __name__ =="__main__":
image = cv2.imread('img1.jpg', cv2.IMREAD_GRAYSCALE)
MAX_VALUE = 120
value = 120
#调整对比度后,图像的效果显示窗口
cv2.namedWindow("contrast",cv2.WND_PROP_AUTOSIZE)
#调整系数,观察图像的变化
def callback_contrast(_value):
#通过线性运算,调整图像对比度
a = float(_value)/40.0
contrastImage = a*image
contrastImage[contrastImage > 255] = 255
contrastImage = np.round(contrastImage)
contrastImage = contrastImage.astype(np.uint8)
cv2.imshow("contrast", contrastImage)
cv2.imwrite("contrast.jpg", contrastImage)
callback_contrast(value)
cv2.createTrackbar("value", "contrast", value, MAX_VALUE, callback_contrast)
cv2.waitKey(0)
cv2.destroyAllWindows()