数字图像处理(2) 平滑空间滤波

介绍

这次来讨论一下空间滤波,顾名思义空间滤波就是在空间上,即像素的分布上着手来处理图片。本文会介绍空间滤波在平滑和锐化上的作用,和酷炫叼炸天的效果。(●’◡’●)
这篇讲平滑,下一篇是锐化


一些概念

滤波

滤波是频域上的概念,不过这里借用一下,因为本质上达到一个差不多的效果。

卷积

卷积的说明请参考我前面写的《深入浅出讲解卷积》

模板

一个二维矩阵,作用是加权原图像的像素点来产生新的一个像素点,具体会在后面讲到。


空间滤波的原理

说白了就是将图像和模板卷积。
数学上给出这样的变换关系:
$$g(x,y)=\sum_{s=-a}^{a} \sum_{t=-b}^{b} w(s,t)f(x-s,y-t)$$
其中$g$表示新图像的像素值,$f$表示原图像,$w$表示模板。
为了讲清楚点,我们分几步来说明整个过程:

将模板中心对准$(x,y)$,$(x,y)$的原像素为$r$
将模板看作权值,和对应的原图像中的点求加权平均,得到新像素$s$
$s$就是$(x,y)$的新像素

为什么要这么做呢?举个简单的例子,假如模板是下面这个矩阵:
$$\begin{bmatrix}
1 & 1 & 1\\
1 & 1 & 1\\
1 & 1 & 1
\end{bmatrix}$$

会产生怎样的效果呢?想像一下,一个点的像素变成周围的点和这个点的加权平均,图像就会变得平滑,达到了滤波的目的之一。
而平移加权叠加的过程本来就是卷积,所以空间滤波就是将模板和图像卷积,不过由于卷积会让模板反转过来,所以卷积前应当反转模板。


平滑空间滤波器

什么是平滑?

通俗点讲就是将图片模糊化,来祛除一些噪音点。大家都是用过毁图秀秀的,很容易理解(●’◡’●)

邻域平均

怎么做?

想想怎么才能让图片模糊,很容易想出来的方案就是让每个像素点都和周围的像素点融合一下,然后图像就会平滑了。

模板

前面讲的那个全是1的矩阵就是个最简单的平滑处理的模板。当然下面这个是个更好的模板:
$$\begin{bmatrix}
1 & 2 & 1\\
2 & 4 & 2\\
1 & 2 & 1
\end{bmatrix}$$
这个模板明显表明,中心点的像素的信息更加重要

代码

接下来我们用matlab来尝试平滑处理一个图片。
fspecial函数可以产生一个模板,不过我们可以自己建立模板。
imfilter函数可以实现滤波,具体方法既是我前面提到的卷积的过程。

1
2
3
4
5
6
7
8
9
10
11
I=imread('tianyi.jpg');%读取图片
A=zeros(5)+1;%用5阶的全是1的模板处理
A=A./sum(sum(A));%归一化
K=imfilter(I,A);%滤波
%下面的过程是在输出
[a,b,c]=size(K);
T=b/2;
C1=I(:,1:T,:);
C2=K(:,T+1:end,:);
C=[C1,C2];
figure,imshow(C);

效果


左边是没有处理的,右边是处理后的。可以看出来右边的图片确实是变模糊了。

中值滤波

怎么做?

将邻域中的像素排序后,取中位数的方法,这种滤波适合处理一些无规律的噪点。

代码

先用imnoise给图像加点噪音
matlab自带了中值滤波的函数medfilt2,但是由于medfilt2只能处理二维矩阵,所以先分解为每个分量处理后,再合并。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
I=imread('SAO.jpg');%读取图片
J=imnoise(I,'gaussian',0,0.01);%增加高斯噪声
%分解
R=J(:,:,1);
G=J(:,:,2);
B=J(:,:,3);
K=cat(3,medfilt2(R),medfilt2(G),medfilt2(B));%滤波并合并
%下面是输出
[a,b,c]=size(K);
T=b/2;
C1=J(:,1:T,:);
C2=K(:,T+1:end,:);
C=[C1,C2];
figure,imshow(C);

效果


左边是加了噪声的图像,右边是处理后的图像,可以明显感觉噪声被削弱了。