白平衡算法总结
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
6
接下来就可以通过下面的关系式得到接近白色区域的所有像素点 了: ������������ ������, ������ − ������������ + ������������ × ������������������������ ������������ < 1.5 × ������������ < 1.5 × ������������
1
一部分。比方说,可以使用 50%作为反射率(虽然这个灰色值对于 人眼视觉习惯而言可能过于明亮) 。 另一种方法,就是根据大量的数据提炼出一个均值,并把它定义 为灰色。 这种方法提炼的灰色值可能因为数据库使用的不同而有所不 同。最终提炼的灰色也能仅适用于原始的数据库,而对于数据库未包 括的图片的适用度就会比较差一些。 确定下来的灰色表达形式可以用 Greyic 来表示。下标 i 表示信道,上标 c 为 canonical 的首字母,表 示经典光源。 在确定灰色的表达形式后只要用 RGB 响应与经典光源下灰色的 比值来归一化图片就可以了。假设 RGB 响应均值为 Aveu i ,下标 i 表示信道,上标 U 为 Unknown 的首字母,表示未知光源。那么归 一化率的计算式为σ
灰色世界法(grey world method) 要计算未知光源的特性必须从图片中提取相关的统计特性。 当我 们能够仅使用一个统计特性就获得未知光源特性时, 算法就变得非常 简单了。在这种情况下,未知光源必须在整幅图片上都是统一的。均 值于是就成为了此类方法之下最好的统计指标。 而灰色世界法正是利 用了均值作为估算未知光源的关键统计量。 从物理意义上说, 灰色世界法假设自然界景物对于光线的平均反 射的均值在总体上是个定值,这个定值近似地为“灰色” 。在给定图 片的白平衡算法中,灰色世界假设图片中的反射面足够丰富,以至于 可以作为自然界景物的一个缩影。 若这幅图片是在经典光源下拍摄的, 其均值就应该等于灰色。若这幅图是在非经典光源下拍摄的,那么均 值就会大于或者小于灰色值。 而该均值对于灰色的偏离程度则反映了 未知光源相对于已知光源的特性。 虽然这个方法比较简单,但是仍然可以从一些方面进行调整。一 个方面就是对于灰色的定义形式的选择。包括对于光谱的定义、对于 光谱成分的定义和在经典光源之下的 RGB 的响应。 另一个更加重要 的调整方面就是对于灰色的选择。不管如何定义灰色,最佳的灰色之 选必然是自然界实事上出现的灰色。但是这个值是无法获得的(除非 是合成数据) ,所以对于灰色的选择是不同的灰色世界算法的一个重 要的区别点。 一个方法是假设这个灰色就是实事上的灰色。 也就是说反射光谱 是均衡的。 给定光源之下的 RGB 响应是纯白色对此光源的响应值的
8
%计算 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:x for j=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;
10
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('白平衡后的效果图');
9Leabharlann Baidu
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:x for j=1:y if tst(i,j)<mn 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;
img0(:,:,1)=Qr*img(:,:,1); img0(:,:,2)=Qg*img(:,:,2); img0(:,:,3)=Qb*img(:,:,3); figure,imshow(img0),title('变换后图片'); %显示图片%
偏蓝图片
4
白平衡调整后的图片
正常光照下的图片
5
基于动态阀值的自动白平衡法 (Automatic White Balance Method) 这个算法是通过对图片的 ycbcr 色空间的分析来确定参考白点的, 所以次算法可以说是自适应白平衡算法。 本算法选择参考白点的阀值 是动态变化的,所以对于不同的图片,其阀值也不同。通过对图片的 cbcr 坐标空间的分析, 我们可以看到一个接近白色的区域 (near-white region)是包含着参考白点的。通过这个思路,我们可以通过对图片 分区,然后找出参考白点,然后在通过 von kvies model 来调整图片 时期实现白平衡。这样,这个算法就包括了两个步骤了:寻找参考白 点,白点调整。 寻找参考白点: 为了确定一个接近白色的区域, 我们就必须把 RGB 色空间转换成 YCbCr 色空间。 色空间转换后,就是计算 Cb、Cr 的均值 Mb、Mr;然后通过下式 计算 Cb、Cr 的均方差 Db、Dr: Db =
i
=
White C i Max U i
根据光源转换理论,从未知光源到经典光源下图片表达式的转换 同样可以用下式定义: σ ρc =
其中Ymax 是整幅图片像素的亮度最大值,R avew 、Gavew 和Bavew 是 参考白点的 RGB 信道的均值。 最后, 根据 von-kvies model 来调整图片, 使其达到白平衡的效果。 调整的表达式如下: R = R gain × R G = Ggain × G B = Bgain × B 其中 RGB 是图片的像素点的三个信道值, RGB是调整之后的图片 的像素点的三个信道值。
13
白色面存在,那么在经典光源下,图片中所有像素点三个信道的最大 值都应该等于 255,或者是一个给定的纯白色的值。在任何其他的光 源下,图片纯白色点的像素值就会小于经典光源下的纯白色,并且这 些点将代表整幅图片中最亮的点。 那么只要将各信道的值按比例规一 化到最大值(纯白色)就可以获得在经典光源下的图片了。 假设经典的白色表达形式可以用WhiteC i 来表示。下标 i 表示信道, 上标 c 表示经典光源。 假设 RGB 响应的最值为 MaxiU , 下标 i 表 示信道,上标 U 表示未知光源。那么归一化率的计算式为如下式所 示: σ
i ,j (
Cb(i, j) − Mb ) N Cr(i, j) − Mr ) N
Dr =
i ,j (
为了提高算法的稳健性,将图片分为几个区域并且计算每个区域 的 Mb、Mr、Db、Dr,如果一个区域的 Db,Dr 太小,那么这个区域 就没有足够的色彩变化,就可以丢弃掉了。这样可以避免大面积的统 一色调对结果的影响。
������������ ������, ������ − ������. ������ × ������������ + ������������ × ������������������������ ������������
根据亮度值,我们选择接近白色区域中的 10%的候选参考白点最 为参考白点。在白点确定后,就可以从参考白点中得到信道增益的值 了。为了维持整幅图片的亮度不变,亮度的最大值被用来得到信道增 益。所以信道增益不及和参考白点有关还与亮度的最大值有关,其表 达式如下: R gain = Ggain = Bgain = Ymax Ymax Ymax R avew Gavew Bavew
i
如下式所示 : Greyic σi= Aveu i
根据光源转换理论,从未知光源到经典光源下图片表达式的转换 式如下式所定义: σ ρ =
c 1
σ
2
∙ ρu σ
3
那么,灰色世界法的计算过程如下图所示:
2
灰色的选择
Grey
c i
RGB通道的均值 计算
归一化率计算
光源变换
本实验选择的灰色值为(129,129,129) ,具体的 matlab 实现程 序如下: %灰色世界法% clear all; %清屏% %读取位图的 rgb 值并存在名为 img 的三 维矩阵中% AveR=mean(mean(img(:,:,1))); AveG=mean(mean(img(:,:,2))); AveB=mean(mean(img(:,:,3)));
3
img=imread('b1.bmp');
%计算 R 通道的均值% %计算 G 通道的均值% %计算 B 通道的均值%
Qr=129/AveR; Qg=129/AveG; Qb=129/AveB; %光源变换%
%计算 R 通道的归一化率 Qr% %计算 G 通道的归一化率 Qg% %计算 B 通道的归一化率 Qb%
11
黄偏色图片
12
正常光照下的图片
次算法的缺点是运行速度慢,但是对图片的还原效果还是比较显 著的。 其他白平衡算法 镜面法(Perfect Reflector Model) 根据图像形成理论,对于纯白色的反射面而言,无论光源是什么 颜色,最终反射后的颜色总能完全表现出光源的颜色。如果景物中有 纯白的部分,那么就可以直接从这些像素中提取出光源信息。基于这 种思想的方法都被称为是镜面法 。 与灰色世界法类似的,镜面法也有多种调整方式。在本文中着重 介绍两种 。 第一种方法较为基本也较为简便。这种方法假设图片中一定有纯
7
其源程序如下: %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'); else disp(['User selected', 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); [x y z]=size(im); tst=zeros(x,y);
接下来就可以通过下面的关系式得到接近白色区域的所有像素点 了: ������������ ������, ������ − ������������ + ������������ × ������������������������ ������������ < 1.5 × ������������ < 1.5 × ������������
1
一部分。比方说,可以使用 50%作为反射率(虽然这个灰色值对于 人眼视觉习惯而言可能过于明亮) 。 另一种方法,就是根据大量的数据提炼出一个均值,并把它定义 为灰色。 这种方法提炼的灰色值可能因为数据库使用的不同而有所不 同。最终提炼的灰色也能仅适用于原始的数据库,而对于数据库未包 括的图片的适用度就会比较差一些。 确定下来的灰色表达形式可以用 Greyic 来表示。下标 i 表示信道,上标 c 为 canonical 的首字母,表 示经典光源。 在确定灰色的表达形式后只要用 RGB 响应与经典光源下灰色的 比值来归一化图片就可以了。假设 RGB 响应均值为 Aveu i ,下标 i 表示信道,上标 U 为 Unknown 的首字母,表示未知光源。那么归 一化率的计算式为σ
灰色世界法(grey world method) 要计算未知光源的特性必须从图片中提取相关的统计特性。 当我 们能够仅使用一个统计特性就获得未知光源特性时, 算法就变得非常 简单了。在这种情况下,未知光源必须在整幅图片上都是统一的。均 值于是就成为了此类方法之下最好的统计指标。 而灰色世界法正是利 用了均值作为估算未知光源的关键统计量。 从物理意义上说, 灰色世界法假设自然界景物对于光线的平均反 射的均值在总体上是个定值,这个定值近似地为“灰色” 。在给定图 片的白平衡算法中,灰色世界假设图片中的反射面足够丰富,以至于 可以作为自然界景物的一个缩影。 若这幅图片是在经典光源下拍摄的, 其均值就应该等于灰色。若这幅图是在非经典光源下拍摄的,那么均 值就会大于或者小于灰色值。 而该均值对于灰色的偏离程度则反映了 未知光源相对于已知光源的特性。 虽然这个方法比较简单,但是仍然可以从一些方面进行调整。一 个方面就是对于灰色的定义形式的选择。包括对于光谱的定义、对于 光谱成分的定义和在经典光源之下的 RGB 的响应。 另一个更加重要 的调整方面就是对于灰色的选择。不管如何定义灰色,最佳的灰色之 选必然是自然界实事上出现的灰色。但是这个值是无法获得的(除非 是合成数据) ,所以对于灰色的选择是不同的灰色世界算法的一个重 要的区别点。 一个方法是假设这个灰色就是实事上的灰色。 也就是说反射光谱 是均衡的。 给定光源之下的 RGB 响应是纯白色对此光源的响应值的
8
%计算 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:x for j=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;
10
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('白平衡后的效果图');
9Leabharlann Baidu
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:x for j=1:y if tst(i,j)<mn 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;
img0(:,:,1)=Qr*img(:,:,1); img0(:,:,2)=Qg*img(:,:,2); img0(:,:,3)=Qb*img(:,:,3); figure,imshow(img0),title('变换后图片'); %显示图片%
偏蓝图片
4
白平衡调整后的图片
正常光照下的图片
5
基于动态阀值的自动白平衡法 (Automatic White Balance Method) 这个算法是通过对图片的 ycbcr 色空间的分析来确定参考白点的, 所以次算法可以说是自适应白平衡算法。 本算法选择参考白点的阀值 是动态变化的,所以对于不同的图片,其阀值也不同。通过对图片的 cbcr 坐标空间的分析, 我们可以看到一个接近白色的区域 (near-white region)是包含着参考白点的。通过这个思路,我们可以通过对图片 分区,然后找出参考白点,然后在通过 von kvies model 来调整图片 时期实现白平衡。这样,这个算法就包括了两个步骤了:寻找参考白 点,白点调整。 寻找参考白点: 为了确定一个接近白色的区域, 我们就必须把 RGB 色空间转换成 YCbCr 色空间。 色空间转换后,就是计算 Cb、Cr 的均值 Mb、Mr;然后通过下式 计算 Cb、Cr 的均方差 Db、Dr: Db =
i
=
White C i Max U i
根据光源转换理论,从未知光源到经典光源下图片表达式的转换 同样可以用下式定义: σ ρc =
其中Ymax 是整幅图片像素的亮度最大值,R avew 、Gavew 和Bavew 是 参考白点的 RGB 信道的均值。 最后, 根据 von-kvies model 来调整图片, 使其达到白平衡的效果。 调整的表达式如下: R = R gain × R G = Ggain × G B = Bgain × B 其中 RGB 是图片的像素点的三个信道值, RGB是调整之后的图片 的像素点的三个信道值。
13
白色面存在,那么在经典光源下,图片中所有像素点三个信道的最大 值都应该等于 255,或者是一个给定的纯白色的值。在任何其他的光 源下,图片纯白色点的像素值就会小于经典光源下的纯白色,并且这 些点将代表整幅图片中最亮的点。 那么只要将各信道的值按比例规一 化到最大值(纯白色)就可以获得在经典光源下的图片了。 假设经典的白色表达形式可以用WhiteC i 来表示。下标 i 表示信道, 上标 c 表示经典光源。 假设 RGB 响应的最值为 MaxiU , 下标 i 表 示信道,上标 U 表示未知光源。那么归一化率的计算式为如下式所 示: σ
i ,j (
Cb(i, j) − Mb ) N Cr(i, j) − Mr ) N
Dr =
i ,j (
为了提高算法的稳健性,将图片分为几个区域并且计算每个区域 的 Mb、Mr、Db、Dr,如果一个区域的 Db,Dr 太小,那么这个区域 就没有足够的色彩变化,就可以丢弃掉了。这样可以避免大面积的统 一色调对结果的影响。
������������ ������, ������ − ������. ������ × ������������ + ������������ × ������������������������ ������������
根据亮度值,我们选择接近白色区域中的 10%的候选参考白点最 为参考白点。在白点确定后,就可以从参考白点中得到信道增益的值 了。为了维持整幅图片的亮度不变,亮度的最大值被用来得到信道增 益。所以信道增益不及和参考白点有关还与亮度的最大值有关,其表 达式如下: R gain = Ggain = Bgain = Ymax Ymax Ymax R avew Gavew Bavew
i
如下式所示 : Greyic σi= Aveu i
根据光源转换理论,从未知光源到经典光源下图片表达式的转换 式如下式所定义: σ ρ =
c 1
σ
2
∙ ρu σ
3
那么,灰色世界法的计算过程如下图所示:
2
灰色的选择
Grey
c i
RGB通道的均值 计算
归一化率计算
光源变换
本实验选择的灰色值为(129,129,129) ,具体的 matlab 实现程 序如下: %灰色世界法% clear all; %清屏% %读取位图的 rgb 值并存在名为 img 的三 维矩阵中% AveR=mean(mean(img(:,:,1))); AveG=mean(mean(img(:,:,2))); AveB=mean(mean(img(:,:,3)));
3
img=imread('b1.bmp');
%计算 R 通道的均值% %计算 G 通道的均值% %计算 B 通道的均值%
Qr=129/AveR; Qg=129/AveG; Qb=129/AveB; %光源变换%
%计算 R 通道的归一化率 Qr% %计算 G 通道的归一化率 Qg% %计算 B 通道的归一化率 Qb%
11
黄偏色图片
12
正常光照下的图片
次算法的缺点是运行速度慢,但是对图片的还原效果还是比较显 著的。 其他白平衡算法 镜面法(Perfect Reflector Model) 根据图像形成理论,对于纯白色的反射面而言,无论光源是什么 颜色,最终反射后的颜色总能完全表现出光源的颜色。如果景物中有 纯白的部分,那么就可以直接从这些像素中提取出光源信息。基于这 种思想的方法都被称为是镜面法 。 与灰色世界法类似的,镜面法也有多种调整方式。在本文中着重 介绍两种 。 第一种方法较为基本也较为简便。这种方法假设图片中一定有纯
7
其源程序如下: %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'); else disp(['User selected', 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); [x y z]=size(im); tst=zeros(x,y);