【实践】数字图像处理DIP课程课业打卡实验3 图像噪声去除


叮嘟!这里是小啊呜的学习课程资料整理。好记性不如烂笔头,今天也是努力进步的一天。一起加油进阶吧!
在这里插入图片描述

一、实验目的

1、掌握基于均值平滑操作的信号去噪方法的基本原理(适用于一维或二维信号的情况)。了解加性噪声和乘性噪声各自的特点。
2、掌握均值滤波器的工作原理和算法实现。
3、掌握中值滤波器的工作原理和算法实现。
4、理解边界保持类滤波器的工作原理。
5、掌握KNN(K近邻平滑滤波器)、SNN(对称近邻平滑滤波器)的算法思想及代码实现。

二、实验内容

1、调用matlab自带函数imnoise、medfilt2、filter2实现如下功能:

(1)生成含有高斯噪声、椒盐噪声的图像

(2)使用均值滤波分别对高斯噪声、椒盐噪声的图像进行滤波。

(3)使用中值滤波分别对高斯噪声、椒盐噪声的图像进行滤波。

(1)	生成含有高斯噪声、椒盐噪声的图像
(2)	使用均值滤波分别对高斯噪声、椒盐噪声的图像进行滤波。
(3)	使用中值滤波分别对高斯噪声、椒盐噪声的图像进行滤波。
% 1)生成含有高斯噪声、椒盐噪声的图像
im = imread('im\cameraman.tif');
im_noise_salt = imnoise(im,'salt & pepper'); % 加入椒盐噪声
im_noise_gaussian = imnoise(im,'gaussian'); % 加入高斯噪声
figure;
subplot(131),imshow(im);title('原图');
subplot(132),imshow(im_noise_salt);title('加入椒盐噪声后的图像');
subplot(133),imshow(im_noise_gaussian);title('加入高斯噪声后的图像');

% 2)使用均值滤波分别对高斯噪声、椒盐噪声的图像进行滤波
n=1; m=2*n+1;
A = fspecial('average',m); % 生成系统自带3×3滤波器
im_filtered1 = filter2(A,im_noise_salt);
im_filtered2 = filter2(A,im_noise_gaussian);
figure;
subplot(321),imshow(im_noise_salt);title('加入椒盐噪声后的图像');
subplot(322),imshow(im_noise_gaussian);title('加入高斯噪声后的图像');
subplot(323),imshow(uint8(im_filtered1));title('椒盐噪声图像进行均值滤波后的图像');
subplot(324),imshow(uint8(im_filtered2));title('高斯噪声图像进行均值滤波后的图像');

% 3)使用中值滤波分别对高斯噪声、椒盐噪声的图像进行滤波
n1 = 2; m1 = 2*n1+1;
n2 = 2; m2 = 2*n2+1;

im_filtered11 = medfilt2(im_noise_salt,[m1,m2]);
im_filtered22 = medfilt2(im_noise_gaussian,[m1,m2]);
subplot(325),imshow(im_filtered11);title('椒盐噪声图像进行中值滤波后的图像');
subplot(326),imshow(im_filtered22);title('高斯噪声图像进行中值滤波后的图像');


在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

2、实现KNN(K近邻平滑滤波器)的代码。

要求:
算法实现为函数[im]=KNN_denoise (I,K,N),其中I为读入的图像矩阵;K为最近邻个数,N为模板大小参数(N*N)。

测试代码如下:

im=imread('im\cameraman.tif');   
im_noise=imnoise(im,'salt & pepper');  %加入椒盐噪声
figure,imshow(im_noise),title('加入椒盐噪声图象'); 
N = 7; K=25;
[im_filered]=KNNFilter(im_noise,N,K);

(代码复制到此处)

% im=imread('im\cameraman.tif');  %%mandi.tif'); 
% im=imread('im\cameraman.tif');   
% im_noise=imnoise(im,'salt & pepper');  %加入椒盐噪声
% figure,imshow(im_noise),title('加入椒盐噪声图象'); 
% N = 7; K=25;
% [im_filered]=KNNFilter(im_noise,N,K);

function [im_filered]=KNNFilter(im_noise,N,K)

[h,l,c]=size(im_noise);
Y=zeros(h,1);
n=floor(N/2);
im=double(im_noise);
mid=floor((N*N)/2)+1;
for i=n+1:h-n
    for j=n+1:l-n
        block=im(i-n:i+n,j-n:j+n);
        block_delt=abs(block-im(i,j));
        block_delt_inline=block-im(i,j);
        block_delt_inline(mid)=[];
        [tempSort,Ind]=sort(block_delt_inline);
        block_inline=block(:);
        block_inline(mid)=[];
        KNNS=block_inline(Ind(1:K));
        Y(i,j)=mean(KNNS);
    end
end

im_filered=uint8(Y);
figure,imshow(im_filered),title('KNN滤波图像');    %%显示滤波后图像
end

在这里插入图片描述

3、实现SNN(对称近邻平滑滤波器)的代码。

要求:
算法实现为函数[im]=SNN_denoise (I,N),其中I为读入的图像矩阵; N为模板大小参数(正方形模板,边长为:2*N+1)。

测试代码如下:

im=imread('im\cameraman.tif');  %%mandi.tif'); 
im_noise=imnoise(im,'salt & pepper');  %加入椒盐噪声
figure,imshow(im_noise),title('加入噪声之后的图象');  
[im_filered]=SNNFilter(im_noise,2);
figure,imshow(im_filered),title('SNN滤波图像'); %显示滤波后的图象

(代码复制到此处)

% im_noise=imnoise(im,'salt & pepper');  %加入椒盐噪声
% figure,imshow(im_noise),title('加入噪声之后的图象');  
% [im_filered]=SNNFilter(im_noise,2);
% figure,imshow(im_filered),title('SNN滤波图像'); %显示滤波后的图象


function [im_filered]=SNNFilter(im_noise,n);
[h,l,c]=size(im_noise);
Y=zeros(h,l);

for i=n+1:h-n
    for j=n+1:l-n
        temp=[];    %每处理一点
        for row=i-n:i+n
            for col=j-n:j+n
                a0=double(im_noise(i,j));
                a1=double(im_noise(row,col));
                a2=double(im_noise(2*i-row,2*j-col));
                if(abs(a1-a0)>abs(a2-a0))
                    selected_a=a2;
                else
                    selected_a=a1;
                end
                
                if~(row==i && col==j)
                    temp=[temp,selected_a];
                end
            end
        end
        Y(i,j) = mean(temp);
    end  
end
 im_filered = uint8(Y);
end

在这里插入图片描述

Ending!
更多课程知识学习记录随后再来吧!

就酱,嘎啦!

在这里插入图片描述

注:
人生在勤,不索何获。

猜你喜欢

转载自blog.csdn.net/qq_43543789/article/details/106764735
今日推荐