中值滤波

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('自适应中值滤波效果图');







 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值