本实验所采用的空间滤波方法是平滑滤波,下图是两个3*3平滑(均值)滤波器模板,对图像进行平滑处理。
平滑线性空间滤波器的输出响应是包含在滤波器模板邻域内的像素的简单平均值。平滑滤波器多用于模糊处理和降低噪声。
第一个滤波器产生模板下方的标准像素平均值。其中第二个模板更为重要,它产生加权平均,是指使用不同的系数乘以像素,即一些像素的重要性(权重)比另一些像素的重要性大。
因此,一幅M×N的图像经过一个大小为m×n(m和n是奇数)的加权均值滤波器滤波的过程可由下式给出:
即一幅完全滤波的图像是通过对x=0,1,2,…,M-1和y=0,1,2,…N-1执行上式得到的。
部分程序如下:
clc %清除命令窗口的内容
close all %关闭所有的Figure窗口
clear all %清除工作空间的所有变量
%% 使用上述函数实现图像的平滑滤波,其中使用的模板为本文所提及的模板
A=imread('Fig0338(a)(blurry_moon).tif');
figure;
imshow(A);
title('Fig.3.38(a)的原图像');
B=1/9*ones(3);%3*3平滑滤波器模板1
C=1/16*[1 2 1;2 4 2;1 2 1];%3*3平滑滤波器模板2
figure;
subplot(1,2,1);
m=smoothfilter(A,B);%调用平滑滤波函数
imshow(m);
title('平滑滤波器模板1处理后的图像');
subplot(1,2,2);
n=smoothfilter(A,C);%调用平滑滤波函数
imshow(n);
title('平滑滤波器模板2处理后的图像');
%% 平滑线性滤波函数(空间滤波)
function output = smoothfilter(input,M)
input=im2double(input);
if ndims(input)==2 %判断图像维度是否为2
[a , b] = size(input); % 获取图像的尺寸及行列值,并存放在矩阵[a,b]
output =zeros(a , b);
for i = 2:a-1
for j = 2:b-1
output(i,j) = M(1,1)*input(i-1,j-1) + M(1,2)* input(i-1,j) + M(1,3)* input(i-1,j+1) + M(2,1) *input(i,j-1)+...
M(2,2)* input(i,j) + M(2,3)*input(i,j+1) + M(3,1) *input(i+1,j-1) + M(3,2)*input(i+1,j) + M(3,3)*input(i+1,j+1);
end
end
elseif ndims(input)==3
[a , b ,z ] = size(input);
output =zeros(a , b ,z); %此平滑滤波处理后的图像存放在此矩阵
for k=1 : z
for i = 2:a-1
for j = 2:b-1
output(i,j,k) = M(1,1)*input(i-1,j-1,k) + M(1,2)* input(i-1,j,k) + M(1,3)* input(i-1,j+1,k) + M(2,1) *input(i,j-1,k)+...
M(2,2)* input(i,j,k) + M(2,3)*input(i,j+1,k) + M(3,1) *input(i+1,j-1,k) + M(3,2)*input(i+1,j,k) + M(3,3)*input(i+1,j+1,k);
end
end
end
end
实验结果: