opencv图像增强十四:opencv两种白平衡介绍及实现
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
- 前言
- 一、白平衡介绍
- 二、灰度世界法
- 三、完美反射法
前言
在摄影与影像领域,白平衡是一个至关重要的概念。它直接影响着画面的色彩表现,关系到作品的美感和观感。白平衡的调整,可以让画面呈现出不同的氛围和风格,为摄影师的创作带来无限可能。本文将为您详细介绍两种常见的白平衡模式及其实现方法,帮助您更好地掌握这一技术。
一、白平衡介绍
白平衡的英文为White Balance,其基本概念是“不管在任何光源下,都能将白色物体还原为白色”,对在特定光源下拍摄时出现的偏色现象,通过加强对应的补色来进行补偿。相机的白平衡设定可以校准色温的偏差 。
人眼能够在不同色温的光源下自动调整对色彩的感知,使得我们看到的白色始终保持为白色。然而,相机的传感器不具备这种自动调整能力,因此在不同的光照条件下,如果没有进行适当的白平衡调整,传感器记录的图像可能会出现色偏。例如,在钨丝灯下拍摄时,如果没有正确的白平衡设置,图像可能会偏黄;在阴天拍摄时,图像可能会偏蓝。
正确的白平衡对于摄影和视频制作至关重要,它能够确保色彩的真实还原,提升作品的视觉效果。如果白平衡设置不当,不仅会影响单个图像或视频片段的色彩表现,还可能增加后期制作的复杂性和工作量。
在opencv中集成了两种可以直接实现白平衡的方法,分别为灰度世界法(GrayworldWB),完美反射法(SimpleWB)下面依次进行介绍。
二、灰度世界法
灰度世界法(Gray World Algorithm)是一种基于色彩恒常性理论的自动白平衡算法。色彩恒常性是指人类视觉系统在不同光照条件下能够识别出物体真实颜色的能力。灰度世界法假设在理想情况下,场景中的平均亮度值应该呈现为中性灰,即R、G、B三个颜色通道的平均值相等。基于这个假设,该算法通过调整每个颜色通道的增益来达到白平衡的目的。
以下是灰度世界法的步骤:
-
计算平均亮度:
对于输入的彩色图像,首先计算每个颜色通道(R、G、B)的平均亮度值。具体操作是对每个通道的所有像素值进行求和,然后除以像素总数。

其中,LR、L G、L B分别是红色、绿色、蓝色通道的平均亮度值,Ri 、Gi 、B i 是各个像素点的颜色值,N 是像素总数。
-
计算增益: 假设平均亮度值应该相等,即

根据这个假设,计算每个通道的增益 GR、GG 、GB,使得调整后的通道亮度相等。

-
调整颜色通道: 使用计算出的增益值调整每个颜色通道的像素值。

其中,Rnew、Gnew 、Bnew是调整后的像素值。 -
输出结果: 经过上述调整后,图像的白平衡应该得到了改善,使得图像在不同光照条件下都能保持色彩的自然和一致性。
灰度世界法是一种简单有效的白平衡算法,但它也有局限性。由于它假设所有场景的平均亮度都是中性灰,这在某些情况下并不成立,比如场景中存在大量单一颜色时,算法可能会失效。此外,该算法不适用于具有极端颜色偏差的场景。尽管如此,灰度世界法因其简单性和在许多情况下仍能提供满意结果的特点,在图像处理领域中仍然被广泛使用。在opencv中提供了灰度世界法的apicv2.xphoto.createGrayworldWB()
cv2.xphoto.createGrayworldWB() 是 OpenCV 的 xphoto 模块中提供的一个用于实现灰度世界白平衡算法的函数。这个算法基于灰度世界假设,即认为在理想情况下,图像中所有颜色通道的平均值应该相等,从而产生一个灰色的平均图像。
功能:该函数实现了灰度世界白平衡算法,用于调整图像的颜色,使得在平均意义上,图像的颜色通道呈现为中性灰。
类和方法:在 OpenCV 中,GrayworldWB 是实现这一算法的类。它继承自 cv::xphoto::WhiteBalancer 类。主要的公共成员函数包括:
balanceWhite(src, dst):这是应用白平衡到输入图像的方法,其中 src 是输入图像,dst 是输出图像。
getSaturationThreshold() 和 setSaturationThreshold(val):这些方法用于获取和设置像素被包含在灰度世界假设中的最大饱和度阈值。
使用方法:在使用 cv2.xphoto.createGrayworldWB() 时,首先需要创建一个 GrayworldWB 对象,然后调用其 balanceWhite 方法来对图像进行白平衡处理。
使用:
import cv2
path = r"F:\cv_traditional\1727071242313.png"
img = cv2.imread(path)
sw = cv2.xphoto.createGrayworldWB()
sw.balanceWhite(img, img)
cv2.imshow("img",img)
cv2.waitKey(0)
效果:

三、完美反射法
完美反射法(Perfect Reflector Method)是一种自动白平衡算法,它基于的假设是图像中至少有一个颜色通道在某个区域达到了最大反射率,即该区域的颜色接近于完美反射体的颜色。这种方法通常认为图像中最亮的像素代表了完美反射体的颜色,并以此为基准来调整其他颜色通道,从而实现白平衡。
基本步骤:
- 确定完美反射区域: 找到图像中最亮的像素点,这些点被认为是接近完美反射的颜色。
- 计算通道增益:
基于找到的完美反射区域,计算每个颜色通道(R、G、B)的增益。通常,这涉及到将每个通道的最亮像素值(理论上应该是255,代表最大亮度)作为参考点,然后计算其他通道需要调整的增益比例。 - 应用通道增益: 使用计算出的增益值调整图像中所有像素的每个颜色通道,使得图像的整体色彩看起来更自然和平衡。
- 输出结果: 经过上述调整后,图像的白平衡应该得到了改善,特别是在光照不均匀或存在色偏的情况下。
完美反射法的优点是简单且在某些情况下效果显著,特别是当场景中确实存在接近完美反射的物体时。在opencv中提供了api:cv2.createSimpleWB,其使用和灰度世界法近似
使用案例:
import cv2
path = r"F:\cv_traditional\1727071242313.png"
img = cv2.imread(path)
cv2.imshow("ori",img)
sw = cv2.xphoto.createSimpleWB()
sw.balanceWhite(img, img)
cv2.imshow("img",img)
cv2.waitKey(0)
效果:

相关文章:
opencv图像增强十四:opencv两种白平衡介绍及实现
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、白平衡介绍二、灰度世界法三、完美反射法 前言 在摄影与影像领域,白平衡是一个至关重要的概念。它直接影响着画面的色彩表现,关系到…...
Linux标准IO(四)-格式化I/O输入
C 库函数提供了 3 个格式化输入函数,包括:scanf()、fscanf()、sscanf(),其函数定义如下所示: #include <stdio.h> int scanf(const char *format, ...); int fscanf(FILE *stream, const char *format, ...); int sscanf(c…...
分布式安装LNMP
目录 搭建LNMP架构 安装mysql 1.上传mysql软件包,关闭防火墙和核心防护 2.安装环境依赖包,桌面安装可能有自带的数据库除 3.配置软件模块 4.编译及安装 5.创建mysql用户 6.修改mysql 配置文件 7.更改mysql安装目录和配置文件的属主属组 8.设置…...
TFTP协议
目录 一、TFTP协议概述 1.1 TFTP协议简介 1.2 TFTP协议特点 二、TFTP协议原理 2.1 TFTP协议工作流程 2.2 TFTP协议数据包格式 三、TFTP协议应用场景 3.1 网络设备配置文件传输 3.2 虚拟机镜像文件传输 3.3 IoT设备固件升级 四、TFTP协议优化方法 4.1 增加超时重传机…...
FPGA随记-二进制转格雷码
反射二进制码(RBC),也称为反射二进制(RB)或格雷码(Gray code),得名于Frank Gray,是二进制数制的一种排列方式,使得连续两个值之间仅有一个比特(二…...
Android常用C++特性之std::unique_lock
声明:本文内容生成自ChatGPT,目的是为方便大家了解学习作为引用到作者的其他文章中。 std::unique_lock 是 C 标准库中的一种灵活的锁管理类,提供了比 std::lock_guard 更多的功能和灵活性。它可以控制对互斥锁(std::mutex&#x…...
网络与信息安全工程师(工信部教育与考试中心)
在当今数字化时代,大量的敏感信息与业务流程在网络上传输和处理,使得网络与信息安全成为保障企业运营、政务管理以及金融交易等关键领域不可忽视的一环。 因此,对网络安全专家的需求日益增长。 例如,金融机构、大型电信运营商以…...
uni-app+vue3开发微信小程序使用本地图片渲染不出来报错[渲染层网络层错误]Failed to load local image resource
我把图片放在assets里面页面通过相对路径引入。结果一直报错。 最后我把图片放在static文件夹下面。然后修改路径指向static就可以了 或者是我们必须先import 这个图片然后在使用 import banner1 from ../../assets/images/banner/banner1.png; <image :src"banner…...
Leetcode 93-复原 IP 地址
有效 IP 地址 正好由四个整数(每个整数位于 0 到 255 之间组成,且不能含有前导 0),整数之间用 ‘.’ 分隔。 例如:“0.1.2.201” 和 “192.168.1.1” 是 有效 IP 地址,但是 “0.011.255.245”、“192.168.…...
unity 中向指定的动画片段添加动画事件,并播放动画,同时获取动画片段的时长。
示例一 using UnityEngine;using System;public static class AnimationUtils{/// <summary>/// 向指定的动画片段添加动画事件,并播放动画,同时获取动画片段的时长。/// </summary>/// <param name"_animator">需要添加动画…...
JavaEE:探索网络世界的魅力——玩转UDP编程
文章目录 UDPUDP的特点UDP协议端格式校验和前置知识校验和具体是如何工作的? UDP UDP的特点 UDP传输的过程类似于寄信. 无连接: 知道对端的IP和端口号就直接进行传输,不需要建立连接.不可靠: 没有确认机制,没有重传机制,如果因为网络故障导致该段无法到达对方,UDP协议也不会…...
生成式人工智能:企业数字化转型的全新引擎,深度解析The Open Group 2024生态系统架构·可持续发展年度大会
生成式人工智能:企业数字化转型的全新引擎,深度解析The Open Group 2024生态系统架构可持续发展年度大会 随着人工智能技术的飞速发展,生成式人工智能(Generative AI)正以惊人的速度渗透到各行各业,成为企…...
阿里云k8s如何创建可用的api token
阿里云的 Kubernetes 配置文件(如您所提供的 YAML 格式文件)通常不会直接包含用于连接 Kubernetes 集群的令牌。而是包含了客户端证书和私钥数据,这些是用于通过证书验证而不是令牌验证的方式来与 Kubernetes API 服务器进行安全交互的。 1.…...
leetcode刷题day30|贪心算法Part04重叠区间问题(452. 用最少数量的箭引爆气球、435. 无重叠区间、763.划分字母区间)
前言:今天的三道题目都是重叠区间的问题。 452. 用最少数量的箭引爆气球 思路:局部最优:当气球出现重叠,一起射,所用弓箭最少; 全局最优:把所有气球射爆所用弓箭最少。 按照起始位置排序&…...
MQTT客户端实战:从连接到通信。详细说明MQTT客户端和MQTT代理进行通信
EMQX安装 EMQX服务器安装 安装文档,见链接不另外写 https://docs.emqx.com/zh/emqx/latest/deploy/install-ubuntu.html 启动 EMQX 启动为一个 systemd 服务: sudo systemctl start emqx在windows安装客户端 在线 MQTT WebSocket 客户端工具&…...
【go/方法记录】cgo静态库编译以及使用dlv定位cgo崩溃问题
目录 说在前面文件树静态库编译cgo使用崩溃模拟使用dlv定位崩溃参考 说在前面 测试环境:WSL2go版本:go version go1.23.1 linux/amd64gcc版本:gcc (Ubuntu 11.4.0-1ubuntu1~22.04) 11.4.0cmake版本:3.22.1 文件树 ├── buffer …...
(笔记自用)位运算总结+LeetCode例题:颠倒二进制位+位1的个数
一.位运算总结: 在解题之前理解一下为什么需要位运算?它的本质是什么? 力扣上不少位运算相关的题,并且很多题也会用到位运算的技巧。这又是为什么? 位运算的由来 在计算机里面,任何数据最终都是用数字来表示的&…...
024.PL-SQL进阶—游标
课 程 推 荐我 的 个 人 主 页:👉👉 失心疯的个人主页 👈👈入 门 教 程 推 荐 :👉👉 Python零基础入门教程合集 👈👈虚 拟 环 境 搭 建 :…...
从零开始使用树莓派debian系统使用opencv4.10.0进行人脸识别(保姆级教程)
一、总体架构 本文主要是使用树莓派自带的csi摄像头,搭配上opencv4.10.0进行物体的识别。本文使用的环境是python3.7.3,环境不一样有可能安装的opencv的过程也会很不一样,但是python的环境我们可以自己自行安装。 二、树莓派系统的安装 本文…...
golang qq邮件发送验证码
验证码的使用场景 注册/登录:使用验证码可以有效减少垃圾账号注册和恶意登录;短信接口保护:高效减少防止短信接口被刷情况;提交/投票:有效减少恶意刷单、恶意提交、恶意投票等情况;密码找回:用…...
别再手动改daemon.json了!1Panel面板里一键配置Docker国内镜像源(附最新可用源列表)
1Panel面板实战:3分钟搞定Docker国内镜像加速配置 刚部署完1Panel的新用户总会遇到一个经典问题——Docker拉取镜像慢得像蜗牛爬。传统解决方案是手动编辑daemon.json文件,但如今有了更优雅的选择。作为一款现代化服务器管理面板,1Panel将复杂…...
BG3ModManager模组管理工具完全指南
BG3ModManager模组管理工具完全指南 【免费下载链接】BG3ModManager A mod manager for Baldurs Gate 3. 项目地址: https://gitcode.com/gh_mirrors/bg/BG3ModManager 一、初识BG3ModManager BG3ModManager作为《博德之门3》的专用模组管理工具,为玩家提供…...
【Oracle篇】基于OGG 21c全程图形化实现9TB数据从Oracle 11g到19c的不停机迁移(上):微服务架构详解与微服务部署,及同步问题总览(第一篇,总共三篇)
💫《博主主页》: 🔎 CSDN主页: 奈斯DB 🔎 IF Club社区主页: 奈斯、 🔎 微信公众号: 奈斯DB 🔥《擅长领域》: 🗃️ 数据库…...
Mermaid Live Editor:代码驱动图表设计的终极解决方案
Mermaid Live Editor:代码驱动图表设计的终极解决方案 【免费下载链接】mermaid-live-editor Edit, preview and share mermaid charts/diagrams. New implementation of the live editor. 项目地址: https://gitcode.com/GitHub_Trending/me/mermaid-live-editor…...
OFA模型在零售行业的视觉问答应用案例
OFA模型在零售行业的视觉问答应用案例 1. 引言 走进任何一家现代零售商店,你都会看到成千上万的商品整齐地陈列在货架上。但对于店员来说,要快速准确地回答"这个品牌的洗发水有没有无硅油版本?"或者"这款饼干是否含有坚果成…...
Nomic-Embed-Text-V2-MoE在AIGC内容审核中的应用:识别生成文本的违规风险
Nomic-Embed-Text-V2-MoE在AIGC内容审核中的应用:识别生成文本的违规风险 最近和几个做AIGC应用的朋友聊天,大家普遍提到一个头疼的问题:用户用模型生成的文本,时不时会冒出一些不合规的内容,比如涉及不当言论、暴力或…...
DanKoe 视频笔记:创作者指南:如何摆脱新手地狱
在本教程中,我们将学习创作者如何突破最初的停滞期,即所谓的“新手地狱”。我们将探讨导致这一困境的核心原因,并提供一系列具体、可操作的策略,帮助你建立权威、创作吸引人的内容、有效建立网络,并最终构建可持续的个…...
掌握MEAN.JS模块化开发:5个核心模块实战指南与最佳实践
掌握MEAN.JS模块化开发:5个核心模块实战指南与最佳实践 【免费下载链接】mean MEAN.JS - Full-Stack JavaScript Using MongoDB, Express, AngularJS, and Node.js - 项目地址: https://gitcode.com/gh_mirrors/mea/mean MEAN.JS作为基于MongoDB、Express、…...
用Python+Matplotlib动手验证:标准DH和改进DH建模同一机械臂,结果真的相同吗?
PythonMatplotlib实战:标准DH与改进DH建模机械臂的等价性验证 机械臂运动学建模是机器人学中的基础课题,而Denavit-Hartenberg(DH)参数法则是其中最经典的建模方法之一。标准DH(sDH)与改进DH(mD…...
基于MATLAB的buck-boost升降压斩波电路系统设计 本设计包括设计报告,仿真工程
基于MATLAB的buck-boost升降压斩波电路系统设计 本设计包括设计报告,仿真工程。 Buck-Boost斩波电路是一种特殊的DC-DC转换器,它具备独特的功能,能够灵活地处理输入电压与输出电压之间的关系。 这种电路不仅能够将输入电压降至低于输出电压的…...
