動態閥值法

轉自:https://www.cnblogs.com/tiandsp/archive/2012/05/01/2477897.html

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('白平衡後的效果圖');
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章