图像亮度、对比度、饱和度和锐化之间并不是彼此独立的,改变其中一个特征可能会同时引起图像其他特征的变化,至于变化的程度取决于图像本身的特性,先建立一个概念,在后面的会在详述
1、亮度基本概念
图像亮度通俗理解便是图像的明暗程度,数字图像 f(x,y) = i(x,y) r(x, y) ,如果灰度值在[0,255]之间,则 f 值越接近0亮度越低,f 值越接近255亮度越高。而且我们也要把亮度和对比度区分开来,正如上述提的对比度指的是最高和最低灰度级之间的灰度差。下面通过图片感受一下亮度变化对数字图像的影响:
上面白色和红色两幅图中,图的右边相对于左边增加了亮度,可以看出图像右边相对于左边亮度有了一个整体的提升,这里只是对亮度做了一个小弧度的提升,我们尝试着将亮度提升的更高,如下图:
这里需要强调的是如果我们对亮度做这么一个剧烈的改变,那么便会在改变图片强度的同时也影响了图片的饱和度、对比度和清晰度,此时两个图片右边部分饱和度、对比度和清晰度都降低了,原因是过度增加亮度导致阴影赶上了高光,因为最大灰度值是固定的,所以最低灰度值快赶上了最大灰度值,因此影响了图片的饱和度、对比度和清晰度
2、图像亮度调节示例
- 图像对比度调节可以直接在RGB空间利用变换公式 g(i,j)= af(i,j) + b 对图像进行线性变化;
对于数字图像变换,设原像素灰度为 f(i,j),转化后的像素灰度为 g(i,j),则常用的线性变换是 g(i,j)= af(i,j) + b, 其中系数 a 影响图像的对比度,系数 b 影响图像的亮度,具体如下:
(1) a=1时是原图;
(2) a>1时对比度增强,图像看起来更加清晰;
(3) a<1时对比度减弱,图像看起来变暗;
(4) b影响图像的亮度,随着增加b (b>0)和减小b (b>0),图像整体的灰度值上移或者下移, 也就是图像整体变亮或者变暗, 不会改变图像的对比度
代码:
import cv2
import imutils
import numpy as np
def c_and_b(arg):
''''''
contrast_num = cv2.getTrackbarPos(trackbar_name1, wname)
brightness_num = cv2.getTrackbarPos(trackbar_name2, wname)
#print(bnum)
cimg = np.ones((img.shape[0], img.shape[1], 3), dtype=np.uint8)
for i in range(img.shape[0]):
for j in range(img.shape[1]):
lst = 0.1 * contrast_num * img[i, j] + brightness_num
cimg[i, j] = [int(ele) if ele < 255 else 255 for ele in lst]
cv2.imshow(wname, imutils.resize(cimg, 800))
wname = 'brightness and contrast'
trackbar_name1 = 'contrast'
trackbar_name2 = 'brightness'
img = cv2.imread(r"E:\yun_project\face_morpher\bieber.jpg")
height, width = img.shape[:2]
img = cv2.resize(img, (int(width/height*400), 400), interpolation=cv2.INTER_CUBIC)
cv2.namedWindow(wname)
cv2.createTrackbar(trackbar_name1, wname, 10, 20, c_and_b)
cv2.createTrackbar(trackbar_name2, wname, 0, 100, c_and_b)
c_and_b(0)
if cv2.waitKey(1) & 0xFF == ord('q'):
cv2.destroyAllWindows()
效果:
那么对于两张图像融合时,图像的色调不同, 可以通过调整三色通道,达到调节图像亮度的目的
# 计算指定不规则图像中的平均亮度
def calculate_average_brightness(img):
# 三色通道的平均值
B = img[..., 0].mean()
G = img[..., 1].mean()
R = img[..., 2].mean()
# 显示亮度
brightness = 0.299 * R + 0.587 * G + 0.114 * B
return brightness, B, G, R
# 计算图像平均亮度调节图像
# 将目标图像的平均亮度调整为源图像的平均亮度
def adjust_brightness_from_src_to_dst(src, dst):
brightness1, B1, G1, R1 = calculate_average_brightness(src)
brightness2, B2, G2, R2 = calculate_average_brightness(dst)
brightness_difference = int(round(brightness1 - brightness2))
print('原图的平均亮度', brightness1)
print('目标的平均亮度', brightness2)
print('原图与目标的亮度差距', brightness_difference)
# 按照平均显示亮度进行增强
dstf = dst + brightness_difference
# 按照三色通道平均值进行增强
# dstf = dst.copy().astype(np.float32)
# dstf[..., 0] = dst[..., 0] + (B1 - B2)
# dstf[..., 1] = dst[..., 1] + (G1 - G2)
# dstf[..., 2] = dst[..., 2] + (R1 - R2)
# 对结果进行限制,放置越界,必须转成uint8,不然结果默认为float32,会出错
dstf = np.clip(dstf, 0, 255)
dstf = np.uint8(dstf)
return dstf
按照平均显示亮度进行增强的效果图
按照三色通道平均值进行增强的效果图
推荐文章
https://blog.csdn.net/feilong_csdn/article/details/82755816
https://www.cnblogs.com/skiwnchiwns/p/10130833.html