简述

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

白平衡算法有很多种,其中常用的有灰度世界法和镜面法。

色彩是人眼的对可视光的一种感知。对于不透明的物体而言,人眼所形成的色彩感知取决于光照光谱分布、物体表面光的反射性和人眼(或者其它光信号接收器)的光敏特性。在光信号接收器的光敏特性保持不变,物体也保持不变的情况下,人眼对该物体的色彩感知就取决于光照的光谱分布。由于人眼视觉的色彩恒常性,当环境光发生变化的时候,我们人类的视觉系统具有某种调节能力,可以让我们的大脑还原物体表面的不变特征,但是对于像照相机这样的光信号接收器,它只能如实地记录所接收到的光信号,因此在不同光源下所得到的图像在我们人类看起来会有色彩的偏差,下图所展示就是由于光源的不同造成同一物体色差不同的例子。

为了能够让照相机等成像设备可以具有类似于人眼的视觉调节能力,在不同的光照情况下,使所获取的图像颜色保持一致,对所获得图像所做的处理就叫做白平衡。在专业的摄像领域,相机可以通过调节自身光敏器件对可见光中不同颜色单色光的敏感性来实现对图像的白平衡,以达到摄影师所想要的效果。对于已经获取的图像,如果因为光照原因出现色彩的偏差的话,我们有时候也寄希望于通过现有图像来得到图像获取时的光照信息,基于这些信息来对图像进行调整以获得在某种标准光源下的图像,于是就产生了很多白平衡的算法,其中灰度世界算法和镜面法是较为常用白平衡算法。

原理

Von Kries色适应理论。Von Kries提出,可用一个对角矩阵变换来描述两种光照条件下同一物体表面颜色之间的关系[1]。该理论认为,对于同一个观察者而言,假设在光源A下面,一个物体的RGB值为RGB1=[R1,G1,B1],如果在光源B下面同一个物体的RGB值为RGB2=[R2,G2,B2],那么RGB1与RGB2之间存在这如下转换关系。RGB2’=[kr,0,0;0,kg,0;0,0,kb]RGB1',其中kr、kg和kb分别为R、G、B三个通道的校正系数。我们接下来将要介绍的灰度世界算法和镜面法的理论都是建立在这一原理的基础上的,需要注意的是,这个理论在某些条件下是不适用的。

灰度世界法

该理论假设:对于一副有着丰富色彩的图片,图像上R、G、B三个通道的平均值应该等于一个被称为“灰色”的值K[2]。理论中最重要的一点就是“灰色”的定义和选择问题。有多种方法对理论中的“灰色”进行定义,在此不详细讨论这一点。至于“灰色”的选择,一种方法是将其定义为各通道最大值的一半,还可以将待处理图片三个通道均值的均值作为“灰色”值K。当确定了灰色值K之后,将待处理图片转换到经典光源下的各个校正系数分别为:kr=K/Rmean,kg=K/Gmean,kb=K/Bmean,其中Rmean,Gmean和Bmean分别为图像R、G、B通道的均值。

//图像白平衡
//该代码实现白平衡算法中的灰度世界法,能有效改善图像发红发蓝发绿的现象;#include <opencv2/opencv.hpp>
using namespace cv;int main()
{Mat g_srcImage,dstImage;vector<Mat> g_vChannels;g_srcImage = imread("1.jpg");imshow("原图",g_srcImage);//waitKey(0);//分离通道split(g_srcImage,g_vChannels);Mat imageBlueChannel = g_vChannels.at(0);Mat imageGreenChannel = g_vChannels.at(1);Mat imageRedChannel = g_vChannels.at(2);double imageBlueChannelAvg=0;double imageGreenChannelAvg=0;double imageRedChannelAvg=0;//求各通道的平均值imageBlueChannelAvg = mean(imageBlueChannel)[0];imageGreenChannelAvg = mean(imageGreenChannel)[0];imageRedChannelAvg = mean(imageRedChannel)[0];//计算标准灰度double K = (imageRedChannelAvg+imageGreenChannelAvg+imageRedChannelAvg)/3;//求出个通道所占增益double Kb = K/imageBlueChannelAvg;double Kg = K/imageGreenChannelAvg;double Kr = K/imageRedChannelAvg;//更新白平衡后的各通道BGR值addWeighted(imageBlueChannel,Kb,0,0,0,imageBlueChannel);addWeighted(imageGreenChannel,Kg,0,0,0,imageGreenChannel);addWeighted(imageRedChannel,Kr,0,0,0,imageRedChannel);merge(g_vChannels,dstImage);//图像各通道合并imshow("白平衡后图",dstImage);waitKey(0);return 0;
}

运行效果:

后续更新其他方法。。。。。

最后

参考链接:

https://www.cnblogs.com/ggYYa/p/5707259.html

https://www.cnblogs.com/AlgrithmsRookie/p/7161863.html

https://max.book118.com/html/2017/0518/107516762.shtm

opencv 白平衡之灰度世界算法相关推荐

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

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

  2. Matlab实现图像白平衡(灰度世界法、全反射算法)

    参考:https://www.cnblogs.com/molakejin/p/5766132.html 白平衡 白平衡的英文为White Balance,其基本概念是"不管在任何光源下,都能 ...

  3. opencv 白平衡

    这个可以参考: https://blog.csdn.net/weixin_43379058/article/details/88606961 OpenCV 图像白平衡算法(相机自动白平衡) 彩色相机内 ...

  4. JavaCV - 白平衡(完美反射算法)

    一.效果图 如图所示,左侧为原图,右侧是白平衡处理后的图片 二.实现原理 白平衡的意义在于,对在特定光源下拍摄时出现的偏色现象,通过加强对应的补色来进行补偿,使白色物体能还原为白色. 完美反射算法是白 ...

  5. 目标跟踪之粒子滤波---Opencv实现粒子滤波算法

    目标跟踪学习笔记_2(particle filter初探1) 目标跟踪学习笔记_3(particle filter初探2) 前面2篇博客已经提到当粒子数增加时会内存报错,后面又仔细查了下程序,是代码方 ...

  6. 【CV春季划】170分钟学习OpenCV与经典图像处理算法基础

    本次给大家带来的是有三AI-CV春季划组OpenCV与经典图像处理算法的直播回放,如果你还不知道有三AI-CV春季划是什么,可以看下面的视频和图文. 点击边框调出视频工具条 [CV春季划]言有三手把手 ...

  7. OpenCV watershed分水岭分割算法的实例(附完整代码)

    OpenCV watershed分水岭分割算法的实例 OpenCV watershed分水岭分割算法的实例 OpenCV watershed分水岭分割算法的实例 #include <opencv ...

  8. OpenCV距离变换和分水岭算法的图像分割

    OpenCV距离变换和分水岭算法的图像分割 距离变换和分水岭算法的图像分割 目标 代码 说明/结果 距离变换和分水岭算法的图像分割 目标 在本教程中,您将学习如何: 使用OpenCV函数cv :: f ...

  9. Python+OpenCV:基于分水岭算法的图像分割(Image Segmentation with Watershed Algorithm)

    Python+OpenCV:基于分水岭算法的图像分割(Image Segmentation with Watershed Algorithm) ############################ ...

最新文章

  1. flask小项目打开教学
  2. 做好准备迎接崭新的BCH了吗?
  3. 判断是否Ajax请求
  4. javamail command not implemented
  5. AI:一个20年程序猿的学习资料大全—区块链/大数据/数据集/云计算/前沿大会资料——只有你不想要的,没有你找不到的
  6. Scala代码案例:统计三个班成绩情况,每个班有5名同学,求出各个班的平均分和所有班级的平均分
  7. 带标题和导航点的ViewPager
  8. Django ORM
  9. Android 亮屏速度分析
  10. 牛客13584 日历中的数字
  11. 相机标定(3) opencv中solvePnPRansac()和solvePnP()计算外参数
  12. 文件路径存入mysql_网站的文件的上传,并将相对路径保存到数据库的代码实现。...
  13. 湘教云实名服务平台怎样认证_【i通知】小贝喊你来校园一卡通微信支付实名认证!...
  14. linux下编辑文件实验,Linux实验_修改
  15. 六、Linux企业级YUM软件管理
  16. windows自带黑体_微软黑体下载-微软黑体官方下载[字体下载]-华军软件园
  17. 2021西工大计算机专硕,计算机专硕2021考研形势分析,考研小白戳
  18. xposed框架安装使用步骤
  19. 二维码图像编码原理(字符编码:ASCII、UTF-8)
  20. 外媒评出世界十大地质奇迹

热门文章

  1. 【LINUX】一、文件安全和权限
  2. vue2和vue3响应式原理
  3. 备案域名服务器DNS修改,未备案域名也可以用高防CDN加速
  4. 【Alpha阶段】第四次scrum meeting
  5. html5判断出生日期,出生时间看五行,出生日期查五行属性?
  6. 手机短信验证码开发流程
  7. 区块数据存储文件说明
  8. Java8新特性(一)—————Lambda表达式
  9. 五、Linux系统中的权限管理
  10. Centos7安装docker并更改阿里云下载镜像地址(附带windows10安装docker教程)