当前位置: 首页 > news >正文

图像亮度调整的简单实现

目录

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

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

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

  • 优点

    • 实现简单,代码简洁。

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

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

  • 缺点

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

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

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

  • 优点

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

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

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

  • 缺点

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

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

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

http://www.lryc.cn/news/583874.html

相关文章:

  • 0基础学Python系列【31】 详细讲解Python中SQLAlchemy包的用法:从入门到精通
  • k8s:安装 Helm 私有仓库ChartMuseum、helm-push插件并上传、安装Zookeeper
  • zookeeper etcd区别
  • 在 Mac 上安装 Java 和 IntelliJ IDEA(完整笔记)
  • macOS 上安装 Miniconda + Conda-Forge
  • 算法练习5-原地移除数组中所有的元素
  • 龙迅#LT8619B适用于HDMI转LVDS/RGB,芯片支持视频图像处理,OSD功能.
  • MacOS 终端(Terminal)配置显示日期时间
  • 在Docker中运行macOS的超方便体验!
  • 基于深度学习的自动调制识别网络(持续更新)
  • 【PTA数据结构 | C语言版】顺序队列的3个操作
  • 在 Mac 上使用 Git 拉取项目:完整指南
  • 【macos用镜像站体验】Claude Code入门使用教程和常用命令
  • 029_构造器重载与默认构造器
  • 基于多模态感知的裂缝2D及3D检测方案
  • 【leetcode】2236. 判断根节点是否等于子节点之和
  • git fetch的使用
  • vue3 uniapp 使用ref更新值后子组件没有更新 ref reactive的区别?使用from from -item执行表单验证一直提示没有值
  • TCP 保活(KeepAlive)机制详解
  • STM32F103之ModBus\RS232\RS422\RS485
  • OpenCV 图像进阶处理:特征提取与车牌识别深度解析
  • 人工智能-基础篇-28-模型上下文协议--MCP请求示例(JSON格式,客户端代码,服务端代码等示例)
  • LabVIEW 波形图表横坐标显示当前日期
  • Eigen 几何模块深拆:Isometry3d vs Affine3d + 变换矩阵本质详解
  • GitHub信息收集
  • STM32单片机_3
  • GitHub敏感信息收集与防御指南
  • esp32在vscode中仿真调试
  • 学习笔记丨卷积神经网络(CNN):原理剖析与多领域Github应用
  • 魔法原子发布高动态双足人形机器人MagicBot Z1