数字图像处理 实验二:图像的平滑滤波
基于Matlab的图像的平滑滤波
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 模版
% M、N 含噪图像像素矩阵行、列
% 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 含噪图像矩阵
% M、N 含噪图像像素矩阵行、列
% 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