介绍
这次来讨论一下空间滤波,顾名思义空间滤波就是在空间上,即像素的分布上着手来处理图片。本文会介绍空间滤波在平滑和锐化上的作用,和酷炫叼炸天的效果。(●’◡’●)
这篇讲平滑,下一篇是锐化
一些概念
滤波
滤波是频域上的概念,不过这里借用一下,因为本质上达到一个差不多的效果。
卷积
卷积的说明请参考我前面写的《深入浅出讲解卷积》
模板
一个二维矩阵,作用是加权原图像的像素点来产生新的一个像素点,具体会在后面讲到。
空间滤波的原理
说白了就是将图像和模板卷积。
数学上给出这样的变换关系:
$$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
函数可以实现滤波,具体方法既是我前面提到的卷积的过程。
效果
左边是没有处理的,右边是处理后的。可以看出来右边的图片确实是变模糊了。
中值滤波
怎么做?
将邻域中的像素排序后,取中位数的方法,这种滤波适合处理一些无规律的噪点。
代码
先用imnoise
给图像加点噪音
matlab自带了中值滤波的函数medfilt2
,但是由于medfilt2
只能处理二维矩阵,所以先分解为每个分量处理后,再合并。
效果
左边是加了噪声的图像,右边是处理后的图像,可以明显感觉噪声被削弱了。