图像亮度调整的简单实现
目录
1. 什么是图像亮度调整?
2. 使用 cv2.addWeighted() 调整亮度
代码示例
参数解释
效果
3. 直接修改像素值调整亮度
代码示例
参数解释
效果
4. 使用滑动条动态调整亮度
代码示例
效果
5. 总结
在图像处理中,亮度调整是一个非常常见的操作。无论是为了让图像看起来更清晰,还是为了适应不同的显示设备,调整图像的亮度都是非常有用的。今天,我们就来聊聊如何使用Python和OpenCV库来调整图像的亮度。
1. 什么是图像亮度调整?
图像亮度调整,顾名思义,就是改变图像中像素的明暗程度。简单来说,就是让图像整体看起来更亮或更暗。
-
亮度增加:图像中的每个像素值都会增加一个固定值,让图像看起来更亮。
-
亮度降低:图像中的每个像素值都会减少一个固定值,让图像看起来更暗。
2. 使用 cv2.addWeighted()
调整亮度
OpenCV 提供了一个非常方便的函数 cv2.addWeighted()
,可以用来调整图像的亮度。这个函数的核心思想是通过加权平均的方式,对图像的像素值进行调整。
代码示例
import cv2
import numpy as np# 加载图像
img = cv2.imread('./1.jpg')# 设置亮度增益,例如设置为1.5倍亮度
alpha = 1.5# 提升图像亮度
brightened_img = cv2.addWeighted(img, alpha, np.zeros_like(img), 0, 0)# 显示和/或保存处理后的图像
cv2.imshow('Brightened Image', brightened_img)
cv2.waitKey(0)
cv2.destroyAllWindows()
参数解释
-
src1
:第一张输入图像,这里就是我们要调整亮度的图像。 -
alpha
:第一个输入图像的权重,用来控制亮度的增益。 -
src2
:第二张输入图像,这里我们用np.zeros_like(img)
来表示一个全黑的图像。 -
beta
:第二个输入图像的权重,这里设置为0,因为我们不需要用到第二张图像。 -
gamma
:一个标量,这里设置为0,因为我们只通过alpha
来调整亮度。
效果
通过调整 alpha
的值,我们可以很容易地改变图像的亮度。如果 alpha
大于1,图像会变亮;如果 alpha
小于1,图像会变暗。
3. 直接修改像素值调整亮度
除了使用 cv2.addWeighted()
,我们还可以直接对图像的像素值进行操作,来调整亮度。
代码示例
import cv2
import numpy as np# 读取图片
image_np = cv2.imread("./1.jpg")# 亮度变换是对图像的每个通道的每个像素进行统一的加某个值
# np.clip是一个截取函数,用于截取数组中小于或者大于某值的部分,并使得被截取部分等于固定值。
# np.uint8是将值转换为0-255的整数
brightness_conversion_img = np.uint8(np.clip(image_np + 50, 0, 255))# 显示原始图像和调整亮度后的图像
cv2.imshow("Original Image", image_np)
cv2.imshow("Brightness Adjusted Image", brightness_conversion_img)
cv2.waitKey(0)
cv2.destroyAllWindows()
参数解释
-
image_np + 50
:这里我们将每个像素值增加50,让图像变亮。如果想让图像变暗,可以减去一个值。 -
np.clip(image_np + 50, 0, 255)
:这个函数的作用是防止像素值超出0到255的范围。如果像素值超过255,会被截断为255;如果小于0,会被截断为0。 -
np.uint8
:将像素值转换为0到255的整数,确保图像可以正常显示。
效果
通过直接修改像素值,我们可以非常灵活地调整图像的亮度。这种方法的优点是简单直观,缺点是可能会导致像素值溢出,需要使用 np.clip
来进行限制。
4. 使用滑动条动态调整亮度
为了让调整亮度的过程更加直观,我们可以使用OpenCV的滑动条功能,动态调整亮度。
代码示例
import cv2
import numpy as npwindow_name = 'Trackbar Demo'
cv2.namedWindow(window_name)def on_trackbar_change(x):x = x / 255 * (255 - (-255)) - 255# 读取图片路径path = "./1.jpg"# 读取图片image_np = cv2.imread(path)# 亮度变换是对图像的每个通道的每个像素进行统一的加某个值brightness_conversion_img = np.uint8(np.clip(image_np + x, 0, 255))cv2.imshow("brightness_conversion_image", brightness_conversion_img)cv2.imshow("image_np", image_np)print(x)# 创建滑动条并设置参数
trackbar_name = 'Threshold'
max_value = 255
initial_value = 100
on_trackbar_change(initial_value)
cv2.createTrackbar(trackbar_name, window_name, initial_value, max_value, on_trackbar_change)
cv2.waitKey(0)
效果
通过滑动条,我们可以实时调整图像的亮度,观察不同亮度值下的图像效果。
5. 总结
通过这篇文章,我们学习了两种调整图像亮度的方法:
-
使用
cv2.addWeighted()
函数,通过加权平均的方式调整亮度。
-
优点:
-
实现简单,代码简洁。
-
可以通过调整权重参数灵活控制亮度变化。
-
不容易出现像素值溢出的问题,因为权重和偏移量的计算方式较为安全。
-
-
缺点:
-
需要额外的计算开销,因为涉及加权平均操作。
-
对于复杂的亮度调整需求,灵活性稍差。
-
-
直接对像素值进行操作,通过加减一个固定值来调整亮度。
-
优点:
-
直观且易于理解,直接对像素值进行加减操作。
-
可以通过
np.clip
函数轻松限制像素值范围,避免溢出。 -
在某些情况下可能更高效,尤其是当需要对像素值进行复杂操作时。
-
-
缺点:
-
如果不使用
np.clip
,很容易导致像素值溢出,从而出现图像失真。 -
对于大规模图像处理,直接操作像素值可能会导致性能问题。
-
这两种方法各有优缺点,可以根据具体需求选择合适的方法。