作者:翟天保Steven
版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处

实现原理

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

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

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

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

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开播了,大家支持下王心凌姐姐吧~

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

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

OpenCV-白平衡(灰度世界算法)相关推荐

  1. opencv 白平衡之灰度世界算法

    简述 OpenCV对图像进行处理时,有时图像RGB受光照影响比较严重,转换到HSV等空间也解决不了时,可以用白平衡算法进行修正,使其发黄.发蓝.发红的照片更加趋于自然光下的图像. 白平衡算法有很多种, ...

  2. OpenCV每日函数 白平衡相关算法

    一.概述 OpenCV中其他照片处理算法模块提供了三种白平衡算法,基于WhiteBalancer类, 原图 1.灰度世界算法 该算法基于灰色世界假设来缩放像素值,该假设指出所有通道的平均值应产生灰色图 ...

  3. 白平衡之灰度世界算法

    一.算法背景   白平衡是图像处理比较常见的一个概念,在采集图像的过程中,相机的感光元件或者镜头会对原始色彩造成影响,而白平衡技术通常可以用来校正这种光线和镜头对颜色影响.所以现在先记录一个白平衡算法 ...

  4. OpenCV使用 GrabCut 算法进行交互式前景提取

    OpenCV使用 GrabCut 算法进行交互式前景提取 1. 效果图 2. 源码 参考 这篇博客将介绍如何使用Python,OpenCV中的GrabCut 算法来提取图像中的前景,并为此创建一个交互 ...

  5. pythonopencv算法_python opencv之分水岭算法示例

    本文介绍了python opencv之分水岭算法示例,分享给大家,具体如下: 目标 使用分水岭算法对基于标记的图像进行分割 使用函数cv2.watershed() 原理: 灰度图像可以被看成拓扑平面, ...

  6. opencv实现分水岭算法

    opencv实现分水岭算法 // 分水岭算法原理 // IplImage* marker_mask = 0; IplImage* markers = 0; //IplImage* img0 = 0, ...

  7. OpenCV图像分割Grabcut算法

    前言 1.OpenCV图像分割Grabcut算法主要功能是分割和抠图,就是把框着的目标抠出来,比如要分割出一个证件照的人的图像,只需要在目标外面画一个框,把目标框住,它就可以完成良好的分割. 2.算法 ...

  8. OpenCV将现有算法移植到G-API的实例(附完整代码)

    OpenCV将现有算法移植到G-API的实例 OpenCV将现有算法移植到G-API的实例 OpenCV将现有算法移植到G-API的实例 #include "opencv2/opencv_m ...

  9. OpenCV密集光流算法的实例(附完整代码)

    OpenCV密集光流算法的实例 OpenCV密集光流算法的实例 OpenCV密集光流算法的实例 #include <iostream> #include <iomanip> # ...

  10. OpenCV使用基本算法检测颜色检查器

    OpenCV使用基本算法检测颜色检查器 使用基本算法检测颜色检查器 简介 建造Building 示例的源代码 解释 设置标题和名称空间 创建检测器对象 运行检测器 获取ColorCheckers列表 ...

最新文章

  1. ubuntu安装ssh,安装失败
  2. python 语言-Python语言的一些基本常用语句
  3. Java面向对象之USB接口实例
  4. opencv setTo()
  5. python建站部署_SpringBoot入门建站全系列(三十二)接入xxl-job分布式任务调度平台...
  6. 柱状图中最大的矩形—leetcode84
  7. .NET开发者必备的工具箱
  8. (DFS)n皇后问题
  9. 【短文本相似度】传统方法BM25解决短文本相似度问题
  10. 为什么nodejs是单进程的_Nodejs探秘:深入理解单线程实现高并发原理
  11. RocketMQ 一行代码造成大量消息发送失败
  12. max30102c语言程序,STM32驱动MAX30102源码
  13. Python之灵魂三问,分享学习路上的神器集合!
  14. informix的数据类型列表
  15. python下载博文中微博图床图片
  16. java怎么连发子弹_HTML-坦克大战-完成子弹连发功能(三)
  17. linux常用的基本指令
  18. Dell T7920工作站 拆装硬盘
  19. 编译-POCO C++支持iOS平台的静态库
  20. 做好质量分析,从5个方向入手就够了,快收藏

热门文章

  1. THE、QS等四大世界大学排名对比 计算机专业究竟哪家强?
  2. PS合成下雨天蹲在路灯下的天使男人清(15)
  3. 拉线式位移传感器的原理
  4. 搜狗输入法 rpm包_你以为搜狗输入法只能用来打字吗?
  5. 电脑桌面计算机图标在哪,电脑计算机图标在哪
  6. python问题 Traceback (most recent call last)
  7. docker-the input device is not a TTY. If you are using mintty, try prefixing the command with ‘winp
  8. 电脑网络经常掉线怎么办
  9. 三次bezier曲线 MATLAB,Matlab 画二次及三次Bezier曲线,8控制点的B样条曲线
  10. 个人网站可以申请https-SSL证书吗