图像的空间滤波
空间域是指图像平面本身、包含图像像素的平面。空间域图像处理是指直接对图像中的像素进行操作。
线性空间滤波器也称为模板、卷积模板、卷积核。
均值滤波
均值滤波器,也称为线性平滑滤波器,其输出是包含在滤波器模板邻域内的像素灰度的平均值。可用于(1)降低噪声;(2)伪轮廓效应的平滑处理;(3)去除图像中的不相关细节。
中值滤波
中值滤波器对处理脉冲噪声(椒盐噪声)非常有效,但是对一些细节多,特别是点、线、尖顶的图像不宜采用中值滤波。
MATLAB程序
MATLAB程序演示了对于含有椒盐噪声的图像,进行中值滤波和均值滤波处理。
clc
clear
close all
picture=imread('test.jpg');
% 读取原始图像的R、G、B值
picture_r=picture(:,:,1);
picture_g=picture(:,:,2);
picture_b=picture(:,:,3);
[M,N,C]=size(picture);
figure;
imshow(picture);
title('原始图像');
%% 加椒盐噪声
Noise_picture=imnoise(picture,'salt & pepper',0.1);% 噪声密度0.1
Noise_picture_r=Noise_picture(:,:,1);
Noise_picture_g=Noise_picture(:,:,2);
Noise_picture_b=Noise_picture(:,:,3);
figure;
imshow(Noise_picture);
title('加椒盐噪声');
%% 中值滤波
Mid_Filtered_picture=uint8(zeros(M,N,C));
pixel=zeros(1,9);
for k=1:3 % RGB三通道
for i=1:M
for j=1:N
if(i>1 && i<M && j>1 && j<N) % 中间部分
pixel(1:3) = Noise_picture(i-1:i+1, j-1, k);
pixel(4:6) = Noise_picture(i-1:i+1, j , k);
pixel(7:9) = Noise_picture(i-1:i+1, j+1, k);
pixel=sort(pixel);
Mid_Filtered_picture(i,j,k)=pixel(5);
elseif(i==1 && j>1 && j<N) % 第一行中间部分
pixel(1:2) = Noise_picture(i:i+1, j-1, k);
pixel(3:4) = Noise_picture(i:i+1, j , k);
pixel(5:6) = Noise_picture(i:i+1, j+1, k);
pixel=sort(pixel(1:5));
Mid_Filtered_picture(i,j,k)=pixel(3);
elseif(i==M && j>1 && j<N) % 最后一行中间部分
pixel(1:2) = Noise_picture(i-1:i, j-1, k);
pixel(3:4) = Noise_picture(i-1:i, j , k);
pixel(5:6) = Noise_picture(i-1:i, j+1, k);
pixel=sort(pixel(1:5));
Mid_Filtered_picture(i,j,k)=pixel(3);
elseif(j==1 && i>1 && i<M) % 第一列中间部分
pixel(1:3) = Noise_picture(i-1:i+1, j , k);
pixel(4:6) = Noise_picture(i-1:i+1, j+1, k);
pixel=sort(pixel(1:5));
Mid_Filtered_picture(i,j,k)=pixel(3);
elseif(j==N && i>1 && i<M) % 最后一列中间部分
pixel(1:3) = Noise_picture(i-1:i+1, j-1, k);
pixel(4:6) = Noise_picture(i-1:i+1, j , k);
pixel=sort(pixel(1:5));
Mid_Filtered_picture(i,j,k)=pixel(3);
elseif(i==1 && j==1) % 左上角
pixel(1:2) = Noise_picture(i:i+1, j , k);
pixel(3:4) = Noise_picture(i:i+1, j+1, k);
pixel=sort(pixel(1:4));
Mid_Filtered_picture(i,j,k)=pixel(2);
elseif(i==1 && j==N) % 右上角
pixel(1:2) = Noise_picture(i:i+1, j-1, k);
pixel(3:4) = Noise_picture(i:i+1, j , k);
pixel=sort(pixel(1:4));
Mid_Filtered_picture(i,j,k)=pixel(2);
elseif(i==M && j==N) % 右下角
pixel(1:2) = Noise_picture(i-1:i, j-1, k);
pixel(3:4) = Noise_picture(i-1:i, j , k);
pixel=sort(pixel(1:4));
Mid_Filtered_picture(i,j,k)=pixel(2);
elseif(i==M && j==1) % 左下角
pixel(1:2) = Noise_picture(i-1:i, j , k);
pixel(3:4) = Noise_picture(i-1:i, j+1, k);
pixel=sort(pixel(1:4));
Mid_Filtered_picture(i,j,k)=pixel(2);
end
end
end
end
figure;
imshow(Mid_Filtered_picture);
title('中值滤波');
%% 均值滤波
Average_Filtered_picture=uint8(zeros(M,N,C));
pixel=zeros(1,9);
mean_amp=0;
for k=1:3 % RGB三通道
for i=1:M
for j=1:N
if(i>1 && i<M && j>1 && j<N) % 中间部分
pixel(1:3) = Noise_picture(i-1:i+1, j-1, k);
pixel(4:6) = Noise_picture(i-1:i+1, j , k);
pixel(7:9) = Noise_picture(i-1:i+1, j+1, k);
mean_amp=mean(pixel);
Average_Filtered_picture(i,j,k)=mean_amp;
elseif(i==1 && j>1 && j<N) % 第一行中间部分
pixel(1:2) = Noise_picture(i:i+1, j-1, k);
pixel(3:4) = Noise_picture(i:i+1, j , k);
pixel(5:6) = Noise_picture(i:i+1, j+1, k);
mean_amp=mean(pixel(1:5));
Average_Filtered_picture(i,j,k)=mean_amp;
elseif(i==M && j>1 && j<N) % 最后一行中间部分
pixel(1:2) = Noise_picture(i-1:i, j-1, k);
pixel(3:4) = Noise_picture(i-1:i, j , k);
pixel(5:6) = Noise_picture(i-1:i, j+1, k);
mean_amp=mean(pixel(1:5));
Average_Filtered_picture(i,j,k)=mean_amp;
elseif(j==1 && i>1 && i<M) % 第一列中间部分
pixel(1:3) = Noise_picture(i-1:i+1, j , k);
pixel(4:6) = Noise_picture(i-1:i+1, j+1, k);
mean_amp=mean(pixel(1:5));
Average_Filtered_picture(i,j,k)=mean_amp;
elseif(j==N && i>1 && i<M) % 最后一列中间部分
pixel(1:3) = Noise_picture(i-1:i+1, j-1, k);
pixel(4:6) = Noise_picture(i-1:i+1, j , k);
mean_amp=mean(pixel(1:5));
Average_Filtered_picture(i,j,k)=mean_amp;
elseif(i==1 && j==1) % 左上角
pixel(1:2) = Noise_picture(i:i+1, j , k);
pixel(3:4) = Noise_picture(i:i+1, j+1, k);
mean_amp=mean(pixel(1:4));
Average_Filtered_picture(i,j,k)=mean_amp;
elseif(i==1 && j==N) % 右上角
pixel(1:2) = Noise_picture(i:i+1, j-1, k);
pixel(3:4) = Noise_picture(i:i+1, j , k);
mean_amp=mean(pixel(1:4));
Average_Filtered_picture(i,j,k)=mean_amp;
elseif(i==M && j==N) % 右下角
pixel(1:2) = Noise_picture(i-1:i, j-1, k);
pixel(3:4) = Noise_picture(i-1:i, j , k);
mean_amp=mean(pixel(1:4));
Average_Filtered_picture(i,j,k)=mean_amp;
elseif(i==M && j==1) % 左下角
pixel(1:2) = Noise_picture(i-1:i, j , k);
pixel(3:4) = Noise_picture(i-1:i, j+1, k);
mean_amp=mean(pixel(1:4));
Average_Filtered_picture(i,j,k)=mean_amp;
end
end
end
end
figure;
imshow(Average_Filtered_picture);
title('均值滤波');
运行结果