当前位置:   article > 正文

【图像处理】白平衡原理及实现_图像白平衡原理及实现

图像白平衡原理及实现

1.白平衡的出现

白平衡,顾名思义,即白色的平衡,由于人眼的适应性,在不同色温下,都能准确判断出白色,但是相机就差远了,在不同色温的光源下,图像会出现偏色,与人眼看到的颜色不一致,因此需要进行白平衡处理。在数码相机中,往往有ISP,这里面会做AWB(自动白平衡)处理。

下面先来说说白平衡与色温,然后介绍一种简单的白平衡算法,并且考虑其硬件化实现。

 

白平衡后的图像看起来更真实,这里说的真实,是指人眼实际看到的效果。

2.白平衡与色温

色温指某一温度下黑体所辐射的光谱,我们知道,blackbody吸收所有光谱,既不反射也不透过,因此,我们看到的黑体的颜色只与其表面温度相关。不同温度下黑体辐射出的光谱相对强度如下,可以看出,温度升高时,辐射的峰值波长在向短波方向移动,我们知道,温度越高,能量越大,而红橙黄绿蓝锭紫,波长依次减小,光子能量依次增大。因此,色温越高,光线越偏冷色,色温越低,光线越偏暖色。

有些数码相机在做白平衡时,可以手动选择光源,不同光源的色温如下:

自动白平衡(auto white balance,AWB),相对来说可能没有手动白平衡效果好,对于非摄影应用来说,由于无须人为设置,而广泛应用成像监控领域。

3.白平衡的方法介绍

白平衡的算法很多,有灰度世界法,完美反射法、动态阈值法,这里先介绍一种比较简单的,灰度世界法。

3.1灰度世界法

该方法以灰度世界假设为前提,认为对于一幅有大量色彩的场景,R、G、B分量的平均值趋于同一个灰度。算法大致可以分为以下三步:

  1. 计算三个通道的平均灰度
  2. 计算三个通道的增益系数
  3. 原始值乘上增益系数

matlab代码如下:

  1. %%白平衡与色温紧密相关,不同色温光源下图像会呈现不同程度的偏色
  2. %%由于人眼独特的适应性,在不同光照条件下观看物体时不会出现偏色,而就没这么先进了
  3. %%蓝色光色温高,红色光色温低
  4. clc;
  5. clear all;
  6. close all;
  7. tic;
  8. imgSrc = imread('E:\picture\03-work\02-imgProc\00-ISP\wb_sardmen-incorrect.jpg');
  9. imgDst = imgSrc;
  10. %%第一步,计算三个通道的平均灰度
  11. imgR = imgSrc(:,:,1);
  12. imgG = imgSrc(:,:,2);
  13. imgB = imgSrc(:,:,3);
  14. RAve = mean2(imgR);
  15. GAve = mean2(imgG);
  16. BAve = mean2(imgB);
  17. aveGray = (RAve + GAve + BAve) / 3;
  18. %%第二步,计算三个通道的增益系数
  19. RCoef = aveGray / RAve;
  20. GCoef = aveGray / GAve;
  21. BCoef = aveGray / BAve;
  22. %%第三步,使用增益系数来调整原始图像
  23. RCorrection = RCoef * imgR;
  24. GCorrection = GCoef * imgG;
  25. BCorrection = BCoef * imgB;
  26. imgDst(:,:,1) = RCorrection;
  27. imgDst(:,:,2) = GCorrection;
  28. imgDst(:,:,3) = BCorrection;
  29. figure,subplot(1,2,1),imshow(imgSrc),title('original image');
  30. subplot(1,2,2),imshow(imgDst),title('white balanced image');
  31. toc;

效果如下,该算法适用于有大量色彩的场景。

灰度世界法的第二种实现

 

matlab实现如下:

  1. function res = WhiteBalance(img)
  2. RGB=imread(img);
  3. R=RGB(:,:,1);
  4. G=RGB(:,:,2);
  5. B=RGB(:,:,3);
  6. I=0.299*R+0.587*G+0.114*B;
  7. kr=mean(I(:))/mean(R(:));
  8. kg=mean(I(:))/mean(G(:));
  9. kb=mean(I(:))/mean(B(:));
  10. % res(:,:,1)=kr*R;
  11. % res(:,:,2)=kg*G;
  12. % res(:,:,3)=kb*B;
  13. res=cat(3,kr*R,kg*G,kb*B);
  14. end

 

3.2最大值平衡

 matlab实现如下:

  1. function res = MaxValueBalance(img)
  2. RGB=imread(img);
  3. R=RGB(:,:,1);
  4. % figure, imhist(R);
  5. G=RGB(:,:,2);
  6. % figure, imhist(G);
  7. B=RGB(:,:,3);
  8. % figure, imhist(B);
  9. Srgb=min([max(R(:)) max(G(:)) max(B(:))]);
  10. Nmax=max([sum(sum(R>=Srgb)) sum(sum(G>=Srgb)) sum(sum(B>=Srgb))]);
  11. Tr_temp=sort(R(:),'descend');
  12. Tr=Tr_temp(Nmax);
  13. Tg_temp=sort(G(:),'descend');
  14. Tg=Tg_temp(Nmax);
  15. Tb_temp=sort(B(:),'descend');
  16. Tb=Tb_temp(Nmax);
  17. kr=Srgb/Tr;
  18. kg=Srgb/Tg;
  19. kb=Srgb/Tb;
  20. % res(:,:,1)=kr*R;
  21. % res(:,:,2)=kg*G;
  22. % res(:,:,3)=kb*B;
  23. res=cat(3,kr*R,kg*G,kb*B);
  24. end

 

4.考虑硬件化实现

对于数字硬件来说,要考虑算法硬件实现的可能性,一般来说,可以利用帧间数据相关性,使用上一帧计算得到的各个分量的增益系数来完成图像数据的调整。算法实现如下:

  1. 帧有效期间,完成各个分量数据的累加;
  2. 帧消隐期间,完成通道平均灰度与增益系数的计算;
  3. 下一帧有效期间,使用上一帧计算的增益系数完成数据调整,同时,完成各个分量数据的累加,依此下去。

参考

图像白平衡原理及实现_lemonHe_的博客-CSDN博客_图像白平衡

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/菜鸟追梦旅行/article/detail/519728
推荐阅读
相关标签
  

闽ICP备14008679号