matlab 白平衡,白平衡算法

灰色世界法(greyworldmethod)

要计算未知光源的特性必须从图片中提取相关的统计特性。当我们能够仅使用一个统计特性就获得未知光源特性时,算法就变得非常简单了。在这种情况下,未知光源必须在整幅图片上都是统一的。均值于是就成为了此类方法之下最好的统计指标。而灰色世界法正是利用了均值作为估算未知光源的关键统计量。

从物理意义上说,灰色世界法假设自然界景物对于光线的平均反射的均值在总体上是个定值,这个定值近似地为“灰色”。在给定图片的白平衡算法中,灰色世界假设图片中的反射面足够丰富,以至于可以作为自然界景物的一个缩影。若这幅图片是在经典光源下拍摄的,其均值就应该等于灰色。若这幅图是在非经典光源下拍摄的,那么均值就会大于或者小于灰色值。而该均值对于灰色的偏离程度则反映了未知光源相对于已知光源的特性。

虽然这个方法比较简单,但是仍然可以从一些方面进行调整。一个方面就是对于灰色的定义形式的选择。包括对于光谱的定义、对于光谱成分的定义和在经典光源之下的RGB的响应。另一个更加重要的调整方面就是对于灰色的选择。不管如何定义灰色,最佳的灰色之选必然是自然界实事上出现的灰色。但是这个值是无法获得的(除非是合成数据),所以对于灰色的选择是不同的灰色世界算法的一个重要的区别点。 一个方法是假设这个灰色就是实事上的灰色。也就是说反射光谱是均衡的。给定光源之下的RGB响应是纯白色对此光源的响应值的一部分。比方说,可以使用50%作为反射率(虽然这个灰色值对于人眼视觉习惯而言可能过于明亮)。

另一种方法,就是根据大量的数据提炼出一个均值,并把它定义为灰色。这种方法提炼的灰色值可能因为数据库使用的不同而有所不同。最终提炼的灰色也能仅适用于原始的数据库,而对于数据库未包括的图片的适用度就会比较差一些。确定下来的灰色表达形式可以用来表示。下标i表示信道,上标c为canonical的首字母,表示经典光源。

在确定灰色的表达形式后只要用RGB响应与经典光源下灰色的比值来归一化图片就可以了。假设RGB响应均值为,下标i表示信道,上标U为Unknown的首字母,表示未知光源。那么归一化率的计算式为如下式所示: 根据光源转换理论,从未知光源到经典光源下图片表达式的转换式如下式所定义: 那么,灰色世界法的计算过程如下图所示:

60483cac818feadacc5f62e98e2fab77.png

本实验选择的灰色值为(129,129,129),具体的matlab实现程序如下:

562d3cb52da9cc81a725d8fc261be348.png

028f6db8745b817f3808724144f66145.png

偏蓝图片

155f25c67e2c43426d06bd6aed03379a.png

白平衡调整后的图片

b1b6992d9c1de607a0a611d296c748e0.png

正常光照下的图片

1c42a2fa38543b76725dd9b7e07f9719.png

动态阀值的自动白平衡法

基于动态阀值的自动白平衡法(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’,‘Pick an

image-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(b1《abs(1.5*Db)&b2《abs(1.5*Dr))

Ciny(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三信道的值%

5c90593ca7fe1946da6c8e21219357c1.png

%计算参考白点的RGB的均值%

fb1c8b3c0e2203bc41b9f98ccf0f2a18.png

黄偏色图片

7d3a5c5ca362c588b7d7ef245edfc41e.png

b90c3c27c60cad73f8634f9be2016ed4.png

正常光照下的图片

ec5603981aa48572211dbb2f01d5fadf.png

  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值