去红眼不完善 MATLAB 代码

[FileName,PathName] = uigetfile('*.jpg');

imgdata = imread(FileName);

rgb = imgdata;

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

rgb = im2double(rgb);

r = rgb(:,:,1);

g = rgb(:,:,2);

b = rgb(:,:,3);

num = 0.5*( (r - g) + ( r - b ) );

den = sqrt( (r - g).^2 + (r-b).*(g-b) );

theta = acos(num ./ (den + eps));

H=theta;

H(b>g)=2*pi-H(b>g);

H=H/(2*pi);

num=min(min(r,g),b);

den=r+g+b;

den(den==0)=eps;

S=1-3.*num./den;

H(S==0)=0;

I=(r+g+b)/3;

%Combine all three results into an hsi image.

[width,height] = size(rgb);

height = height/3;

for i=1:width

    for j = 1:height

        h = H(i,j);

        s = S(i,j);

        if s>0.3

            if h < 3.1415926/4

                if h > -3.1415926/4

                    S(i,j,:) = 0;

                end

            end

                  %  rgb11(i,j,:) = I(i,j);

            

        end

        

    end

end

hsi=cat(3,H,S,I);

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

H=hsi(:,:,1)*2*pi;

S=hsi(:,:,2);

I=hsi(:,:,3);

%Implement the conversion equations.

R=zeros(size(hsi,1),size(hsi,2));

G=zeros(size(hsi,1),size(hsi,2));

B=zeros(size(hsi,1),size(hsi,2));

% RG sector (0<=H<2*pi/3).

idx=find((0<=H)&(H<2*pi/3));

B(idx)=I(idx).*(1-S(idx));

R(idx)=I(idx).*(1+S(idx).*cos(H(idx))./cos(pi/3-H(idx)));

G(idx)=3*I(idx)-(R(idx)+B(idx));

%BG sector (2*pi/3<=H<4*pi/3).

idx=find((2*pi/3<=H)&(H<4*pi/3));

R(idx)=I(idx).*(1-S(idx));

G(idx)=I(idx).*(1+S(idx).*cos(H(idx)-2*pi/3)./cos(pi-H(idx)));

B(idx)=3*I(idx)-(R(idx)+G(idx));

%BR sector.

idx=find((4*pi/3<=H)&(H<=2*pi));

G(idx)=I(idx).*(1-S(idx));

B(idx)=I(idx).*(1+S(idx).*cos(H(idx)-4*pi/3)./cos(5*pi/3-H(idx)));

R(idx)=3*I(idx)-(G(idx)+B(idx));

%Combine all three results into an RGB image. Clip to [0,1] to compensate for floating-point arithmetic rounding effects.

rgb=cat(3,R,G,B);

rgb=max(min(rgb,1),0);

rgb11 = rgb;

imshow(rgb11);

figure(1);

imshow(H);

figure(2);

imshow(I);

figure(3);

imshow(S);

原文地址:https://www.cnblogs.com/signal/p/2435941.html