image = imread('D:\合影11.jpg');
figure,imshow(image);
red = double(image(:,:,1));
green = double(image(:,:,2));
blue = double(image(:,:,3));
[m n]=size(red);
Y = zeros(m,n);
Cb = zeros(m,n);
Cr = zeros(m,n);
I = zeros(m,n);
Q = zeros(m,n);
red_gama = zeros(m,n);
green_gama = zeros(m,n);
blue_gama = zeros(m,n);
for i=1:m %gamma矫正
for j=1:n
if red(i,j)>0 && red(i,j)<90
fai=pi*red(i,j)/180;
gama=1+0.5*cos(fai);
red_gama(i,j)=255*(red(i,j)/255)^(1/gama);
elseif red(i,j)>=90 && red(i,j)<=170
fai=pi/2;
gama=1+0.5*cos(fai);
red_gama(i,j)=255*(red(i,j)/255)^(1/gama);
elseif red(i,j)>170 && red(i,j)<=255
fai=pi-pi*(255-red(i,j))/170;
gama=1+0.5*cos(fai);
red_gama(i,j)=255*(red(i,j)/255)^(1/gama);
end
if green(i,j)>0 && green(i,j)<90
fai=pi*green(i,j)/180;
gama=1+0.5*cos(fai);
green_gama(i,j)=255*(green(i,j)/255)^(1/gama);
elseif green(i,j)>=90 && green(i,j)<=170
fai=pi/2;
gama=1+0.5*cos(fai);
green_gama(i,j)=255*(green(i,j)/255)^(1/gama);
elseif green(i,j)>170 && green(i,j)<=255
fai=pi-pi*(255-green(i,j))/170;
gama=1+0.5*cos(fai);
green_gama(i,j)=255*(green(i,j)/255)^(1/gama);
end
if blue(i,j)>0 && blue(i,j)<90
fai=pi*blue(i,j)/180;
gama=1+0.5*cos(fai);
blue_gama(i,j)=255*(blue(i,j)/255)^(1/gama);
elseif blue(i,j)>=90 && blue(i,j)<=170
fai=pi/2;
gama=1+0.5*cos(fai);
blue_gama(i,j)=255*(blue(i,j)/255)^(1/gama);
elseif blue(i,j)>170 && blue(i,j)<=255
fai=pi-pi*(255-blue(i,j))/170;
gama=1+0.5*cos(fai);
blue_gama(i,j)=255*(blue(i,j)/255)^(1/gama);
end
end
end
for i=1:m
for j=1:n
Y(i,j)=0.2989*red_gama(i,j)+0.5866*green_gama(i,j)+0.1145*blue_gama(i,j);
Cb(i,j)=-0.1688*red_gama(i,j)-0.3312*green_gama(i,j)+0.5000*blue_gama(i,j);
Cr(i,j)=0.5000*red_gama(i,j)-0.4184*green_gama(i,j)-0.0817*blue_gama(i,j);
end
end
emp=zeros(m,n);
sita=zeros(m,n);
for i=1:m
for j=1:n
if Cr(i,j)>0 &&Cb(i,j)>0
sita(i,j)=atan(abs(Cr(i,j))/abs(Cb(i,j)))*180/pi;
elseif Cr(i,j)>0 &&Cb(i,j)<0
sita(i,j)=180-atan(abs(Cr(i,j))/abs(Cb(i,j)))*180/pi;
elseif Cr(i,j)<0 &&Cb(i,j)<0
sita(i,j)=180 + atan(abs(Cr(i,j))/abs(Cb(i,j)))*180/pi;
else
sita(i,j)=0;
end
end
end
for i=1:m
for j=1:n
if sita(i,j)>105 &&sita(i,j)<150
emp(i,j)=sita(i,j);
else
emp(i,j)=0;
Y(i,j)=0;
end
end
end
figure,imshow(emp);
figure,imshow(uint8(Y));