matlab 自動閾值白平衡算法 程序可編譯實現


一種效果很好的自動白平衡技術(WhiteBalance)

     白平衡是圖像處理的一個極重要概念。所謂白平衡(英文名稱為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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM