自动白平衡算法(matlab)
clear
clc
im=imread('box.jfif');
im1=rgb2ycbcr(im);
Lu=im1(:,:,1);
Cb=im1(:,:,2);
Cr=im1(:,:,3);
%第一块
I1=im1(1:size(im,1)/2,1:size(im,2)/2,:);
[x,y,~]=size(I1);
[Mb1,Mr1,Db1,Dr1]=test(I1,Cb,Cr,x,y);
%第二块
I2=im1(size(im,1)/2:size(im,1),1:size(im,2)/2,:);
[x,y,~]=size(I2);
[Mb2,Mr2,Db2,Dr2]=test(I2,Cb,Cr,x,y);
%第三块
I3=im1(1:size(im,1)/2,size(im,2)/2:size(im,2),:);
[x,y,~]=size(I3);
[Mb3,Mr3,Db3,Dr3]=test(I3,Cb,Cr,x,y);
%第四块
I4=im1(size(im,1)/2:size(im,1),size(im,2)/2:size(im,2),:);
[x,y,~]=size(I4);
[Mb4,Mr4,Db4,Dr4]=test(I4,Cb,Cr,x,y);
Mr=(Mr1+Mr3+Mr4)/3;
Mb=(Mb1+Mb3+Mb4)/3;
Dr=(Dr1+Dr3+Dr4)/3;
Db=(Db1+Db3+Db4)/3;
[x,y,z]=size(im);
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
sumsort=sort(Ciny,'descend');%将提取出的像素点从亮度值大的点到小的点依次排列%
count=round(size(sumsort,2)/10);
Ciny2(1:count)=sumsort(1:count);
mn=min(Ciny2);
index=Lu>mn;
R=im(:,:,1);
G=im(:,:,2);
B=im(:,:,3);
Rave=mean(mean(R(Lu>mn)));
Gave=mean(mean(G(Lu>mn)));
Bave=mean(mean(B(Lu>mn)));
Ymax=max(max(Lu));
%求增益
Rgain=double(Ymax)/double(Rave);
Ggain=double(Ymax)/double(Gave);
Bgain=double(Ymax)/double(Bave);
R=R*Rgain;
G=G*Ggain;
B=B*Bgain;
I3=cat(3,R,G,B);
imshow([im I3]);
function [Mb,Mr,Db,Dr]=test(I,Cb,Cr,x,y)
Cb=I(:,:,2);
Cr=I(:,:,3);
Mb=mean(mean(Cb));
Mr=mean(mean(Cr));
Db=sum(sum(Cb-Mb))/(x*y);
Dr=sum(sum(Cr-Mr))/(x*y);
end
左原图右白平衡后图像
自己写的转载请备注。