图像亮度调整的简单实现

目录

[1. 什么是图像亮度调整?](#1. 什么是图像亮度调整?)

[2. 使用 cv2.addWeighted() 调整亮度](#2. 使用 cv2.addWeighted() 调整亮度)

代码示例

参数解释

效果

[3. 直接修改像素值调整亮度](#3. 直接修改像素值调整亮度)

代码示例

参数解释

效果

[4. 使用滑动条动态调整亮度](#4. 使用滑动条动态调整亮度)

代码示例

效果

[5. 总结](#5. 总结)


在图像处理中,亮度调整是一个非常常见的操作。无论是为了让图像看起来更清晰,还是为了适应不同的显示设备,调整图像的亮度都是非常有用的。今天,我们就来聊聊如何使用Python和OpenCV库来调整图像的亮度。

1. 什么是图像亮度调整?

图像亮度调整,顾名思义,就是改变图像中像素的明暗程度。简单来说,就是让图像整体看起来更亮或更暗。

  • 亮度增加:图像中的每个像素值都会增加一个固定值,让图像看起来更亮。

  • 亮度降低:图像中的每个像素值都会减少一个固定值,让图像看起来更暗。

2. 使用 cv2.addWeighted() 调整亮度

OpenCV 提供了一个非常方便的函数 cv2.addWeighted(),可以用来调整图像的亮度。这个函数的核心思想是通过加权平均的方式,对图像的像素值进行调整。

代码示例

python 复制代码
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(),我们还可以直接对图像的像素值进行操作,来调整亮度。

代码示例

python 复制代码
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的滑动条功能,动态调整亮度。

代码示例

python 复制代码
import cv2
import numpy as np

window_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. 总结

通过这篇文章,我们学习了两种调整图像亮度的方法:

  1. 使用 cv2.addWeighted() 函数,通过加权平均的方式调整亮度。
  • 优点

    • 实现简单,代码简洁。

    • 可以通过调整权重参数灵活控制亮度变化。

    • 不容易出现像素值溢出的问题,因为权重和偏移量的计算方式较为安全。

  • 缺点

    • 需要额外的计算开销,因为涉及加权平均操作。

    • 对于复杂的亮度调整需求,灵活性稍差。

  1. 直接对像素值进行操作,通过加减一个固定值来调整亮度。
  • 优点

    • 直观且易于理解,直接对像素值进行加减操作。

    • 可以通过 np.clip 函数轻松限制像素值范围,避免溢出。

    • 在某些情况下可能更高效,尤其是当需要对像素值进行复杂操作时。

  • 缺点

    • 如果不使用 np.clip,很容易导致像素值溢出,从而出现图像失真。

    • 对于大规模图像处理,直接操作像素值可能会导致性能问题。

这两种方法各有优缺点,可以根据具体需求选择合适的方法。

相关推荐
小鸡吃米…24 分钟前
机器学习 - K - 中心聚类
人工智能·机器学习·聚类
好奇龙猫1 小时前
【AI学习-comfyUI学习-第三十节-第三十一节-FLUX-SD放大工作流+FLUX图生图工作流-各个部分学习】
人工智能·学习
沈浩(种子思维作者)1 小时前
真的能精准医疗吗?癌症能提前发现吗?
人工智能·python·网络安全·健康医疗·量子计算
minhuan1 小时前
大模型应用:大模型越大越好?模型参数量与效果的边际效益分析.51
人工智能·大模型参数评估·边际效益分析·大模型参数选择
Cherry的跨界思维1 小时前
28、AI测试环境搭建与全栈工具实战:从本地到云平台的完整指南
java·人工智能·vue3·ai测试·ai全栈·测试全栈·ai测试全栈
MM_MS1 小时前
Halcon变量控制类型、数据类型转换、字符串格式化、元组操作
开发语言·人工智能·深度学习·算法·目标检测·计算机视觉·视觉检测
ASF1231415sd2 小时前
【基于YOLOv10n-CSP-PTB的大豆花朵检测与识别系统详解】
人工智能·yolo·目标跟踪
水如烟2 小时前
孤能子视角:“意识“的阶段性回顾,“感质“假说
人工智能
Carl_奕然2 小时前
【数据挖掘】数据挖掘必会技能之:A/B测试
人工智能·python·数据挖掘·数据分析
旅途中的宽~2 小时前
《European Radiology》:2024血管瘤分割—基于MRI T1序列的分割算法
人工智能·计算机视觉·mri·sci一区top·血管瘤·t1