opencv图像增强十四:opencv两种白平衡介绍及实现

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录


前言

在摄影与影像领域,白平衡是一个至关重要的概念。它直接影响着画面的色彩表现,关系到作品的美感和观感。白平衡的调整,可以让画面呈现出不同的氛围和风格,为摄影师的创作带来无限可能。本文将为您详细介绍两种常见的白平衡模式及其实现方法,帮助您更好地掌握这一技术。

一、白平衡介绍

白平衡的英文为White Balance,其基本概念是"不管在任何光源下,都能将白色物体还原为白色",对在特定光源下拍摄时出现的偏色现象,通过加强对应的补色来进行补偿。相机的白平衡设定可以校准色温的偏差 。

人眼能够在不同色温的光源下自动调整对色彩的感知,使得我们看到的白色始终保持为白色。然而,相机的传感器不具备这种自动调整能力,因此在不同的光照条件下,如果没有进行适当的白平衡调整,传感器记录的图像可能会出现色偏。例如,在钨丝灯下拍摄时,如果没有正确的白平衡设置,图像可能会偏黄;在阴天拍摄时,图像可能会偏蓝。

正确的白平衡对于摄影和视频制作至关重要,它能够确保色彩的真实还原,提升作品的视觉效果。如果白平衡设置不当,不仅会影响单个图像或视频片段的色彩表现,还可能增加后期制作的复杂性和工作量。

在opencv中集成了两种可以直接实现白平衡的方法,分别为灰度世界法(GrayworldWB),完美反射法(SimpleWB)下面依次进行介绍。

二、灰度世界法

灰度世界法(Gray World Algorithm)是一种基于色彩恒常性理论的自动白平衡算法。色彩恒常性是指人类视觉系统在不同光照条件下能够识别出物体真实颜色的能力。灰度世界法假设在理想情况下,场景中的平均亮度值应该呈现为中性灰,即R、G、B三个颜色通道的平均值相等。基于这个假设,该算法通过调整每个颜色通道的增益来达到白平衡的目的。

以下是灰度世界法的步骤:

  1. 计算平均亮度:

    对于输入的彩色图像,首先计算每个颜色通道(R、G、B)的平均亮度值。具体操作是对每个通道的所有像素值进行求和,然后除以像素总数。

    其中,LR、L G、L B分别是红色、绿色、蓝色通道的平均亮度值,Ri 、Gi 、B i 是各个像素点的颜色值,N 是像素总数。

  2. 计算增益: 假设平均亮度值应该相等,即

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

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

    其中,Rnew、Gnew 、Bnew是调整后的像素值。

  4. 输出结果: 经过上述调整后,图像的白平衡应该得到了改善,使得图像在不同光照条件下都能保持色彩的自然和一致性。

灰度世界法是一种简单有效的白平衡算法,但它也有局限性。由于它假设所有场景的平均亮度都是中性灰,这在某些情况下并不成立,比如场景中存在大量单一颜色时,算法可能会失效。此外,该算法不适用于具有极端颜色偏差的场景。尽管如此,灰度世界法因其简单性和在许多情况下仍能提供满意结果的特点,在图像处理领域中仍然被广泛使用。在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 方法来对图像进行白平衡处理。

使用:

python 复制代码
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)是一种自动白平衡算法,它基于的假设是图像中至少有一个颜色通道在某个区域达到了最大反射率,即该区域的颜色接近于完美反射体的颜色。这种方法通常认为图像中最亮的像素代表了完美反射体的颜色,并以此为基准来调整其他颜色通道,从而实现白平衡。

基本步骤:

  1. 确定完美反射区域: 找到图像中最亮的像素点,这些点被认为是接近完美反射的颜色。
  2. 计算通道增益:
    基于找到的完美反射区域,计算每个颜色通道(R、G、B)的增益。通常,这涉及到将每个通道的最亮像素值(理论上应该是255,代表最大亮度)作为参考点,然后计算其他通道需要调整的增益比例。
  3. 应用通道增益: 使用计算出的增益值调整图像中所有像素的每个颜色通道,使得图像的整体色彩看起来更自然和平衡。
  4. 输出结果: 经过上述调整后,图像的白平衡应该得到了改善,特别是在光照不均匀或存在色偏的情况下。

完美反射法的优点是简单且在某些情况下效果显著,特别是当场景中确实存在接近完美反射的物体时。在opencv中提供了api:cv2.createSimpleWB,其使用和灰度世界法近似

使用案例:

python 复制代码
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)

效果:

相关推荐
Elastic 中国社区官方博客5 分钟前
使用 Elastic AI Assistant for Search 和 Azure OpenAI 实现从 0 到 60 的转变
大数据·人工智能·elasticsearch·microsoft·搜索引擎·ai·azure
江_小_白1 小时前
自动驾驶之激光雷达
人工智能·机器学习·自动驾驶
yusaisai大鱼2 小时前
TensorFlow如何调用GPU?
人工智能·tensorflow
湫ccc4 小时前
《Python基础》之字符串格式化输出
开发语言·python
mqiqe4 小时前
Python MySQL通过Binlog 获取变更记录 恢复数据
开发语言·python·mysql
AttackingLin4 小时前
2024强网杯--babyheap house of apple2解法
linux·开发语言·python
哭泣的眼泪4084 小时前
解析粗糙度仪在工业制造及材料科学和建筑工程领域的重要性
python·算法·django·virtualenv·pygame
珠海新立电子科技有限公司5 小时前
FPC柔性线路板与智能生活的融合
人工智能·生活·制造
湫ccc5 小时前
《Python基础》之基本数据类型
开发语言·python
IT古董5 小时前
【机器学习】机器学习中用到的高等数学知识-8. 图论 (Graph Theory)
人工智能·机器学习·图论