# -*- coding=GBK -*-
import cv2 as cv
import numpy as np
# 粗略的调节对比度和亮度
def contrast_brightness_image(src1, a, g):
h, w, ch = src1.shape # 获取shape的数值,height和width、通道
src2 = np.zeros([h, w, ch], src1.dtype) # 新建全零图片数组src2,将height和width,类型设置为原图片的通道类型(色素全为零,输出为全黑图片)
# type() 返回数据结构类型(list、dict、numpy.ndarray 等)
# dtype() 返回数据元素的数据类型(int、float等)
dst = cv.addWeighted(src1, a, src2, 1 - a, g) # addWeighted函数说明如下
# addWeighted函数:官方:计算两个图像阵列的加权和 我的理解是按照所占比例合成两张图片。
# addWeighted(InputArray src1, double alpha, InputArray src2, double beta, double gamma, OutputArray dst, int dtype=-1);
# a表示图一src1的权重,1-a图二src2的权重
# 有公式得出两个图片加成输出的图片为:dst=src1*alpha+src2*beta+gamma
cv.namedWindow("con-bri-demo", cv.WINDOW_NORMAL)
cv.resizeWindow("con-bri-demo", 500, 300)
cv.imshow("con-bri-demo", dst)
src = cv.imread("fengling.jpg")
cv.namedWindow("before", cv.WINDOW_NORMAL)
cv.resizeWindow("before", 500, 300)
cv.imshow("before", src)
contrast_brightness_image(src, 3, 0) # 第二个输入参数是对比度;第三个为偏差
cv.waitKey(0)
cv.destroyAllWindows()
第二遍算是大致明白了addWeighted()输入参数代表的意思了
1、如果只提高一张图片的对比度和亮度,那么 dst = cv.addWeighted(src1, a, src2, 1 - a, g) 中a的值表示的是原图像src1提高的对比度(0-1变暗,大于1变亮),因为只提高一张图片的对比度和亮度那么图像src2只能为0矩阵,所以1 - a可以为任意数,并不会影响addWeighted()的结果
2、但是如果是两张图片合成,那么除了提高原图像src1对比度的a值外,1 - a 中的1也要按条件选,这个1指的是src1和src2的对比度相对参数(relative parameters)
举个例子,如果把alpha比作企业A定期的营业额,beta比作企业B定期的营业额,relative parameters 视为 0,那么 alpha = beta = relative parameters = 0 时,意为两个企业营业额为0,而0就作为营业额的最初状态。而在dst = cv.addWeighted(src1, a, src2, 1 - a, g)中relative parameters 为1,表示为两张图片的最开始的状态是对比度为1。当然不仅仅为1,根据需求可以为其他值。
因为权重没有负数,所以addWeighted()输入参数 alpha、beta 在操作的过程中只会取绝对值
3、dst = cv.addWeighted(src1, a, src2, 1 - a, g) 中的g表示的是亮度变化值,可正可负,> 0 图像亮度值越高,< 0 图像亮度值减小