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

图像亮度调整

非线性方式

调整图像的方法有很多,最常用的方法就是对图像像素点的R、G、B三个分量同时进行增加(减少)某个值,达到调整亮度的目的。即改变图像的亮度,实际就是对像素点的各颜色分量值做一个平移。这种方法属于非线性的亮度调整,优点是代码简单、速度快,缺点是在调整亮度的同时,也损失了图像的色彩的纯度。

def adjust_brightness_avg(img, brightness=0.35):[avg_b, avg_g, avg_r] = np.array(cv2.mean(img))[:-1] / 3k = np.ones((img.shape))k[:, :, 0] *= avg_bk[:, :, 1] *= avg_gk[:, :, 2] *= avg_rimg = img + brightness * k# img = img + (1 + brightness) * imgimg[img < 0] = 255img[img > 255] = 255return img.astype(np.uint8)

HSL颜色空间方式(线性方式)

利用HSL颜色空间,通过只对其L(亮度)部分调整,可达到图像亮度的线性调整。但是RGB和HSL颜色空间的转换很繁琐,一般还需要浮点数的运算,不仅增加了代码的复杂度,更重要的是要逐点将RGB转换为HSL,然后确定新的L值,再将HSL转换为RGB,运行速度慢。要想提高图像线性调整的速度,应该将浮点运算变为整数运算,只提取HSL的L部分进行调整。优点是调整过的图像层次感很强,缺点是代码复杂,调整速度慢,而且当图像亮度增减量较大时有很大的失真。

# def adjust_brightness_rgb(img, brightness=0.35):
#     #[0-100]->[-255, 255]
#     # brightness = brightness * (255 - (-255)) + (-255)
#     brightness = brightness * 255
#     print(brightness)
#     brightness = -100
#     img = img * 1.0
#     r = img[:, :, 0]
#     g = img[:, :, 1]
#     b = img[:, :, 2]
#
#     #求出原始图像亮度分量
#     l = (img[:, :, 0] + img[:, :, 1] + img[:, :, 2]) / 3.0 + 0.001
#
#     mask_1 = l > 128.0
#     #利用原始图像的亮度分量结合R, G, B求出HSL空间的H, S;
#     rhs = (r * 128.0 - (l - 128.0) * 256.0) / (256.0 - l)
#     ghs = (g * 128.0 - (l - 128.0) * 256.0) / (256.0 - l)
#     bhs = (b * 128.0 - (l - 128.0) * 256.0) / (256.0 - l)
#
#     rhs = rhs * mask_1 + (r * 128.0 / l) * (1 - mask_1)
#     ghs = ghs * mask_1 + (g * 128.0 / l) * (1 - mask_1)
#     bhs = bhs * mask_1 + (b * 128.0 / l) * (1 - mask_1)
#     #然后求出新的亮度值 亮度的调整增量(-255,255)
#     l_new = l + brightness - 128.0
#     #再利用新的亮度值结合H,S,求出新的R,G,B分量
#     mask_2 = l_new > 0.0
#
#     r_new = rhs + (256.0 - rhs) * l_new / 128.0
#     g_new = ghs + (256.0 - ghs) * l_new / 128.0
#     b_new = bhs + (256.0 - bhs) * l_new / 128.0
#
#     r_new = r_new * mask_2 + (rhs + rhs * l_new / 128.0) * (1 - mask_2)
#     g_new = g_new * mask_2 + (ghs + ghs * l_new / 128.0) * (1 - mask_2)
#     b_new = b_new * mask_2 + (bhs + bhs * l_new / 128.0) * (1 - mask_2)
#
#     img_out = img * 1.0
#
#     img_out[:, :, 0] = r_new
#     img_out[:, :, 1] = g_new
#     img_out[:, :, 2] = b_new
#
#     img_out = img_out / 255.0
#
#     # 饱和处理
#     mask_3 = img_out < 0
#     mask_4 = img_out > 1
#
#     img_out = img_out * (1 - mask_3)
#     img_out = img_out * (1 - mask_4) + mask_4
#
#     return img_out
def adjust_brightness_hls(img, brightness):#img is [0-1]img = img.astype(np.float32) / 255.0# BGR2HLSimg_hls = cv2.cvtColor(img, cv2.COLOR_BGR2HLS)# adjust light(linear transform)img_hls[:, :, 1] = (1.0 + 0.35) * img_hls[:, :, 1]img_hls[:, :, 1][img_hls[:, :, 1] > 1] = 1# #adjust saturation# img_hls[:, :, 2] = (1.0 + 0.2) * img_hls[:, :, 2]# img_hls[:, :, 2][img_hls[:, :, 2] > 1] = 1# HLS2BGRimg_ls = cv2.cvtColor(img_hls, cv2.COLOR_HLS2BGR) * 255# img_ls = np.clip(img_ls, 0, 255).astype(np.uint8)return img_ls

alpha合成方式(线性方式)

在这里插入图片描述

def adjust_brightness_linear(img, brightness):#brightness arange [-1, 1]if brightness <= 0:img_out = img * (1 - brightness) + brightness * 255else:img_out = img * (1 + brightness) + brightness * 0return img_out

亮度和对比度同时调整

在这里插入图片描述
在这里插入图片描述

总结

在这里插入图片描述

import cv2
import sys
import numpy as np
import matplotlib.pyplot as plt"""基于RGB空间亮度调整算法:主要是对RGB空间进行亮度调整。计算出调整系数后,调整手段主要有两种:1) 基于当前RGB值大小进行调整,即R、G、B值越大,调整的越大,例如:当前像素点为(100,200,50),调整系数1.1,则调整后为(110,220,55);2) 不考虑RGB值大小的影响,即始终对各个点R、G、B值进行相同的调整,例如:当前像素点为(100,200,50),调整系数10/255,则调整后为(110,210,60)。
"""
def RGBAlgorithm(rgb_img, value=0.5, basedOnCurrentValue=True):img = rgb_img * 1.0img_out = img# 基于当前RGB进行调整(RGB*alpha)if basedOnCurrentValue:# 增量大于0,指数调整if value >= 0 :alpha = 1 - valuealpha = 1/alpha# 增量小于0,线性调整else:alpha = value + 1img_out[:, :, 0] = img[:, :, 0] * alphaimg_out[:, :, 1] = img[:, :, 1] * alphaimg_out[:, :, 2] = img[:, :, 2] * alpha# 独立于当前RGB进行调整(RGB+alpha*255)else:alpha = valueimg_out[:, :, 0] = img[:, :, 0] + 255.0 * alphaimg_out[:, :, 1] = img[:, :, 1] + 255.0 * alphaimg_out[:, :, 2] = img[:, :, 2] + 255.0 * alphaimg_out = img_out/255.0# RGB颜色上下限处理(小于0取0,大于1取1)mask_3 = img_out  < 0 mask_4 = img_out  > 1img_out = img_out * (1-mask_3)img_out = img_out * (1-mask_4) + mask_4return img_out"""基于HSV空间亮度调整算法:主要是对HSV空间的亮度V值进行调整。计算出调整系数后,调整手段主要有两种:1) 基于当前V值大小进行调整,即V值越大,调整的越大,例如:当前像素点V值为200,调整系数1.1,则调整后为220;2) 不考虑V值大小的影响,即始终对各个V值进行相同的调整,例如:当前像素点V值为200,调整系数10/255,则调整后为210。
"""
def HSVAlgorithm(rgb_img, value=0.5, basedOnCurrentValue=True):hsv_img = cv2.cvtColor(rgb_img, cv2.COLOR_RGB2HSV)img = hsv_img * 1.0img_out = img# 基于当前亮度进行调整(V*alpha)if basedOnCurrentValue:# 增量大于0,指数调整if value >= 0 :alpha = 1 - valuealpha = 1/alpha# 增量小于0,线性调整else:alpha = value + 1img_out[:, :, 2] = img[:, :, 2] * alphaelse :alpha = valueimg_out[:, :, 2] = img[:, :, 2] + 255.0 * alpha# HSV亮度上下限处理(小于0取0,大于1取1)img_out = img_out/255.0mask_1 = img_out  < 0 mask_2 = img_out  > 1img_out = img_out * (1-mask_1)img_out = img_out * (1-mask_2) + mask_2img_out = img_out * 255.0# HSV转RGBimg_out = np.round(img_out).astype(np.uint8)img_out = cv2.cvtColor(img_out, cv2.COLOR_HSV2RGB)img_out = img_out/255.0return img_outpath = './resource/fruit.bmp'
value = 0.3  # 范围-1至1
basedOnCurrentValue = True  # 0或者1# run : python Lightness.py (path) (value) (basedOnCurrentValue)
if __name__ == "__main__":len = len(sys.argv)if len >= 2 :path = sys.argv[1]if len >= 3 :value = float(sys.argv[2])if len >= 4 :basedOnCurrentValue = bool(int(sys.argv[3]))img = cv2.imread(path)img = cv2.cvtColor(img,cv2.COLOR_BGR2RGB)img_rgb = RGBAlgorithm(img, value, basedOnCurrentValue)img_hsv = HSVAlgorithm(img, value, basedOnCurrentValue)plt.figure("img_original")plt.imshow(img/255.0)plt.axis('off')plt.figure("img_light_rgb")plt.imshow(img_rgb)plt.axis('off')plt.figure("img_light_hsv")plt.imshow(img_hsv)plt.axis('off')plt.show()

参考资料
GDI+ 在Delphi程序的应用 – 调整图像亮度
GDI+ 在Delphi程序的应用 – ColorMatrix与图像亮度
Python实现PS图像明亮度调整效果示例(python调节图片亮度)
OpenCV图像处理|1.7 调整图像亮度与对比度
改进的图像线性亮度调整方法
OpenCV 基于RGB三原色的基本线性变换 改变图像颜色和亮度 对比度增强算法
图像处理——亮度调整算法(python语言)
图像处理——对比度调整算法(python语言)

相关文章:

图像亮度调整

非线性方式 调整图像的方法有很多&#xff0c;最常用的方法就是对图像像素点的R、G、B三个分量同时进行增加&#xff08;减少&#xff09;某个值&#xff0c;达到调整亮度的目的。即改变图像的亮度&#xff0c;实际就是对像素点的各颜色分量值做一个平移。这种方法属于非线性的…...

精简版SDL落地实践

一、前言一般安全都属于运维部下面&#xff0c;和上家公司的运维总监聊过几次一些日常安全工作能不能融入到DevOps中&#xff0c;没多久因为各种原因离职。18年入职5月一家第三方支付公司&#xff0c;前半年在各种检查中度过&#xff0c;监管形势严峻加上大领导对安全的重视(主…...

第一回:Matplotlib初相识

一、认识matplotlib Matplotlib是一个Python 2D绘图库&#xff0c;能够以多种硬拷贝格式和跨平台的交互式环境生成出版物质量的图形&#xff0c;用来绘制各种静态&#xff0c;动态&#xff0c;交互式的图表。 Matplotlib可用于Python脚本&#xff0c;Python和IPython Shell、…...

怎么找回电脑删除的图片

怎么找回电脑删除的图片?图片作为一种非常简单方便的文件&#xff0c;经常被用来辅助我们的日常工作和学习。但在我们整理电脑时&#xff0c;如果我们不小心手一抖就删除了一些重要的图片&#xff0c;遇到这种事我们要如何才能恢复呢? 众所周知&#xff0c;简单的删除并不会完…...

【Linux】进程状态与进程优先级

目录一.进程状态1.阻塞&#xff1a;2.挂起&#xff1a;具体情况3.具体操作系统状态变化R&#xff1a;运行状态(running)S&#xff1a;休眠状态(sleeping)D&#xff1a;磁盘休眠状态(Disk sleep)T&#xff1a;暂停状态(stopped)暂停进程继续进程t&#xff1a;追踪暂停状态(traci…...

Python+Qt生日提醒

PythonQt生日提醒如需安装运行环境或远程调试&#xff0c;见文章底部个人QQ名片&#xff0c;由专业技术人员远程协助&#xff01;前言这篇博客针对<<PythonQt生日提醒>>编写代码&#xff0c;代码整洁&#xff0c;规则&#xff0c;易读。 学习与应用推荐首选。文章目…...

第二章 编写MBR主引导记录

主引导记录&#xff08;MBR&#xff0c;Master Boot Record&#xff09;是采用MBR分区表的硬盘的第一个扇区&#xff0c;即C/H/S地址的0柱面0磁头1扇区&#xff0c;也叫做MBR扇区 计算机的启动过程 为什么程序要载入内存 CPU的硬件电路被设计成只能运行处于内存中的程序&…...

Android 9.0 仿ios的hotseat效果修改hotseat样式

1.概述 在9.0的系统rom定制化的产品中,在launcher3的定制化需求中,有很多功能需求点需要开发,在对一下ui的定制化的过程中,会参考ios的样式进行定制化,所以最近项目需求 要求仿ios的hotseat的样式来进行产品的定制,开发一款仿ios的hotseat,所以需要对hotseat进行分析,然…...

量化私募投资百亿头部量化私募企业在招岗位:AI算法工程师21/22/23届,校招/秋招/社招都看年base60-200万

量化私募投资百亿头部量化私募企业在招岗位:AI算法工程师21/22/23届&#xff0c;校招/秋招/社招都看年base60-200万bonuscut965制度应届需要985本硕博有3年以上相关ai算法经验可放宽学历"岗位职责&#xff1a;base 北京 上海 杭州 深圳1. 利用机器学习、深度学习和人工智能…...

百度西交大大数据菁英班目标检测竞赛

来源&#xff1a;投稿 作者&#xff1a;LSC 编辑&#xff1a;学姐 数据介绍 数据集共包括40000张训练图像和1000张测试图像&#xff0c;每张训练图像对应xml标注文件&#xff1a; 共包含3类&#xff1a;0:head, 1:helmet, 2:person。 提交格式要求&#xff0c;提交名为pred_r…...

Redisson实现分布式锁

目录Redisson简介Redisson实现分布式锁步骤引入依赖application.ymlRedisson 配置类Redisson分布式锁实现Redisson简介 Redis 是最流行的 NoSQL 数据库解决方案之一&#xff0c;而 Java 是世界上最流行&#xff08;注意&#xff0c;没有说“最好”&#xff09;的编程语言之一。…...

【HID基础知识】

蓝牙HID基础知识 一&#xff1a;定义 HID是Human Interface Device的缩写&#xff0c;由其名称可以了解HID设备是直接与人交互的设备&#xff0c;例如键盘、鼠标与游戏手柄等。 蓝牙HID 是属于蓝牙协议里面的一个profile, 不管在蓝牙2.0 2.1 3.0还是4.0&#xff0c;5.0的蓝牙中…...

工赋开发者社区 | 工业数字孪生:西门子工业网络与设备虚拟调试案例(TIA+MCD+SINETPLAN)

PART1案例背景及基本情况新生产系统的设计和实施通常是耗时且高成本的过程&#xff0c;完成设计、采购、安装后&#xff0c;在移交生产运行之前还需要一个阶段&#xff0c;即调试阶段。如果在开发过程中的任何地方出现了错误而没有被发现&#xff0c;那么每个开发阶段的错误成本…...

将闲置的Ipad作为Windows的副屏(Twomon SE)

目录一、前言二、方法第一步 安装软件第二步 使用步骤三、注意一、前言 在看网课的时候&#xff0c;总有种不得劲的感觉&#xff0c;来来回回的切换就很糟心~~无意间看见闲置的板砖&#xff08;Ipad&#xff09;&#xff0c;计上心来-- _ – 期间也尝试过免费的软件&#xff…...

浮点数在内存中的存储——“C”

各位CSDN的uu们你们好呀&#xff0c;今天&#xff0c;小雅兰的内容是浮点数在内存中的存储&#xff0c;昨天我们已经写过了整型在内存中的存储&#xff0c;那么&#xff0c;浮点数在内存中是怎样存储的呢&#xff1f;现在&#xff0c;就让我们进入浮点数在内存中的存储的世界吧…...

华为OD机试 C++ 实现 - 租车骑绿岛

最近更新的博客 华为OD机试 - 入栈出栈(C++) | 附带编码思路 【2023】 华为OD机试 - 箱子之形摆放(C++) | 附带编码思路 【2023】 华为OD机试 - 简易内存池 2(C++) | 附带编码思路 【2023】 华为OD机试 - 第 N 个排列(C++) | 附带编码思路 【2023】 华为OD机试 - 考古…...

Spring Cloud Nacos源码讲解(三)- Nacos客户端实例注册源码分析

Nacos客户端实例注册源码分析 实例客户端注册入口 流程图&#xff1a; 实际上我们在真实的生产环境中&#xff0c;我们要让某一个服务注册到Nacos中&#xff0c;我们首先要引入一个依赖&#xff1a; <dependency><groupId>com.alibaba.cloud</groupId><…...

位运算(C/C++)

1. 基础知识 程序中的所有数在计算机内存中都是以二进制的形式储存的。位运算就是直接对整数在内存中的二进制位进行操作。比如&#xff0c;and运算本来是一个逻辑运算符&#xff0c;但整数与整数之间也可以进行and运算。举个例子&#xff0c;6的二进制是110&#xff0c;11的二…...

哈希表题目:设计哈希映射

文章目录题目标题和出处难度题目描述要求示例数据范围前言解法一思路和算法代码复杂度分析解法二思路和算法代码复杂度分析题目 标题和出处 标题&#xff1a;设计哈希映射 出处&#xff1a;706. 设计哈希映射 难度 3 级 题目描述 要求 不使用任何内建的哈希表库设计一个…...

​力扣解法汇总1238. 循环码排列

目录链接&#xff1a; 力扣编程题-解法汇总_分享记录-CSDN博客 GitHub同步刷题项目&#xff1a; https://github.com/September26/java-algorithms 原题链接&#xff1a; 力扣 描述&#xff1a; 给你两个整数 n 和 start。你的任务是返回任意 (0,1,2,,...,2^n-1) 的排列 p&…...

Claude in Excel:原生集成的AI表格协作者

1. 项目概述&#xff1a;这不是插件&#xff0c;是Excel里长出来的AI同事“Claude in Excel”这个标题刚看到时&#xff0c;我下意识点开几个技术社区翻了一圈&#xff0c;发现多数人第一反应是&#xff1a;“又一个AI插件&#xff1f;”——其实完全不是。它根本没走传统Offic…...

sudo企业级应用【20260525】001篇

文章目录 一、总体设计思路 1️⃣ 设计原则 2️⃣ 日志策略(重点) 二、10 个真实生产场景(含 sudoers 配置) 🔹 Linux 系统管理(3 个) ✅ 场景 1:基础运维(用户 / 权限) ✅ 场景 2:磁盘与文件系统 ✅ 场景 3:网络与防火墙 🔹 云管理(2 个) ✅ 场景 4:云 CLI …...

三十岁想从零转行现实吗?带你分辨真正有前景的好工作

![](https://img-blog.csdnimg.cn/direct/b0bfa28b59f9478dae4e6feee6659cce.png)我是29岁那年&#xff0c;完成从转行裸辞副业的职业转型。 如果你把职业生涯看成是从现在开始30岁&#xff0c;到你退休那年&#xff0c;中间这么漫长的30年&#xff0c;那么30岁转行完全来得及…...

基于双T振荡器的正弦波LED调光电路设计与实践

1. 项目概述&#xff1a;用双T振荡器实现正弦波LED调光最近在捣鼓一些氛围灯项目&#xff0c;总感觉用单片机PWM做的呼吸灯效果有点“硬”&#xff0c;那种线性的明暗变化看久了难免审美疲劳。于是翻出以前模拟电路的老本行&#xff0c;琢磨着能不能用纯硬件的方式&#xff0c;…...

翻译 GDB 官方文档

翻译 GDB 官方文档项目地址官方文档地址下载源码包编译html运行翻译程序项目地址 https://github.com/shootercheng/gdb-translate.git 项目结构 $ tree -L 1 . ├── cmd ├── go.mod ├── input ├── internal ├── LICENSE ├── output ├── README.md ├─…...

Windows Cleaner深度解析:5大核心模块彻底解决系统空间不足问题

Windows Cleaner深度解析&#xff1a;5大核心模块彻底解决系统空间不足问题 【免费下载链接】WindowsCleaner Windows Cleaner——专治C盘爆红及各种不服&#xff01; 项目地址: https://gitcode.com/gh_mirrors/wi/WindowsCleaner Windows Cleaner是一款完全免费开源的…...

论文润色深度测评:GPT-5.5 + Gemini 3.1 Pro:教你学会1+1>2的论文润色方法

各位同仁好,我是七哥。一个在高校里从事人工智能相关领域研究,钻研用大模型AI实操的学术人。可以和七哥交流学术写作或Gemini、GPT、Claude等大模型学术实操相关问题,多多交流,相互成就,共同进步。 2026年的科研圈,AI工具的选择已经从有没有变成了强不强,七哥评测了GPT…...

通过用量看板分析团队大模型API消耗发现优化调用策略的机会

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 通过用量看板分析团队大模型API消耗发现优化调用策略的机会 作为团队的技术负责人&#xff0c;确保大模型API调用在满足业务需求的…...

Unity塔防底层架构:ScriptableObject驱动的数据契约设计

1. 这不是“又一个塔防模板”&#xff0c;而是塔防开发的底层操作系统我第一次在Asset Store点开Tower Defense Toolkit 4&#xff08;TDTK-4&#xff09;的预览图时&#xff0c;下意识划走了——界面太“干净”了&#xff0c;没有炫酷的粒子特效演示&#xff0c;没有满屏飞舞的…...

如何利用开源工具Unlock-Music解决音乐平台加密格式兼容问题

如何利用开源工具Unlock-Music解决音乐平台加密格式兼容问题 【免费下载链接】unlock-music 在浏览器中解锁加密的音乐文件。原仓库&#xff1a; 1. https://github.com/unlock-music/unlock-music &#xff1b;2. https://git.unlock-music.dev/um/web 项目地址: https://gi…...