数字图像处理: 亮度调整

您所在的位置:网站首页 图像调节 数字图像处理: 亮度调整

数字图像处理: 亮度调整

2024-07-07 12:09| 来源: 网络整理| 查看: 265

 

 图像亮度、对比度、饱和度和锐化之间并不是彼此独立的,改变其中一个特征可能会同时引起图像其他特征的变化,至于变化的程度取决于图像本身的特性,先建立一个概念,在后面的会在详述

 

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) a0)和减小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

 



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3