灰色世界法(grey world method)要计算未知光源的特性必须从图片中提取相关的统计特性。
当我们能够仅使用一个统计特性就获得未知光源特性时,算法就变得非常简单了。
在这种情况下,未知光源必须在整幅图片上都是统一的。
均值于是就成为了此类方法之下最好的统计指标。
而灰色世界法正是利用了均值作为估算未知光源的关键统计量。
从物理意义上说,灰色世界法假设自然界景物对于光线的平均反射的均值在总体上是个定值,这个定值近似地为“灰色”。
在给定图片的白平衡算法中,灰色世界假设图片中的反射面足够丰富,以至于可以作为自然界景物的一个缩影。
若这幅图片是在经典光源下拍摄的,其均值就应该等于灰色。
若这幅图是在非经典光源下拍摄的,那么均值就会大于或者小于灰色值。
而该均值对于灰色的偏离程度则反映了未知光源相对于已知光源的特性。
虽然这个方法比较简单,但是仍然可以从一些方面进行调整。
一个方面就是对于灰色的定义形式的选择。
包括对于光谱的定义、对于光谱成分的定义和在经典光源之下的RGB的响应。
另一个更加重要的调整方面就是对于灰色的选择。
不管如何定义灰色,最佳的灰色之选必然是自然界实事上出现的灰色。
但是这个值是无法获得的(除非是合成数据),所以对于灰色的选择是不同的灰色世界算法的一个重要的区别点。
一个方法是假设这个灰色就是实事上的灰色。
也就是说反射光谱是均衡的。
给定光源之下的RGB响应是纯白色对此光源的响应值的一部分。
比方说,可以使用50%作为反射率(虽然这个灰色值对于人眼视觉习惯而言可能过于明亮)。
另一种方法,就是根据大量的数据提炼出一个均值,并把它定义为灰色。
这种方法提炼的灰色值可能因为数据库使用的不同而有所不同。
最终提炼的灰色也能仅适用于原始的数据库,而对于数据库未包括的图片的适用度就会比较差一些。
确定下来的灰色表达形式可以用来表示。
下标i表示信道,上标c为canonical的首字母,表示经典光源。
在确定灰色的表达形式后只要用RGB响应与经典光源下灰色的比值来归一化图片就可以了。
假设RGB响应均值为,下标i表示信道,上标U为Unknown的首字母,表示未知光源。
那么归一化率的计算式为如下式所示:根据光源转换理论,从未知光源到经典光源下图片表达式的转换式如下式所定义:那么,灰色世界法的计算过程如下图所示:本实验选择的灰色值为(129,129,129),具体的matlab实现程序如下:%灰色世界法%clear all;%清屏%img=imread('b1.bmp');%读取位图的rgb值并存在名为img的三维矩阵中%AveR=mean(mean(img(:,:,1)));%计算R通道的均值%AveG=mean(mean(img(:,:,2)));%计算G通道的均值%AveB=mean(mean(img(:,:,3)));%计算B通道的均值%Qr=129/AveR;%计算R通道的归一化率Qr%Qg=129/AveG;%计算G通道的归一化率Qg%Qb=129/AveB;%计算B通道的归一化率Qb%%光源变换%img0(:,:,1)=Qr*img(:,:,1);img0(:,:,2)=Qg*img(:,:,2);img0(:,:,3)=Qb*img(:,:,3);figure,imshow(img0),title('变换后图片');%显示图片%偏蓝图片白平衡调整后的图片正常光照下的图片基于动态阀值的自动白平衡法(Automatic White Balance Method)这个算法是通过对图片的ycbcr色空间的分析来确定参考白点的,所以次算法可以说是自适应白平衡算法。
本算法选择参考白点的阀值是动态变化的,所以对于不同的图片,其阀值也不同。
通过对图片的cbcr坐标空间的分析,我们可以看到一个接近白色的区域(near-white region)是包含着参考白点的。
通过这个思路,我们可以通过对图片分区,然后找出参考白点,然后在通过von kvies model来调整图片时期实现白平衡。
这样,这个算法就包括了两个步骤了:寻找参考白点,白点调整。
寻找参考白点:为了确定一个接近白色的区域,我们就必须把RGB色空间转换成YCbCr色空间。
色空间转换后,就是计算Cb、Cr的均值Mb、Mr;然后通过下式计算Cb、Cr的均方差Db、Dr:为了提高算法的稳健性,将图片分为几个区域并且计算每个区域的Mb、Mr、Db、Dr,如果一个区域的Db,Dr太小,那么这个区域就没有足够的色彩变化,就可以丢弃掉了。
这样可以避免大面积的统一色调对结果的影响。
接下来就可以通过下面的关系式得到接近白色区域的所有像素点了:根据亮度值,我们选择接近白色区域中的10%的候选参考白点最为参考白点。
在白点确定后,就可以从参考白点中得到信道增益的值了。
为了维持整幅图片的亮度不变,亮度的最大值被用来得到信道增益。
所以信道增益不及和参考白点有关还与亮度的最大值有关,其表达式如下:其中是整幅图片像素的亮度最大值,、和是参考白点的RGB信道的均值。
最后,根据von-kvies model来调整图片,使其达到白平衡的效果。
调整的表达式如下:其中RGB是图片的像素点的三个信道值,是调整之后的图片的像素点的三个信道值。
其源程序如下:%Program for white balancing%function W=wbalance(im)clear all;close all;%读取照片的信息%[filename,pathname]=uigetfile('*.jpg;*.bmp;*.gif','Pick an image-file');if isequal(filename,0)disp('User selected Cancel');elsedisp(['User selected',fullfile(pathname,filename)]);endfname=strcat(pathname,filename);im=imread(fname);im2=im;im1=rgb2ycbcr(im);%将图片的RGB值转换成YCbCr值% Lu=im1(:,:,1);Cb=im1(:,:,2);Cr=im1(:,:,3);[x y z]=size(im);tst=zeros(x,y);%计算Cb、Cr的均值Mb、Mr%Mb=sum(sum(Cb));Mr=sum(sum(Cr));Mb=Mb/(x*y);Mr=Mr/(x*y);%计算Cb、Cr的均方差%Db=sum(sum(Cb-Mb))/(x*y);Dr=sum(sum(Cr-Mr))/(x*y);%根据阀值的要求提取出near-white区域的像素点%cnt=1;for i=1:xfor j=1:yb1=Cb(i,j)-(Mb+Db*sign(Mb));b2=Cr(i,j)-(1.5*Mr+Dr*sign(Mr));if(b1<abs(1.5*Db)&b2<abs(1.5*Dr))Ciny(cnt)=Lu(i,j);tst(i,j)=Lu(i,j);cnt=cnt+1;endendendcnt=cnt-1;iy=sort(Ciny,'descend');%将提取出的像素点从亮度值大的点到小的点依次排列%nn=round(cnt/10);Ciny2(1:nn)=iy(1:nn);%提取出near-white区域中10%的亮度值较大的像素点做参考白点%%提取出参考白点的RGB三信道的值%mn=min(Ciny2);c=0;for i=1:xfor j=1:yif tst(i,j)<mntst(i,j)=0;elsetst(i,j)=1;c=c+1;endendendR=im(:,:,1);G=im(:,:,2);B=im(:,:,3);R=double(R).*tst;G=double(G).*tst;B=double(B).*tst;%计算参考白点的RGB的均值%Rav=mean(mean(R));Gav=mean(mean(G));Bav=mean(mean(B));Ymax=double(max(max(Lu)))/15;%计算出图片的亮度的最大值% %计算出RGB三信道的增益%Rgain=Ymax/Rav;Ggain=Ymax/Gav;Bgain=Ymax/Bav;%通过增益调整图片的RGB三信道%im(:,:,1)=im(:,:,1)*Rgain;im(:,:,2)=im(:,:,2)*Ggain;im(:,:,3)=im(:,:,3)*Bgain;%显示图片%W=im;figure,imshow(im2,[]),title('原图');figure,imshow(im,[]),title('白平衡后的效果图');黄偏色图片正常光照下的图片次算法的缺点是运行速度慢,但是对图片的还原效果还是比较显著的。
其他白平衡算法镜面法(Perfect Reflector Model)根据图像形成理论,对于纯白色的反射面而言,无论光源是什么颜色,最终反射后的颜色总能完全表现出光源的颜色。
如果景物中有纯白的部分,那么就可以直接从这些像素中提取出光源信息。
基于这种思想的方法都被称为是镜面法。
与灰色世界法类似的,镜面法也有多种调整方式。
在本文中着重介绍两种。
第一种方法较为基本也较为简便。
这种方法假设图片中一定有纯白色面存在,那么在经典光源下,图片中所有像素点三个信道的最大值都应该等于255,或者是一个给定的纯白色的值。
在任何其他的光源下,图片纯白色点的像素值就会小于经典光源下的纯白色,并且这些点将代表整幅图片中最亮的点。
那么只要将各信道的值按比例规一化到最大值(纯白色)就可以获得在经典光源下的图片了。
假设经典的白色表达形式可以用来表示。
下标i表示信道,上标c表示经典光源。
假设RGB响应的最值为,下标i表示信道,上标U表示未知光源。
那么归一化率的计算式为如下式所示:根据光源转换理论,从未知光源到经典光源下图片表达式的转换同样可以用下式定义:其计算过程如下:当选择(255,255,255)为白色值的时候只需把每个信道的像素值拉伸到最大值即可。
这种镜面法最为简单,在有效性方面的表现也不错。
第二镜面法算法在第一步的基础上改进了对于白色点的定义。
它不是将白色定义为各信道值最大的点。
而是将满足某个条件的点都定义为白色点,通过计算这些点的平均色温,得到对于未知光源的估计值。
这类算法首先将对于白色的定义形式转换到了YCbCr空间:在YCbCr空间中,Y是灰度,表示图像的亮度,Cb和Cr是色度的蓝色和红色分量,代表图像的色差。