OpenCV-白平衡(灰度世界算法)

简介: OpenCV-白平衡(灰度世界算法)

实现原理

      白平衡的意义在于,对在特定光源下拍摄时出现的偏色现象,通过加强对应的补色来进行补偿,使白色物体能还原为白色。


      灰度世界算法是白平衡各种算法中最基本的一种。它假设图像世界具备丰富色彩,红蓝绿三通道的灰度值在平均后趋近一致,该值作为“灰色”;若各通道均值偏离“灰色”,则将其进行补偿,使其回归“灰色”,进而实现白平衡的效果。


      通俗的讲,若图像中绿色较强,蓝色和红色较弱,则用了灰度世界算法后,绿色会适当减弱,蓝色和红色会适当加强,这样就使原本偏色严重的情况得到了缓解。


      灰度世界算法的实现流程如下:  


      1.计算图像RGB三通道各自的灰度平均值Raver、Gaver、Baver。


      2.计算“灰色”:Gray=(Raver+Gaver+Baver)/3。


      3.计算三通道的补偿系数,即灰色值除以单通道平均值。

功能函数代码

// 白平衡-灰度世界
cv::Mat WhiteBalcane_Gray(cv::Mat src)
{
  cv::Mat result = src.clone();
  if (src.channels() != 3)
  {
    cout << "The number of image channels is not 3." << endl;
    return result;
  }
  // 通道分离
  vector<cv::Mat> Channel;
  cv::split(src, Channel);
  // 计算通道灰度值均值
  double Bm = cv::mean(Channel[0])[0];
  double Gm = cv::mean(Channel[1])[0];
  double Rm = cv::mean(Channel[2])[0];
  double Km = (Bm + Gm + Rm) / 3;
  // 通道灰度值调整
  Channel[0] *= Km / Bm;
  Channel[1] *= Km / Gm;
  Channel[2] *= Km / Rm;
  // 合并通道
  cv::merge(Channel, result);
  return result;
}

C++测试代码

#include <iostream>
#include <opencv.hpp>
using namespace std;
// 白平衡-灰度世界
cv::Mat WhiteBalcane_Gray(cv::Mat src)
{
  cv::Mat result = src.clone();
  if (src.channels() != 3)
  {
    cout << "The number of image channels is not 3." << endl;
    return result;
  }
  // 通道分离
  vector<cv::Mat> Channel;
  cv::split(src, Channel);
  // 计算通道灰度值均值
  double Bm = cv::mean(Channel[0])[0];
  double Gm = cv::mean(Channel[1])[0];
  double Rm = cv::mean(Channel[2])[0];
  double Km = (Bm + Gm + Rm) / 3;
  // 通道灰度值调整
  Channel[0] *= Km / Bm;
  Channel[1] *= Km / Gm;
  Channel[2] *= Km / Rm;
  // 合并通道
  cv::merge(Channel, result);
  return result;
}
int main()
{
  // 载入原图
  cv::Mat src = cv::imread("test.jpg");
  // 白平衡-灰度世界
  cv::Mat result = WhiteBalcane_Gray(src);
  // 显示
  cv::imshow("src", src);
  cv::imshow("result", result);
  cv::waitKey(0);
  return 0;
}

测试效果

图1 原图

图2 白平衡后图像

      如图1所示,是傍晚的一张图像,众所周知,傍晚的色温是较低的,此时采用高于傍晚色温的色温值拍照,就会得到一张暖色系的图片,偏黄;对其进行白平衡,使图片颜色回归真实的环境色温,就得到如图2的效果。

图3 单色原图

图4 白平衡后图像

       如图3所示,是一张色彩相对一致的图像,整体呈粉色系,此时应用灰度世界算法,图像会整体调整,使得颜色趋近于灰色;感兴趣的可以去看看该颜色的色条,三通道的数值在180-220左右,没有过大的差异,平衡后三数值接近于190,因而呈灰色。


       接下来做个有趣的测试,将原本粉色的墙纸设为较纯的绿色。

图5 调色后的图像

图6 白平衡后效果

       如图5所示,因为图像中存在色调相冲的两个部分,在白平衡后,原本的绿色会调整为深绿色,图像绿色分量降低,其他分量升高,这就导致原本偏粉色的人像区更粉了,这也是该算法的弊端。做该测试也是为了帮助大家更全面深层地理解算法应用场景。


      最近乘风破浪3开播了,大家支持下王心凌姐姐吧~


      如果函数有什么可以改进完善的地方,非常欢迎大家指出,一同进步何乐而不为呢~


      如果文章帮助到你了,可以点个赞让我知道,我会很快乐~加油!

相关文章
|
1月前
|
计算机视觉 Python
Opencv学习笔记(二):如何将整个文件下的彩色图片全部转换为灰度图
使用OpenCV库将一个文件夹内的所有彩色图片批量转换为灰度图,并提供了相应的Python代码示例。
31 0
Opencv学习笔记(二):如何将整个文件下的彩色图片全部转换为灰度图
|
1月前
|
算法 计算机视觉 Python
圆形检测算法-基于颜色和形状(opencv)
该代码实现了一个圆检测算法,用于识别视频中的红色、白色和蓝色圆形。通过将图像从RGB转换为HSV颜色空间,并设置对应颜色的阈值范围,提取出目标颜色的区域。接着对这些区域进行轮廓提取和面积筛选,使用霍夫圆变换检测圆形,并在原图上绘制检测结果。
64 0
|
3月前
|
算法 定位技术 vr&ar
一文了解PnP算法,python opencv中的cv2.solvePnP()的使用,以及使用cv2.sovlePnP()方法标定相机和2D激光雷达
一文了解PnP算法,python opencv中的cv2.solvePnP()的使用,以及使用cv2.sovlePnP()方法标定相机和2D激光雷达
497 0
一文了解PnP算法,python opencv中的cv2.solvePnP()的使用,以及使用cv2.sovlePnP()方法标定相机和2D激光雷达
|
5月前
|
机器学习/深度学习 算法 计算机视觉
基于opencv的SVM算法的车牌识别系统设计与实现
基于opencv的SVM算法的车牌识别系统设计与实现
148 3
基于opencv的SVM算法的车牌识别系统设计与实现
|
5月前
|
移动开发 算法 计算机视觉
技术笔记:openCV特征点识别与findHomography算法过滤
技术笔记:openCV特征点识别与findHomography算法过滤
97 0
|
5月前
|
机器学习/深度学习 编译器 算法框架/工具
OpenCV算法库
numba是一个用于编译Python数组和数值计算函数的编译器,这个编译器能够大幅提高直接使用Python编写的函数的运算速度。
|
5月前
|
算法 计算机视觉
图像处理之特殊灰度算法技巧
图像处理之特殊灰度算法技巧
52 0
|
6月前
|
算法 计算机视觉
【OpenCV】- 分水岭算法
【OpenCV】- 分水岭算法
|
24天前
|
算法 安全 数据安全/隐私保护
基于game-based算法的动态频谱访问matlab仿真
本算法展示了在认知无线电网络中,通过游戏理论优化动态频谱访问,提高频谱利用率和物理层安全性。程序运行效果包括负载因子、传输功率、信噪比对用户效用和保密率的影响分析。软件版本:Matlab 2022a。完整代码包含详细中文注释和操作视频。
|
9天前
|
算法 数据挖掘 数据安全/隐私保护
基于FCM模糊聚类算法的图像分割matlab仿真
本项目展示了基于模糊C均值(FCM)算法的图像分割技术。算法运行效果良好,无水印。使用MATLAB 2022a开发,提供完整代码及中文注释,附带操作步骤视频。FCM算法通过隶属度矩阵和聚类中心矩阵实现图像分割,适用于灰度和彩色图像,广泛应用于医学影像、遥感图像等领域。