OpenCV-Python快速入门系列07TrackBar/滚动条操作-参数传递与调整亮度与对比度

在上一节的学习中,我们掌握了如何通过调整 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()

默认状态

图片[1]-OpenCV-Python快速入门系列07TrackBar/滚动条操作-参数传递与调整亮度与对比度-天煜博客

调节亮度和对比度效果

图片[2]-OpenCV-Python快速入门系列07TrackBar/滚动条操作-参数传递与调整亮度与对比度-天煜博客
图片[3]-OpenCV-Python快速入门系列07TrackBar/滚动条操作-参数传递与调整亮度与对比度-天煜博客
图片[4]-OpenCV-Python快速入门系列07TrackBar/滚动条操作-参数传递与调整亮度与对比度-天煜博客
图片[5]-OpenCV-Python快速入门系列07TrackBar/滚动条操作-参数传递与调整亮度与对比度-天煜博客

看视频后感悟

这一节看视频没太明白,不清楚相关的函数功能,也不清楚参数为什么要这么写。

将代码扔给了AI解释一下:

这段代码的目的是通过两个 TrackBar(滚动条) 实现对图像亮度和对比度的同时调节。不过,其中存在一些逻辑问题需要修正和优化,以下是逐行分析以及优化后的实现。

问题分析

  1. 亮度和对比度的计算逻辑问题
    • cv.addWeighted() 的参数不合理:python复制代码result = cv.addWeighted(image, contrast, blank, 0.5, light)
      • 第二个参数为原图的权重,应与对比度相关。
      • 第四个参数 0.5 为空白图像的权重,但此处的 blank 并未与 light 直接关联,逻辑有误。
      • 第五个参数 light 表示亮度偏移,应单独控制。
  2. 无关变量 blank
    • blank 初始化为与 image 相同大小的全零矩阵,但实际上未被正确使用,且无必要。
  3. 对比度范围映射问题
    • 滑动条范围为 [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(滚动条) 实现对图像亮度和对比度的同时调节。不过,其中存在一些逻辑问题需要修正和优化,以下是逐行分析以及优化后的实现。

问题分析

  1. 亮度和对比度的计算逻辑问题
    • cv.addWeighted() 的参数不合理:python复制代码result = cv.addWeighted(image, contrast, blank, 0.5, light)
      • 第二个参数为原图的权重,应与对比度相关。
      • 第四个参数 0.5 为空白图像的权重,但此处的 blank 并未与 light 直接关联,逻辑有误。
      • 第五个参数 light 表示亮度偏移,应单独控制。
  2. 无关变量 blank
    • blank 初始化为与 image 相同大小的全零矩阵,但实际上未被正确使用,且无必要。
  3. 对比度范围映射问题
    • 滑动条范围为 [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()

优化点详解

  1. 亮度调整
    • 通过 TrackBar 的值减去初始值 50,将亮度范围从 [0, 100] 映射到 [-50, 50]
    • 使用 cv.convertScaleAbs()beta 参数直接调整亮度。
  2. 对比度调整
    • 对比度的滑动条范围 [100, 300],映射为 [1.0, 3.0],通过 /100.0 实现。
    • 使用 cv.convertScaleAbs()alpha 参数调整对比度,支持增强和减弱。
  3. 清除冗余变量
    • 删除不必要的 blank 变量,减少复杂度。
  4. 参数输出
    • 打印实时的亮度和对比度值,便于观察调节效果。

© 版权声明
THE END
喜欢就支持一下吧
点赞12 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容