visible Image Denoise
The denoise.m:
clc
clear;
I=imread('img70.jpg');
%I=rgb2gray(I);
figure(1),imshow(I),title('源图像');
%I1=imnoise(I,'salt & pepper',0.3); %添加椒盐脉冲噪声
%figure(2),imshow(I1);title('加入强度为0.3的脉冲噪声');
for counter=1:3
I1=I(:,:,counter);
figure(2+(counter-1)*7),imshow(I1),title(['通道图',num2str(counter)])
% %常规中值滤波
Ic=medfilt2(I1);
figure(3+(counter-1)*7),imshow(Ic);title('常规中值滤波效果图');
Temp=zeros(3,3);
% 开关中值滤波就是区分噪声点和非噪声点,作为一个开关
Ik=I1;
[m,n]=size(I1);
for i=2:m-1
for j=2:n-1
if Ik(i,j)==255 || Ik(i,j)==0
Temp = Ik(i-1:i+1,j-1:j+1);
Ts = sort(Temp(:));
Ik(i,j) = Ts(5);
end
end
end
figure(4+counter*7),imshow(Ik);title('开关中值滤波效果图');
%
% %极值中值滤波就是判断某点是否是该区域的极大极小值点,区分噪声和非噪声
Ij=I1;
for i=2:m-1
for j=2:n-1
Temp = Ij(i-1:i+1,j-1:j+1);
Ts = sort(Temp(:));
if Ij(i,j)==Ts(1) || Ij(i,j)==Ts(9)
Ij(i,j)=Ts(5);
end
end
end
figure(5+(counter-1)*7),imshow(Ij);title('极值中值滤波效果图');
%加权中值滤波,权值的大小待定
Iq=I1;
w=[1 2 3 4 5 4 3 2 1 ];
for i=2:m-1
for j=2:n-1
Temp = Iq(i-1:i+1,j-1:j+1);
T=Temp(:);
Ts=double(T').*w;
[Tv,ind] = sort(Ts);
Iq(i,j)=T(ind(5));
end
end
figure(6+(counter-1)*7),imshow(Iq);title('加权中值滤波效果图');
Iz=I1;
w=[1 2 3 4 5 4 3 2 1 ];
for i=2:m-1
for j=2:n-1
% clear Temp ;
% clear T;
k=0;
Temp = Iz(i-1:i+1,j-1:j+1);
T=Temp;
while 1
[Tv,ind] = sort(double(T(:)));
zmin=Tv(1);
zmax=Tv(9);
zmed=Tv(5);
zxy=double(Iz(i,j));
a1=zmed-zmin;
a2=zmed-zmax;
if a1>0 & a2<0
b1=zxy-zmin;
b2=zxy-zmax;
if b1>0 & b2<0
Iz(i,j)=zxy;
else
Iz(i,j)=zmed;
end
break;
else
k=k+2;
if i-(1+k)<1 || j-(1+k)<1 || i+(1+k)>m || j+(1+k)>n
Iz(i,j)=zxy;
break;
else
T=Iz(i-(1+k):i+(1+k),j-(1+k):j+(1+k));
if k>5
Iz(i,j)=zxy;
break;
end
end
end
end
end
end
figure(7+(counter-1)*7),imshow(Iz);title('自适应中值滤波效果图');
end
clc
clear;
I=imread('放大.jpg');
figure(1),imshow(I),title('源图像');
I=imnoise(I,'salt & pepper',0.3); %添加椒盐脉冲噪声
figure(2),imshow(I);title('加入强度为0.3的脉冲噪声');
I1=I(:,:,1);
I2=I(:,:,2);
I3=I(:,:,3);
[m,n]=size(I1);
Temp=zeros(3,3);
% %常规中值滤波
I1c=medfilt2(I1);
I2c=medfilt2(I2);
I3c=medfilt2(I3);
RGB(:,:,1)=I1c;
RGB(:,:,2)=I2c;
RGB(:,:,3)=I3c;
figure(3);imshow(RGB);title('常规中值滤波');
% %极值中值滤波就是判断某点是否是该区域的极大极小值点,区分噪声和非噪声
Ij=I1;
for i=2:m-1
for j=2:n-1
Temp = Ij(i-1:i+1,j-1:j+1);
Ts = sort(Temp(:));
if Ij(i,j)==Ts(1) || Ij(i,j)==Ts(9)
Ij(i,j)=Ts(5);
end
end
end
Ij1=Ij;
Ij=I2;
for i=2:m-1
for j=2:n-1
Temp = Ij(i-1:i+1,j-1:j+1);
Ts = sort(Temp(:));
if Ij(i,j)==Ts(1) || Ij(i,j)==Ts(9)
Ij(i,j)=Ts(5);
end
end
end
Ij2=Ij;
Ij=I3;
for i=2:m-1
for j=2:n-1
Temp = Ij(i-1:i+1,j-1:j+1);
Ts = sort(Temp(:));
if Ij(i,j)==Ts(1) || Ij(i,j)==Ts(9)
Ij(i,j)=Ts(5);
end
end
end
Ij3=Ij;
RGB(:,:,1)=Ij1;
RGB(:,:,2)=Ij2;
RGB(:,:,3)=Ij3;
figure(4);imshow(RGB);title('极值中值滤波');
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
Iz=I1;
w=[1 2 3 4 5 4 3 2 1 ];
for i=2:m-1
for j=2:n-1
% clear Temp ;
% clear T;
k=0;
Temp = Iz(i-1:i+1,j-1:j+1);
T=Temp;
while 1
[Tv,ind] = sort(double(T(:)));
zmin=Tv(1);
zmax=Tv(9);
zmed=Tv(5);
zxy=double(Iz(i,j));
a1=zmed-zmin;
a2=zmed-zmax;
if a1>0 && a2<0
b1=zxy-zmin;
b2=zxy-zmax;
if b1>0 && b2<0
Iz(i,j)=zxy;
else
Iz(i,j)=zmed;
end
break;
else
k=k+2;
if i-(1+k)<1 || j-(1+k)<1 || i+(1+k)>m || j+(1+k)>n
Iz(i,j)=zxy;
break;
else
T=Iz(i-(1+k):i+(1+k),j-(1+k):j+(1+k));
if k>5
Iz(i,j)=zxy;
break;
end
end
end
end
end
end
RGB(:,:,1)=Iz;
Iz=I2;
w=[1 2 3 4 5 4 3 2 1 ];
for i=2:m-1
for j=2:n-1
% clear Temp ;
% clear T;
k=0;
Temp = Iz(i-1:i+1,j-1:j+1);
T=Temp;
while 1
[Tv,ind] = sort(double(T(:)));
zmin=Tv(1);
zmax=Tv(9);
zmed=Tv(5);
zxy=double(Iz(i,j));
a1=zmed-zmin;
a2=zmed-zmax;
if a1>0 && a2<0
b1=zxy-zmin;
b2=zxy-zmax;
if b1>0 && b2<0
Iz(i,j)=zxy;
else
Iz(i,j)=zmed;
end
break;
else
k=k+2;
if i-(1+k)<1 || j-(1+k)<1 || i+(1+k)>m || j+(1+k)>n
Iz(i,j)=zxy;
break;
else
T=Iz(i-(1+k):i+(1+k),j-(1+k):j+(1+k));
if k>5
Iz(i,j)=zxy;
break;
end
end
end
end
end
end
RGB(:,:,2)=Iz;
Iz=I3;
w=[1 2 3 4 5 4 3 2 1 ];
for i=2:m-1
for j=2:n-1
% clear Temp ;
% clear T;
k=0;
Temp = Iz(i-1:i+1,j-1:j+1);
T=Temp;
while 1
[Tv,ind] = sort(double(T(:)));
zmin=Tv(1);
zmax=Tv(9);
zmed=Tv(5);
zxy=double(Iz(i,j));
a1=zmed-zmin;
a2=zmed-zmax;
if a1>0 && a2<0
b1=zxy-zmin;
b2=zxy-zmax;
if b1>0 && b2<0
Iz(i,j)=zxy;
else
Iz(i,j)=zmed;
end
break;
else
k=k+2;
if i-(1+k)<1 || j-(1+k)<1 || i+(1+k)>m || j+(1+k)>n
Iz(i,j)=zxy;
break;
else
T=Iz(i-(1+k):i+(1+k),j-(1+k):j+(1+k));
if k>5
Iz(i,j)=zxy;
break;
end
end
end
end
end
end
RGB(:,:,3)=Iz;
figure(5),imshow(RGB);title('自适应中值滤波效果图');