白平衡算法.docx
《白平衡算法.docx》由会员分享,可在线阅读,更多相关《白平衡算法.docx(20页珍藏版)》请在冰豆网上搜索。
![白平衡算法.docx](https://file1.bdocx.com/fileroot1/2023-2/9/85c0b967-1f12-482c-acac-020b0dbdc9a5/85c0b967-1f12-482c-acac-020b0dbdc9a51.gif)
白平衡算法
灰色世界法(greyworldmethod)
要计算未知光源的特性必须从图片中提取相关的统计特性。
当我们能够仅使用一个统计特性就获得未知光源特性时,算法就变得非常简单了。
在这种情况下,未知光源必须在整幅图片上都是统一的。
均值于是就成为了此类方法之下最好的统计指标。
而灰色世界法正是利用了均值作为估算未知光源的关键统计量。
从物理意义上说,灰色世界法假设自然界景物对于光线的平均反射的均值在总体上是个定值,这个定值近似地为“灰色”。
在给定图片的白平衡算法中,灰色世界假设图片中的反射面足够丰富,以至于可以作为自然界景物的一个缩影。
若这幅图片是在经典光源下拍摄的,其均值就应该等于灰色。
若这幅图是在非经典光源下拍摄的,那么均值就会大于或者小于灰色值。
而该均值对于灰色的偏离程度则反映了未知光源相对于已知光源的特性。
虽然这个方法比较简单,但是仍然可以从一些方面进行调整。
一个方面就是对于灰色的定义形式的选择。
包括对于光谱的定义、对于光谱成分的定义和在经典光源之下的RGB的响应。
另一个更加重要的调整方面就是对于灰色的选择。
不管如何定义灰色,最佳的灰色之选必然是自然界实事上出现的灰色。
但是这个值是无法获得的(除非是合成数据),所以对于灰色的选择是不同的灰色世界算法的一个重要的区别点。
一个方法是假设这个灰色就是实事上的灰色。
也就是说反射光谱是均衡的。
给定光源之下的RGB响应是纯白色对此光源的响应值的一部分。
比方说,可以使用50%作为反射率(虽然这个灰色值对于人眼视觉习惯而言可能过于明亮)。
另一种方法,就是根据大量的数据提炼出一个均值,并把它定义为灰色。
这种方法提炼的灰色值可能因为数据库使用的不同而有所不同。
最终提炼的灰色也能仅适用于原始的数据库,而对于数据库未包括的图片的适用度就会比较差一些。
确定下来的灰色表达形式可以用
来表示。
下标i表示信道,上标c为canonical的首字母,表示经典光源。
在确定灰色的表达形式后只要用RGB响应与经典光源下灰色的比值来归一化图片就可以了。
假设RGB响应均值为
,下标i表示信道,上标U为Unknown的首字母,表示未知光源。
那么归一化率的计算式为
如下式所示:
根据光源转换理论,从未知光源到经典光源下图片表达式的转换式如下式所定义:
那么,灰色世界法的计算过程如下图所示:
本实验选择的灰色值为(129,129,129),具体的matlab实现程序如下:
%灰色世界法%
clearall;%清屏%
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('变换后图片');%显示图片%
偏蓝图片
白平衡调整后的图片
正常光照下的图片
基于动态阀值的自动白平衡法(AutomaticWhiteBalanceMethod)
这个算法是通过对图片的ycbcr色空间的分析来确定参考白点的,所以次算法可以说是自适应白平衡算法。
本算法选择参考白点的阀值是动态变化的,所以对于不同的图片,其阀值也不同。
通过对图片的cbcr坐标空间的分析,我们可以看到一个接近白色的区域(near-whiteregion)是包含着参考白点的。
通过这个思路,我们可以通过对图片分区,然后找出参考白点,然后在通过vonkviesmodel来调整图片时期实现白平衡。
这样,这个算法就包括了两个步骤了:
寻找参考白点,白点调整。
寻找参考白点:
为了确定一个接近白色的区域,我们就必须把RGB色空间转换成YCbCr色空间。
色空间转换后,就是计算Cb、Cr的均值Mb、Mr;然后通过下式计算Cb、Cr的均方差Db、Dr:
为了提高算法的稳健性,将图片分为几个区域并且计算每个区域的Mb、Mr、Db、Dr,如果一个区域的Db,Dr太小,那么这个区域就没有足够的色彩变化,就可以丢弃掉了。
这样可以避免大面积的统一色调对结果的影响。
接下来就可以通过下面的关系式得到接近白色区域的所有像素点了:
根据亮度值,我们选择接近白色区域中的10%的候选参考白点最为参考白点。
在白点确定后,就可以从参考白点中得到信道增益的值了。
为了维持整幅图片的亮度不变,亮度的最大值被用来得到信道增益。
所以信道增益不及和参考白点有关还与亮度的最大值有关,其表达式如下:
其中
是整幅图片像素的亮度最大值,
、
和
是参考白点的RGB信道的均值。
最后,根据von-kviesmodel来调整图片,使其达到白平衡的效果。
调整的表达式如下:
其中RGB是图片的像素点的三个信道值,
是调整之后的图片的像素点的三个信道值。
其源程序如下:
%Programforwhitebalancing%
functionW=wbalance(im)
clearall;
closeall;
%读取照片的信息%
[filename,pathname]=uigetfile('*.jpg;*.bmp;*.gif','Pickanimage-file');
ifisequal(filename,0)
disp('UserselectedCancel');
else
disp(['Userselected',fullfile(pathname,filename)]);
end
fname=strcat(pathname,filename);
im=imread(fname);
im2=im;
im1=rgb2ycbcr(im);%将图片的RGB值转换成YCbCr值%
Lu=im1(:
:
1);
Cb=im1(:
:
2);
Cr=im1(:
:
3);
[xyz]=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;
fori=1:
x
forj=1:
y
b1=Cb(i,j)-(Mb+Db*sign(Mb));
b2=Cr(i,j)-(1.5*Mr+Dr*sign(Mr));
if(b1Ciny(cnt)=Lu(i,j);
tst(i,j)=Lu(i,j);
cnt=cnt+1;
end
end
end
cnt=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;
fori=1:
x
forj=1:
y
iftst(i,j)tst(i,j)=0;
else
tst(i,j)=1;
c=c+1;
end
end
end
R=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('白平衡后的效果图');
黄偏色图片
正常光照下的图片
次算法的缺点是运行速度慢,但是对图片的还原效果还是比较显著的。
其他白平衡算法
镜面法(PerfectReflectorModel)
根据图像形成理论,对于纯白色的反射面而言,无论光源是什么颜色,最终反射后的颜色总能完全表现出光源的颜色。
如果景物中有纯白的部分,那么就可以直接从这些像素中提取出光源信息。
基于这种思想的方法都被称为是镜面法。
与灰色世界法类似的,镜面法也有多种调整方式。
在本文中着重介绍两种。
第一种方法较为基本也较为简便。
这种方法假设图片中一定有纯白色面存在,那么在经典光源下,图片中所有像素点三个信道的最大值都应该等于255,或者是一个给定的纯白色的值。
在任何其他的光源下,图片纯白色点的像素值就会小于经典光源下的纯白色,并且这些点将代表整幅图片中最亮的点。
那么只要将各信道的值按比例规一化到最大值(纯白色)就可以获得在经典光源下的图片了。
假设经典的白色表达形式可以用
来表示。
下标i表示信道,上标c表示经典光源。
假设RGB响应的最值为
,下标i表示信道,上标U表示未知光源。
那么归一化率的计算式为如下式所示:
根据光源转换理论,从未知光源到经典光源下图片表达式的转换同样可以用下式定义:
其计算过程如下:
当选择(255,255,255)为白色值的时候只需把每个信道的像素值拉伸到最大值即可。
这种镜面法最为简单,在有效性方面的表现也不错。
第二镜面法算法在第一步的基础上改进了对于白色点的定义。
它不是将白色定义为各信道值最大的点。
而是将满足某个条件的点都定义为白色点,通过计算这些点的平均色温,得到对于未知光源的估计值。
这类算法首先将对于白色的定义形式转换到了YCbCr空间:
在YCbCr空间中,Y是灰度,表示图像的亮度,Cb和Cr是色度的蓝色和红色分量,代表图像的色差。
由于镜面是图像中亮度最大的部分,那么Y值最大的点就可以很好的代表图像中的镜面。
第二步就是在转换完的空间中寻找到可以代表镜面的点。
在Y较小时,Cb和Cr较小的像素表现为接近白色的灰度值;而在Y较大时,Cb和Cr较大的像素仍可以认为是白色物体受到光源污染得到的。
因此我国的白平衡研究学者提出了下列约束条件:
由算法决定,不同镜面算法的
值不同。
在选出了合适的白色点之后,下一步就是要估计色温,根据计算的色温来还原已知光源下的图片。
色温估计的计算式如下式所示:
其中下标X标示信道,在这种算法中X=Y、Cb、Cr。
进行色温估计之后,利用光源转换式可以获得如下图所示的计算过程:
音阶映射法(gamutmappingmodel)
音阶映射法采用了与前几种方法完全不同的思路,是第一个很好的描述了图片统计特性的算法,由Forsyth在1990年首次提出。
此方法的第一步是建造一个所有可能的R、G、B值得集合,这些值是在经典光源下拍摄所有现实世界可能出现的反射面获得的。
这个集合是一个凸多面体,因此可使用其顶点来表征。
在第二步中,使用相似的方法,将图片中所有出现的R、G、B值绘成一个凸多面体。
第三步是将这两个凸多面体相互映射从而获得对角变换矩阵。
根据映射得来的变换矩阵一般不是唯一的,而是一个由许多矩阵组成的集合。
所以第四步就是从这个集合中挑选出最终的变换矩阵。
音阶映射法的主要优点在于对于其应用环境没有特别的限制,因此其平均表现水平要高于灰色世界法和完美反射法。
其不足之处主要有三:
第一,要获得在经典光源下所有可能出现的R、G、B值集合非常困难,一般只能获得近似集合。
第二,映射两个三维集合的计算量比较大。
第三,获得的变换矩阵是一个集合,
没有有效的方法获得最优解。
1996年Finlayson提出透视色彩法,在音阶映射法的基础上作了两点改进。
第一,这种方法使用了色度空间(r,g)=(R/(R+B+G),G/(R+B+G));第二,通过考虑可能出现的光源值来进一步缩小得到的变换矩阵集合。
使用色度空间之后,参数集合从三维降为两维,降低了运算复杂度。
考虑可能出现的光源以后缩小了目标变换矩阵的范围,使得最后得到的结果更接近最优解。
透视色彩法的主要缺陷在于光源集合是一个非凸集合,也就说它无法仅仅使用顶点来精确表征。
这样就加大了运算难度。
Barnard采用的方法是将其近似认为一个凸集合,这样就不需要增加额外的计算了,但是对最后变换矩阵集合的准确获得造成了一定负面影响。
接下来将对音阶图法的基本计算方法作一个阐述。
所使用的色度空间为改进后的二维色度空间(r,g)=(R/(R+B+G),G/(R+B+G))。
第一步为构造色集合图;第二步与第三步,构造待测图片的色集合图并将其映射到测试色集合图中。
经过映射以后未知光源的图片就与经典光源下的可能图像建立了映射关系。
通常,建立的映射关系不是唯一的,而是一个集合,这样就需要对这个集合中所有的映射关系进行筛选从而获得最佳结果。
选择的过程必须要建立额外的假设,因此不是唯一的。
色相关法(colorbycorrelationmodel)
Finlayson提出了色相关法作为对于透视色彩法的改进。
色相关法的实质就是将色彩空间离散化,从而进一步降低计算复杂度。
色相关法的基本思想是预先计算一个矩阵,这个矩阵描述了不用光源与特定图像色彩出现之间的相关度。
矩阵的每一行对应于一个不同的训练光源,每一列为可能出现的色彩值,这些色彩值是通过离散化染色空间(r,g)获得的。
行和列可以任意排列而不影响此方法的有效性。
矩阵元素A(i,j)的含义为:
在光源i之下拍摄的图片中出现色彩j。
色相关法中提出了两种定义矩阵元素A(i,j)的方法。
在第一种方法中,A(i,j)只能取0或1。
取0表示色彩j不可能出现在光源i之下,取1表示色彩j可能出现在光源i之下。
在第二种方法中,A(i,j)可以去0到1之间的任何一个值,代表色彩i出现在光源j之下的概率。
在计算完相关矩阵之后,使用类似的方法将目标图片的色彩空间离散化,形成一个相关矢量,与相关矩阵相乘以获得这个未知光源下的图象与各个已知光源的相关度。
选取相关度最大的一个或几个已知光源对未知光源特性进行估计,求得未知光源特性。
色相关法的好处在于,在充分考虑到图像统计特性的前提下进一步降低了计算复杂度。
但是其不足也是明显的。
首先,与透视色彩法一样,对于所有可能光源的估计是近似的,不完全的,可能影响到最后的估计结果。
其次,离散化色彩空间的过程中丢失了许多色彩信息,在一些情况下,可能使相关矩阵和向量相乘后的结果为零向量。
以下将对色相关的计算步骤进行简要介绍:
第一步,建立相关矩阵,其过程:
(a)找出在参考光源下的彩色图像的色度;(b)计算出每个色彩在参考光源下的出现概率;(c)将b所计算出的概率加入色相关矩阵M。
可以看到(a)中所示的色度集合是离散的,因为色相关矩阵中的各种颜色分布也是离散的。
(c)中相关矩阵的每一列代表不同的光源,在这一列中的每一个值代表了对应的色彩区域出现的概率。
第二步是相关的过程。
在进行相关之前需要先构造图像向量,图像向量的每一个元素值代表对应的色彩区间是否出现在给定的需要进行白平衡处理的图片中。
接着就是相关过程了,相关矩阵与特征向量的相关过程可以简要表示:
(a)从图像色度集合中求出图像向量;(b)将图像数据与可能的光源进行相关;(c)选择一个可能的光源。
第三步就是最佳光源的选取。
最佳光源的选取有多种方法,包括最大相关值法:
寻找所有相关向量中最大的元素;最大相关值平均法:
将相关向量里最大的几个值所对应的光源色彩进行平均,然后求出最佳光源;等等。
神经网络法(NeuralNetworkApproachtoColourConstancy)
神经网络法是处理视角比较独特的一种白平衡算法。
该方法同样对染色空间(r,g)进行了离散化处理,并将其与神经网略结构相联系。
目前提出的神经网络白平衡算法使用了3层结构,输入层有X000个节点,第一个隐藏层有X00个节点,第二个隐藏层有X0个节点,输出层有2个节点。
输入层代表离散化的染色空间(r,g),每一个节点的输入可取0或1,表示某个色彩值(ri,gi)是否在图像中出现。
输出层表征了光源特性。
上层为下层值得加权和。
通过输入不同的图片,可以训练神经网络的权值,以获得满意的结果。
输入神经元有多个,输出神经元为两个。
神经网络的输出描述了未知光源特性,输入则代表了图像的色彩特性。
对于各层结点数为多少时处理效果最优这个问题,目前还没有办法在理论上进行验证。
试验经验表明,在一定的范围内,结点数的多少不影响处理的最终效果。
但这也同时表明了,神经网络发的处理效果优化存在一定难度。