• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

matlab自动阈值白平衡算法程序可编译实现一种效果很好的自动白平衡技术(WhiteBalance) ...

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

     白平衡是图像处理的一个极重要概念。所谓白平衡(英文名称为White Balance),就是对白色物体的还原。当我们用肉眼观看这大千世界时,在不同的光线下,对相同的颜色的感觉基本是相同的,比如在早晨旭日初升时,我们看一个白色的物体,感到它是白的;而我们在夜晚昏暗的灯光下,看到的白色物体,感到它仍然是白的。这是由于人类从出生以后的成长过程中,人的大脑已经对不同光线下的物体的彩色还原有了适应性。但是,作为拍摄设备,如数码相机,可没有人眼的适应性,在不同的光线下,由于CCD输出的不平衡性,造成数码相机彩色还原失真。一般情况下,我们习惯性地认为太阳光是白色的,已知直射日光的色温是5200K左右,白炽灯的色温是3000K左右。用传统相机的日光片拍摄时,白炽灯光由于色温太低,所以偏黄偏红。所以通常现场光线的色温低于相机设定的色温时,往往偏黄偏红,现场光线的色温高于相机设定时,就会偏蓝。

     为了解决不同色温下,引起的白色漂移现象。由于白色对色温变化的响应最大,通常用白色来作为调整的基色。通常的白平衡技术有:自动白平衡、钨光白平衡、荧光白平衡、室内白平衡、手动调节。本文仅介绍其中的一种自动白平衡。

     白平衡算法通常分为两步:白色点的检测,白色点的调整。本方法采用一个动态的阀值来检测白色点。详细算法过程为:

          1.  把图像w*h从RGB空间转换到YCrCb空间。

          2.  选择参考白色点:

                    a. 把图像分成3*4个块(块数可选)。

                    b. 对每个块,分别计算Cr,Cb的平均值Mr,Mb。

                    c. 对每个块,根据Mr,Mb,分别计算Cr,Cb的方差Dr,Db。

                    d. 判定每个块的近白区域(near-white region)。

                        判别表达式为:Cb(i, j) − (Mb + Db × sign(Mb )) < 1.5× Db && Cr(i, j) − (1.5×Mr + Dr × sign(Mr )) < 1.5× Dr

                       设一个“参考白色点”的亮度矩阵RL,大小为w*h。

                         若符合判别式,则作为“参考白色点”,并把该点(i,j)的亮度(Y分量)值赋给RL(i,j);

                         若不符合,则该点的RL(i,j)值为0。

         3.  选取参考“参考白色点”中最大的10%的亮度(Y分量)值,并选取其中的最小值Lu_min.

         4.  调整RL,若RL(i,j)<Lu_min,  RL(i,j)=0; 否则,RL(i,j)=1;

         5.  分别把R,G,B与RL相乘,得到R2,G2,B2。  分别计算R2,G2,B2的平均值,Rav,Gav,Bav;

         6.  得到调整增益:  Ymax=double(max(max(Y)))/15;
                                    Rgain=Ymax/Rav;
                                    Ggain=Ymax/Gav;
                                    Bgain=Ymax/Bav;

        7.  调整原图像:Ro= R*Rgain; Go= G*Ggain; Bo= B*Bgain;

代码如下:

 1 function autoWhiteBalanceTest
 2 clear all;
 3 close all;
 4 clc;
 5 
 6 im=imread('13.jpg');
 7 im2=im;
 8 im1=rgb2ycbcr(im);%将图片的RGB值转换成YCbCr值%
 9 Lu=im1(:,:,1);
10 Cb=im1(:,:,2);
11 Cr=im1(:,:,3);
12 [x y z]=size(im);
13 tst=zeros(x,y);
14 
15 %计算Cb、Cr的均值Mb、Mr%
16 Mb=mean(mean(Cb));
17 Mr=mean(mean(Cr));
18 
19 %计算Cb、Cr的均方差%
20 Db=sum(sum(Cb-Mb))/(x*y);
21 Dr=sum(sum(Cr-Mr))/(x*y);
22 
23 %根据阀值的要求提取出near-white区域的像素点%
24 cnt=1;    
25 for i=1:x
26     for j=1:y
27         b1=Cb(i,j)-(Mb+Db*sign(Mb));
28         b2=Cr(i,j)-(1.5*Mr+Dr*sign(Mr));
29         if (b1<abs(1.5*Db) & b2<abs(1.5*Dr))
30            Ciny(cnt)=Lu(i,j);
31            tst(i,j)=Lu(i,j);
32            cnt=cnt+1;
33         end
34     end
35 end
36 cnt=cnt-1;
37 iy=sort(Ciny,'descend');%将提取出的像素点从亮度值大的点到小的点依次排列%
38 nn=round(cnt/10);
39 Ciny2(1:nn)=iy(1:nn);%提取出near-white区域中10%的亮度值较大的像素点做参考白点%
40  
41 %提取出参考白点的RGB三信道的值% 
42 mn=min(Ciny2);
43 for i=1:x
44     for j=1:y
45         if tst(i,j)<mn
46            tst(i,j)=0;
47         else
48            tst(i,j)=1;
49         end
50     end
51 end
52 
53 R=im(:,:,1);
54 G=im(:,:,2);
55 B=im(:,:,3);
56 R=double(R).*tst;
57 G=double(G).*tst;
58 B=double(B).*tst;
59  
60 %计算参考白点的RGB的均值%
61 Rav=mean(mean(R));
62 Gav=mean(mean(G));
63 Bav=mean(mean(B));
64 Ymax=double(max(max(Lu)))/15;%计算出图片的亮度的最大值%
65  
66 %计算出RGB三信道的增益% 
67 Rgain=Ymax/Rav;
68 Ggain=Ymax/Gav;
69 Bgain=Ymax/Bav;
70 
71 %通过增益调整图片的RGB三信道%
72 im(:,:,1)=im(:,:,1)*Rgain;
73 im(:,:,2)=im(:,:,2)*Ggain;
74 im(:,:,3)=im(:,:,3)*Bgain;
75 
76 %显示图片%
77 figure,imshow(im2),title('原图');
78 figure,imshow(im),title('白平衡后的效果图');

参考地址:http://www.cnblogs.com/haar/articles/1392227.html 

     http://www.cnblogs.com/tiandsp/archive/2012/05/01/2477897.html

     白平衡是图像处理的一个极重要概念。所谓白平衡(英文名称为White Balance),就是对白色物体的还原。当我们用肉眼观看这大千世界时,在不同的光线下,对相同的颜色的感觉基本是相同的,比如在早晨旭日初升时,我们看一个白色的物体,感到它是白的;而我们在夜晚昏暗的灯光下,看到的白色物体,感到它仍然是白的。这是由于人类从出生以后的成长过程中,人的大脑已经对不同光线下的物体的彩色还原有了适应性。但是,作为拍摄设备,如数码相机,可没有人眼的适应性,在不同的光线下,由于CCD输出的不平衡性,造成数码相机彩色还原失真。一般情况下,我们习惯性地认为太阳光是白色的,已知直射日光的色温是5200K左右,白炽灯的色温是3000K左右。用传统相机的日光片拍摄时,白炽灯光由于色温太低,所以偏黄偏红。所以通常现场光线的色温低于相机设定的色温时,往往偏黄偏红,现场光线的色温高于相机设定时,就会偏蓝。

     为了解决不同色温下,引起的白色漂移现象。由于白色对色温变化的响应最大,通常用白色来作为调整的基色。通常的白平衡技术有:自动白平衡、钨光白平衡、荧光白平衡、室内白平衡、手动调节。本文仅介绍其中的一种自动白平衡。

     白平衡算法通常分为两步:白色点的检测,白色点的调整。本方法采用一个动态的阀值来检测白色点。详细算法过程为:

          1.  把图像w*h从RGB空间转换到YCrCb空间。

          2.  选择参考白色点:

                    a. 把图像分成3*4个块(块数可选)。

                    b. 对每个块,分别计算Cr,Cb的平均值Mr,Mb。

                    c. 对每个块,根据Mr,Mb,分别计算Cr,Cb的方差Dr,Db。

                    d. 判定每个块的近白区域(near-white region)。

                        判别表达式为:Cb(i, j) − (Mb + Db × sign(Mb )) < 1.5× Db && Cr(i, j) − (1.5×Mr + Dr × sign(Mr )) < 1.5× Dr

                       设一个“参考白色点”的亮度矩阵RL,大小为w*h。

                         若符合判别式,则作为“参考白色点”,并把该点(i,j)的亮度(Y分量)值赋给RL(i,j);

                         若不符合,则该点的RL(i,j)值为0。

         3.  选取参考“参考白色点”中最大的10%的亮度(Y分量)值,并选取其中的最小值Lu_min.

         4.  调整RL,若RL(i,j)<Lu_min,  RL(i,j)=0; 否则,RL(i,j)=1;

         5.  分别把R,G,B与RL相乘,得到R2,G2,B2。  分别计算R2,G2,B2的平均值,Rav,Gav,Bav;

         6.  得到调整增益:  Ymax=double(max(max(Y)))/15;
                                    Rgain=Ymax/Rav;
                                    Ggain=Ymax/Gav;
                                    Bgain=Ymax/Bav;

        7.  调整原图像:Ro= R*Rgain; Go= G*Ggain; Bo= B*Bgain;

代码如下:

 1 function autoWhiteBalanceTest
 2 clear all;
 3 close all;
 4 clc;
 5 
 6 im=imread('13.jpg');
 7 im2=im;
 8 im1=rgb2ycbcr(im);%将图片的RGB值转换成YCbCr值%
 9 Lu=im1(:,:,1);
10 Cb=im1(:,:,2);
11 Cr=im1(:,:,3);
12 [x y z]=size(im);
13 tst=zeros(x,y);
14 
15 %计算Cb、Cr的均值Mb、Mr%
16 Mb=mean(mean(Cb));
17 Mr=mean(mean(Cr));
18 
19 %计算Cb、Cr的均方差%
20 Db=sum(sum(Cb-Mb))/(x*y);
21 Dr=sum(sum(Cr-Mr))/(x*y);
22 
23 %根据阀值的要求提取出near-white区域的像素点%
24 cnt=1;    
25 for i=1:x
26     for j=1:y
27         b1=Cb(i,j)-(Mb+Db*sign(Mb));
28         b2=Cr(i,j)-(1.5*Mr+Dr*sign(Mr));
29         if (b1<abs(1.5*Db) & b2<abs(1.5*Dr))
30            Ciny(cnt)=Lu(i,j);
31            tst(i,j)=Lu(i,j);
32            cnt=cnt+1;
33         end
34     end
35 end
36 cnt=cnt-1;
37 iy=sort(Ciny,'descend');%将提取出的像素点从亮度值大的点到小的点依次排列%
38 nn=round(cnt/10);
39 Ciny2(1:nn)=iy(1:nn);%提取出near-white区域中10%的亮度值较大的像素点做参考白点%
40  
41 %提取出参考白点的RGB三信道的值% 
42 mn=min(Ciny2);
43 for i=1:x
44     for j=1:y
45         if tst(i,j)<mn
46            tst(i,j)=0;
47         else
48            tst(i,j)=1;
49         end
50     end
51 end
52 
53 R=im(:,:,1);
54 G=im(:,:,2);
55 B=im(:,:,3);
56 R=double(R).*tst;
57 G=double(G).*tst;
58 B=double(B).*tst;
59  
60 %计算参考白点的RGB的均值%
61 Rav=mean(mean(R));
62 Gav=mean(mean(G));
63 Bav=mean(mean(B));
64 Ymax=double(max(max(Lu)))/15;%计算出图片的亮度的最大值%
65  
66 %计算出RGB三信道的增益% 
67 Rgain=Ymax/Rav;
68 Ggain=Ymax/Gav;
69 Bgain=Ymax/Bav;
70 
71 %通过增益调整图片的RGB三信道%
72 im(:,:,1)=im(:,:,1)*Rgain;
73 im(:,:,2)=im(:,:,2)*Ggain;
74 im(:,:,3)=im(:,:,3)*Bgain;
75 
76 %显示图片%
77 figure,imshow(im2),title('原图');
78 figure,imshow(im),title('白平衡后的效果图');

参考地址:http://www.cnblogs.com/haar/articles/1392227.html 

     http://www.cnblogs.com/tiandsp/archive/2012/05/01/2477897.html


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap