clear all; close all; clc; im=imread('2.png'); 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); %計算Cb、Cr的均值Mb、Mr% Mb=mean(mean(Cb)); Mr=mean(mean(Cr)); %計算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; iy=sort(Ciny,'descend');%將提取出的像素點從亮度值大的點到小的點依次排列% nn=round(cnt/10); Ciny2(1:nn)=iy(1:nn);%提取出near-white區域中10%的亮度值較大的像素點做參考白點% %提取出參考白點的RGB三信道的值% mn=min(Ciny2); for i=1:x for j=1:y if tst(i,j)<mn tst(i,j)=0; else tst(i,j)=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; %顯示圖片% figure,imshow(im2,[]),title('原圖'); figure,imshow(im,[]),title('白平衡后的效果圖');
別人的程序。
參考: