数字图像处理 实验二:图像的平滑滤波

DIP实验2:图像的平滑滤波

实验目的

平滑的目的是减少噪声对图像的影响。掌握线性滤波中值滤波两种最典型、最常用的图像平滑方法,对输出结果加以比较、加深理解。

实验内容

1)编写并调试窗口为3×3、5×5的平滑滤波函数
(如[1 1 1; 1 1 1 ; 1 1 1]/9、[1 2 1; 2 4 2; 1 2 1]/16等)
2)编写并调试窗口为3×3、5×5的中值滤波函数
3)比较均值滤波和中值滤波的优缺点,分析窗口尺寸对滤波结果的影响。

附:可供参考的Matlab函数有imnoise、imfilter、medfilt2

输出图像排列格式如下:

含噪图像3×3标准平均5×5标准平均
3×3加权平均3×3中值滤波5×5中值滤波

参考代码

figure('NumberTitle', 'off', 'Name', '实验2:图像的平滑滤波');

OI = imread('lena.bmp');    % 原始图像读取 
NI = imnoise(OI,'salt & pepper',0.02);    % 含噪图像 Noise Image(加椒盐噪声)
W1 = ones(3)/9;    % 模版
W2 = ones(5)/9; 
W3 = [1 2 1; 2 4 2; 1 2 1] / 16;         

subplot(2,3,1);
imshow(NI);
title('含噪图像'); 

subplot(2,3,2);
Box3 = AvgFilter(NI, W1, 256, 256,  3); %3×3标准平均,调用均值滤波函数
imshow(Box3);
title('3×3标准平均');
 
subplot(2,3,3);
Box5 = AvgFilter(NI, W2, 256, 256, 5); %5×5标准平均,调用均值滤波函数
imshow(Box5);
title('5×5标准平均');

subplot(2,3,4);
Weigh3 = AvgFilter(NI, W3, 256, 256, 3); %3×3加权平均,调用加权平均函数 
imshow(Weigh3);
title('3×3加权平均');

subplot(2,3,5);
Med3 = MedFilter(NI, 256, 256, 3); %3×3中值滤波,调用中值滤波函数
imshow(Med3);
title('3×3中值滤波');

subplot(2,3,6);
Med5 = MedFilter(NI, 256, 256, 5); %5×5中值滤波,调用中值滤波函数
imshow(Med5);
title('5×5中值滤波');

% 平均滤波函数 AvgFilter
function PI = AvgFilter(NI, W, M, N, tem)
    % PI    滤波后图像矩阵
    % NI    含噪图像矩阵
    % W     模版
    % MN   含噪图像像素矩阵行、列
    % tem   均值滤波窗口大小  template
    f = zeros(M+tem-1, N+tem-1);
    % 将原图像移到f中间部分,四周仍有(tem-1)/2的边缘
    f((tem-1)/2+1:M+(tem-1)/2, (tem-1)/2+1:N+(tem-1)/2) = NI(1:M,1:N);
    % 用与边界相邻(tem-1)/2行(或列)元素的像素值将模版四周(tem-1)/2的边缘补全
    f(1:(tem-1)/2, (tem-1)/2+1:N+(tem-1)/2) = NI(1:(tem-1)/2, : ) ;     % 上侧
    f(M+(tem-1)/2:M+tem-1, (tem-1)/2+1:N+(tem-1)/2) = NI(M-(tem-1)/2:M, : );    % 下侧
    f((tem-1)/2+1:M+(tem-1)/2, 1:(tem-1)/2) = NI( : , 1:(tem-1)/2);     % 左侧
    f((tem-1)/2+1:M+(tem-1)/2, N+(tem-1)/2:N+tem-1) = NI( : , N-(tem-1)/2:N);   % 右侧
    g = zeros(M+tem-1, N+tem-1);
    Img = zeros(M, N);
    %根据公式计算出处理后g(x,y)的像素值
     for x=(tem-1)/2+1 : M+(tem-1)/2
        for y=(tem-1)/2+1 : N+(tem-1)/2
            for s=-(tem-1)/2:(tem-1)/2
                for t=-(tem-1)/2:(tem-1)/2
                    g(x, y) = g(x, y) + f(x+s, y+t) * W(s+(tem+1)/2,t+(tem+1)/2);
                end
            end
        end
     end
    Img(1:M,1:N) = g((tem-1)/2+1:M+(tem-1)/2, (tem-1)/2+1:N+(tem-1)/2);   
    PI = mat2gray(Img);
end

% 中值滤波函数 MedFilter
function PI = MedFilter(NI, M, N, tem)
    % PI    滤波后图像矩阵
    % NI    含噪图像矩阵
    % MN     含噪图像像素矩阵行、列
    % tem      均值滤波窗口大小  template
    f = zeros(M+tem-1, N+tem-1);
    % 将原图像移到f中间部分,四周仍有(tem-1)/2的边缘
    f((tem-1)/2+1:M+(tem-1)/2, (tem-1)/2+1:N+(tem-1)/2) = NI(1:M,1:N);
    % 用与边界相邻(tem-1)/2行(或列)元素的像素值将模版四周(tem-1)/2的边缘补全
    f(1:(tem-1)/2, (tem-1)/2+1:N+(tem-1)/2) = NI(1:(tem-1)/2, : );    % 上侧
    f(M+(tem-1)/2:M+tem-1, (tem-1)/2+1:N+(tem-1)/2) = NI(M-(tem-1)/2:M, : );    % 下侧
    f((tem-1)/2+1:M+(tem-1)/2, 1:(tem-1)/2) = NI( : , 1:(tem-1)/2);     % 左侧
    f((tem-1)/2+1:M+(tem-1)/2, N+(tem-1)/2:N+tem-1) = NI( : , N-(tem-1)/2:N);    % 右侧
    g = zeros(M+tem-1, N+tem-1);
    Img = zeros(M, N);
    for x=(tem-1)/2+1 : M+(tem-1)/2
        for y=(tem-1)/2+1 : N+(tem-1)/2
            tr = 1;
            for s=-(tem-1)/2:(tem-1)/2
                for t=-(tem-1)/2:(tem-1)/2
                    A(tr) = f(x+s, y+t);    % 未能使用中值函数,将二维数组变换为一维的
                    tr = tr + 1;
                end
            end
            g(x,y) = Median(A, tem);    % 调用中值函数
        end
     end
Img(1:M,1:N) = g((tem-1)/2+1:M+(tem-1)/2, (tem-1)/2+1:N+(tem-1)/2);   
PI = mat2gray(Img);
end

% 计算中值函数 Median
% 采用冒泡排序方法将窗口像素值从小到大排列,返回中间像素值
function mid = Median(mat, tem)
    % mid      排序后的中值
    % mat      待排序窗口(一个矩阵)
    % tem      窗口大小(变长)
    % 冒泡排序
    for p = 1 : (tem * tem)
        for q = p : (tem * tem)
            if mat(q) < mat(p)
            	t = mat(q);
                mat(q) = mat(p);
                mat(p) = t;
            end
        end
    end
    mid = mat(( tem * tem + 1) / 2);
end

实验结果

图像的平滑滤波

  • 1
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值