在上一节的学习中,我们掌握了如何通过调整 TrackBar(滚动条) 实现图片亮度的动态调节。本节将在此基础上进一步拓展,通过增加一个滚动条,实现对图片 亮度 和 对比度 的同时调节。这样不仅可以增强图像的可视化效果,还能为更多实际应用提供灵活的图像处理手段。
def adjust_contrast_demo():
image = cv.imread('images/test.png')
if image is None:
print("Error: Image not found or failed to load.")
return
cv.namedWindow("input", cv.WINDOW_AUTOSIZE)
cv.createTrackbar("lightness", "input", 0, 100, nothing)
cv.createTrackbar("contrast", "input", 100, 200, nothing)
cv.imshow("input", image)
blank = np.zeros_like(image)
while True:
light = cv.getTrackbarPos("lightness", "input")
contrast = cv.getTrackbarPos("contrast", "input") /100
result = cv.addWeighted(image, contrast,blank, 0.5, light)
print("lightness: ", light, "contrast: ", contrast)
cv.imshow('result', result)
c = cv.waitKey(1)
if c == 27:
break
cv.destroyAllWindows()
默认状态
调节亮度和对比度效果
看视频后感悟
这一节看视频没太明白,不清楚相关的函数功能,也不清楚参数为什么要这么写。
将代码扔给了AI解释一下:
这段代码的目的是通过两个 TrackBar(滚动条) 实现对图像亮度和对比度的同时调节。不过,其中存在一些逻辑问题需要修正和优化,以下是逐行分析以及优化后的实现。
问题分析
- 亮度和对比度的计算逻辑问题
cv.addWeighted()
的参数不合理:python复制代码result = cv.addWeighted(image, contrast, blank, 0.5, light)
- 第二个参数为原图的权重,应与对比度相关。
- 第四个参数
0.5
为空白图像的权重,但此处的blank
并未与light
直接关联,逻辑有误。- 第五个参数
light
表示亮度偏移,应单独控制。- 无关变量
blank
blank
初始化为与image
相同大小的全零矩阵,但实际上未被正确使用,且无必要。- 对比度范围映射问题
- 滑动条范围为
[100, 200]
,映射为[1.0, 2.0]
,较为生硬,可以优化为更灵活的映射(如负对比度调整)。
优化后的代码
import cv2 as cv
import numpy as np
def nothing(x):
pass
def adjust_contrast_demo():
# 读取图像
image = cv.imread('images/test.png')
if image is None:
print("Error: Image not found or failed to load.")
return
# 创建窗口和 TrackBar
cv.namedWindow("Adjustments", cv.WINDOW_AUTOSIZE)
cv.createTrackbar("Lightness", "Adjustments", 50, 100, nothing) # 亮度:初始50,范围0-100
cv.createTrackbar("Contrast", "Adjustments", 100, 300, nothing) # 对比度:初始100,范围0-300
while True:
# 获取滑动条的值
lightness = cv.getTrackbarPos("Lightness", "Adjustments") - 50 # 亮度范围[-50, 50]
contrast = cv.getTrackbarPos("Contrast", "Adjustments") / 100.0 # 对比度范围[1.0, 3.0]
# 调整亮度和对比度
result = cv.convertScaleAbs(image, alpha=contrast, beta=lightness)
# 打印参数
print(f"Lightness: {lightness}, Contrast: {contrast:.2f}")
# 显示结果
cv.imshow("Adjustments", result)
# 按 ESC 退出
if cv.waitKey(1) == 27:
break
cv.destroyAllWindows()
# 调用函数
adjust_contrast_demo()
这段代码的目的是通过两个 TrackBar(滚动条) 实现对图像亮度和对比度的同时调节。不过,其中存在一些逻辑问题需要修正和优化,以下是逐行分析以及优化后的实现。
问题分析
- 亮度和对比度的计算逻辑问题
cv.addWeighted()
的参数不合理:python复制代码result = cv.addWeighted(image, contrast, blank, 0.5, light)
- 第二个参数为原图的权重,应与对比度相关。
- 第四个参数
0.5
为空白图像的权重,但此处的blank
并未与light
直接关联,逻辑有误。 - 第五个参数
light
表示亮度偏移,应单独控制。
- 无关变量
blank
blank
初始化为与image
相同大小的全零矩阵,但实际上未被正确使用,且无必要。
- 对比度范围映射问题
- 滑动条范围为
[100, 200]
,映射为[1.0, 2.0]
,较为生硬,可以优化为更灵活的映射(如负对比度调整)。
- 滑动条范围为
优化后的代码
import cv2 as cv
import numpy as np
def nothing(x):
pass
def adjust_contrast_demo():
# 读取图像
image = cv.imread('images/test.png')
if image is None:
print("Error: Image not found or failed to load.")
return
# 创建窗口和 TrackBar
cv.namedWindow("Adjustments", cv.WINDOW_AUTOSIZE)
cv.createTrackbar("Lightness", "Adjustments", 50, 100, nothing) # 亮度:初始50,范围0-100
cv.createTrackbar("Contrast", "Adjustments", 100, 300, nothing) # 对比度:初始100,范围0-300
while True:
# 获取滑动条的值
lightness = cv.getTrackbarPos("Lightness", "Adjustments") - 50 # 亮度范围[-50, 50]
contrast = cv.getTrackbarPos("Contrast", "Adjustments") / 100.0 # 对比度范围[1.0, 3.0]
# 调整亮度和对比度
result = cv.convertScaleAbs(image, alpha=contrast, beta=lightness)
# 打印参数
print(f"Lightness: {lightness}, Contrast: {contrast:.2f}")
# 显示结果
cv.imshow("Adjustments", result)
# 按 ESC 退出
if cv.waitKey(1) == 27:
break
cv.destroyAllWindows()
# 调用函数
adjust_contrast_demo()
优化点详解
- 亮度调整
- 通过
TrackBar
的值减去初始值 50,将亮度范围从[0, 100]
映射到[-50, 50]
。 - 使用
cv.convertScaleAbs()
的beta
参数直接调整亮度。
- 通过
- 对比度调整
- 对比度的滑动条范围
[100, 300]
,映射为[1.0, 3.0]
,通过/100.0
实现。 - 使用
cv.convertScaleAbs()
的alpha
参数调整对比度,支持增强和减弱。
- 对比度的滑动条范围
- 清除冗余变量
- 删除不必要的
blank
变量,减少复杂度。
- 删除不必要的
- 参数输出
- 打印实时的亮度和对比度值,便于观察调节效果。
© 版权声明
转载请注明出处,并标明原文链接。
本网站尊重知识产权,如有侵权,请及时联系我们删除。
本站所有原创内容仅用于学习和交流目的,未经作者和本站授权不得进行商业使用或盈利行为。
本网站尊重知识产权,如有侵权,请及时联系我们删除。
本站所有原创内容仅用于学习和交流目的,未经作者和本站授权不得进行商业使用或盈利行为。
THE END
暂无评论内容