4.2 对比度调整
1. 对比度调整方法
对比度(Contrast ratio)反应了图片上亮区域和暗区域的层次感。简单的来说就是
使亮的地方更亮,暗的地方更暗。
反应到图像编辑上,调整对比度就是在保证平均亮度不变的情况下,扩大或缩小亮
的点和暗的点的差异。既然是要保证平均亮度不变,所以对每个点的调整比例必须作用
在该值和平均亮度的差值之上,这样才能够保证计算后的平均亮度不变。
最常用的调整对比度的算法是根据图像的灰度进行调整,对于每个像素点,调整公
式为:y = a + k * (x - a)。
公式中 x 表示原始像素点亮度,a 表示整张图片的平均亮度,y 表示调整后的该像
素点亮度,k 为系数。当 0<k<1 时,对比度减弱;当 k>1 时,对比度增强;当 k=1 时,
图像不变。容易证明,经该公式作用后,整张图片的亮度不变。
2. 算法
1) 计算整幅图像的平均亮度 mean(可转灰度图后计算平均值)。
2) 对每一个像素点:
a. 计算 B、G、R 所占比例 b、g、r。
b. 新亮度值 newgray = mean + k * (gray - mean),其中 gray 为该点原亮度值。
c. 根据 B、G、R 比例和新亮度值计算新的 B、G、R。
3) 根据所有点的新 RGB 值,生成图像。
在本实验报告中的结果展示部分取 k = 2.3 和 k = 10/23。
3. 代码
#
调整对比度,系数
k>0
def contrast(filename, k):
img = cv2.imread(filename, cv2.IMREAD_COLOR)
len1, len2, len3 = img.shape
gray = np.dot(img[..., :3], [0.114, 0.587, 0.299])
mean = np.sum(gray[::, ::]) / (len1 * len2) #
平均亮度
result = np.zeros(img.shape, np.int16) #
记录结果
for i in range(len1):
for j in range(len2):
sum_rgb = np.sum(img[i, j, ::])
b = g = r = 1 / 3
if sum_rgb != 0:
b = img[i][j][0] / sum_rgb
g = img[i][j][1] / sum_rgb
r = img[i][j][2] / sum_rgb
newgray = mean + k * (gray[i][j] - mean)
评论0
最新资源