目录
21 图像亮度变换
21.1 亮度变换
21.2 线性变换
21.2 直接像素值修改
对比度调整:图像暗处像素强度变低,图像亮处像素强度变高,从而拉大中间某个区域范围的显示精度。
亮度调整:图像像素强度整体变高或者变低。
上图中,(a)把亮度调高,就是图片中的所有像素值加上了一个固定值;(b)把亮度调低,就是图片中的所有像素值减去了一个固定值;(c)增大像素对比度(白的地方更白,黑的地方更黑);(d)减小像素对比度(整幅图都趋于一个颜色);
OpenCV调整图像对比度和亮度时,公式为:
但是不能浅显的讲alpha是控制对比度,beta是控制亮度的。
对比度:需要通过\alpha、\beta一起控制。
亮度:通过\beta控制。
使用 cv2.addWeighted()
函数,可以对图像的像素值进行加权平均,进而改变图像的整体亮度。亮度增益可以通过向每个像素值添加一个正值来实现。
API:
cv.addWeighted(src1,alpha,src2,beta,gamma)
参数说明:
src1
:第一张输入图像,它将被赋予权重 alpha
。
alpha
:第一个输入图像的权重。
src2
:第二张输入图像,它将被赋予权重 beta
。
beta
:第二个输入图像的权重。
gamma
:一个标量,将被添加到权重求和的结果上,可用于调整总体亮度。
计算公式为: dst = src1 * alpha + src2 * beta + gamma
案例:
import cv2 as cv
import numpy as np
# 读图
img = cv.imread("images/1.jpg")
# 使用cv2.addWeighted(src1,alpha,src2,beta,gamma)实现线性变换 g(i,j) = a*f(i,j) + b
"""
np.ones_like(array)
np.zeros_like()
np.full_like()
"""
dst = cv.addWeighted(img,0.8,np.zeros_like(img),0,10)
# 显示效果
cv.imshow("img",img)
cv.imshow("dst",dst)
cv.waitKey(0)
cv.destroyAllWindows()
输出:
练习:
import cv2 as cv
import numpy as np
# 读图
img = cv.imread('./my_images/he.jpg')
dst = cv.addWeighted(img,0.5,np.zeros_like(img),0,10)
cv.imshow("img",img)
cv.imshow("dst",dst)
cv.waitKey(0)
cv.destroyAllWindows()
输出:
如果只需要增加或减少固定的亮度值,可以直接遍历图像像素并对每个像素值进行加减操作。
API:
numpy.clip(a,a_min,a_max)
用于对数组中的元素进行限定,将超出指定范围的元素值截断至指定的最小值和最大值之间。
参数说明:
a
:输入数组。
a_min
:指定的最小值,数组中所有小于 a_min
的元素将被替换为 a_min
。
a_max
:指定的最大值,数组中所有大于 a_max
的元素将被替换为 a_max
。
案例:
# 直接修改像素值:给图像加上或者减去一个固定的像素
"""
原图:img
调整后的:dst = img+p (p>0 p<=0)
防止溢出:np.clip(dst,0,255) p由滑条控制,p相当于滑条里面的value 需要把滑条里面的值映射到-255~255
用一个滑条来控制p:cv2.createTrackbar(trackbar_name,window_name,initial_val,max_val,def) min_val=0
"""
import cv2 as cv
import numpy as np
# 给滑条创建窗口
window_name = "Trackbar"
cv.namedWindow(window_name)
# 写一个改变图像亮度的方法
def change(p):
# 读取图像
image = cv.imread("./images/1.jpg")
# 把滑条范围映射到[-255,255] 原本滑条值[0,255]
# print(p)
# p = p/255*(255-(-255))-255
p = 2*p-255
# print(p,type(p))
# 亮度变换
dst = np.uint8(np.clip(image.astype(int)+p,0,255))
# dst = np.uint8(np.clip(image+p,0,255))
cv.imshow("image",image)
cv.imshow("dst",dst)
# 创建滑条,设置里面的参数
max_val = 255 # 滑条最大值
Trackbar_name = "p_value" # 滑条名字
trackbar_value = 150 # 滑条初始值
change(trackbar_value)
cv.createTrackbar(Trackbar_name,window_name,trackbar_value,max_val,change)
cv.waitKey(0)
cv.destroyAllWindows()
输出:
练习:
import cv2 as cv
import numpy as np
# 为滑条创建窗口
window_name = "Trackbar"
cv.namedWindow(window_name)
# 写一个改变图像亮度的方法
def change(p):
# 读图
image = cv.imread("./my_images/he.jpg")
# 把滑条范围映射到[-255,255] 原本滑条值[0,255]
p = 2*p-255
# 亮度变换
dst = np.uint8(np.clip(image.astype(int)+p,0,255))
cv.imshow("image",image)
cv.imshow("dst",dst)
Trackbar_name = "p"
Trackbar_value = 100
max_val = 255
change(Trackbar_value)
cv.createTrackbar(Trackbar_name,window_name,Trackbar_value,max_val,change)
cv.waitKey(0)
cv.destroyAllWindows()
输出: