【图像亮度变换】——图像预处理(OpenCV)

目录

21 图像亮度变换

21.1 亮度变换

21.2 线性变换

21.2 直接像素值修改


21 图像亮度变换

21.1 亮度变换

对比度调整:图像暗处像素强度变低,图像亮处像素强度变高,从而拉大中间某个区域范围的显示精度。

亮度调整:图像像素强度整体变高或者变低

【图像亮度变换】——图像预处理(OpenCV)_第1张图片

上图中,(a)把亮度调高,就是图片中的所有像素值加上了一个固定值;(b)把亮度调低,就是图片中的所有像素值减去了一个固定值;(c)增大像素对比度(白的地方更白,黑的地方更黑);(d)减小像素对比度(整幅图都趋于一个颜色);

OpenCV调整图像对比度和亮度时,公式为:

g(i,j)=\alpha f(i,j)+\beta

但是不能浅显的讲alpha是控制对比度,beta是控制亮度的。

对比度:需要通过\alpha、\beta一起控制。

亮度:通过\beta控制。

21.2 线性变换

使用 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()

输出:


 

21.2 直接像素值修改

如果只需要增加或减少固定的亮度值,可以直接遍历图像像素并对每个像素值进行加减操作。

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()

输出:

你可能感兴趣的:(图像预处理,opencv,人工智能,计算机视觉)