使用Matlab图像处理(三)——图像滤波原理
今天小白为大家带来图像滤波的基础原理。
01
—
什么是图像滤波?
小白用一句更简短的话来说:滤波就是去除图像中的噪声。
由于成像系统、传输介质和记录设备等的不完善,数字图像在其形成、传输记录过程中往往会受到多种噪声的污染。另外,在图像处理的某些环节当输入的像对象并不如预想时也会在结果图像中引入噪声。这些噪声在图像上常表现为一引起较强视觉效果的孤立像素点或像素块。一般,噪声信号与要研究的对象不相关它以无用的信息形式出现,扰乱图像的可观测信息。
对于数字图像信号,噪声表为或大或小的极值,这些极值通过加减作用于图像像素的真实灰度值上,对图像造成亮、暗点干扰,极大降低了图像质量,影响图像复原、分割、特征提取、图像识别等后继工作的进行。
要构造一种有效抑制噪声的滤波器必须考虑两个基本问题:
能有效地去除目标和背景中的噪声;另外,能很好地保护图像目标的形状、大小及特定的几何和拓扑结构特征。
既然是去除噪声,接下来我们就介绍几种常见的噪声。
02
—
常见噪声种类?
首先我们介绍最著名的噪声——高斯噪声:无论是做什么的小伙伴,或多或少都会听说过高斯噪声。小白不想把复杂的数学公式拿上进行讲解,大家可以简单记成这种噪声符合正态分布就可以啦,我们用“影响图像处理最深远的人”的相片来直观的展现一下高斯噪声的样子。
首先看一下没有噪声的的图片
我们看一下在这张图片上加了0.08的高斯噪声的结果:
可以值观的看出来第二张图片比第一张图片要模糊很多。
椒盐噪声:这种噪声就相当于是你抓了一把椒盐,然后随意的撒在了图片上面(每回想到椒盐噪声的时候,小白都能想起食堂卖的椒盐饼,没错就是那个种效果)。一样,我们也来看一下椒盐噪声的样子。
均匀噪声:根据名字也能比较容易知道这是一种什么噪声。没错,就是噪声是均匀分布的。我们也来看一下图像的样子。
除了上诉噪声之外,还有很多例如伽马噪声,瑞丽噪声等等。由于本问主要是讲解如何去除噪声,这里就不在讲述其他噪声,请感兴趣的小伙伴自行百度。
03
—
滤波数学原理
小白有个感觉和大家分享一下,影响科研的只有两门学科:数学和英语。英语决定你在某个领域的广度;数学觉得你在某个领域的深度。哎呀,说多了,回到正题上来,就是无论怎么简化的去讲解一个东西,我们都绕不开对数学机理的剖析。不过小白会尽可能的为大家简化复杂的公式。
小白觉得图像滤波就是借助周围图像的数据来修正我们想要修正的数据。举个最简单的例子,有一组数[1 2 6 4 5],我们发现中间有个数好像比较大,我们发现整个数据好像符合递增的特点,所以这个数字有可能是3,但是我们又不能不“尊重”这个数本身的大小,所以怎么办呢,我们将估计的数和它表现的数求取平均数,也就是取4.5来代替原来的数。当然有可能根据需求采用不同的权重。
而对于灰度图像来说是一个二维矩阵(彩色图像可以转换成灰度图像),那么我们不仅需要借助左右的数据来推断中间的数据,也需要借助上下的数据来帮助我们修正我们的数据。所以我们的“加权系数”就变成了一个矩阵。例如我们可以选取对周围的9个数求取平均值,那么我们就可以用下面的矩阵来实现
我们用一个例子来掩饰一下我们的滤波操作。假设我们有一个8*8的图像,我们需要用均值滤波来对其进行处理。比如我们相对图像的(1,1)元素进行滤波,我们就将均值滤波模板的中间放到(1,1)处,然后把以(1,1)为圆心,1为半径的像素分别乘以模板中对应位置的系数,求和之后球去个平均数即为(1,1)处滤波后的像素值。
可能小伙伴会问了,用一个3*3的模板去滤波,那(1,:)和(:,1)的像素都会出现越界的情况。为了应对这种情况,可以采用两种方式:用0在原图像的周围填充滤波模板半径宽度的数据;或者采用最外面一层的灰度值填充。
通过上面的图片,红框内所有像素加起来再求取平均数,之后再填充到原来的位置。为了让小伙伴看的更清晰,我们再向下进行几步。
我们又向右移动了三个位置。现在小伙伴可以计算一下右面问号处在滤波之后的像素为多少。结果将会在下期给出来哦~
04
—
滤波模板
接下来小白为大家介绍一些常见或者有趣的滤波模板。
上面这个模板是一个没有用的模板,滤波之后还是他自己。
上面这个模板滤波后图像会整体向左平移一个单位。
上面是著名的Sobel算子,是用来检测图像边缘的滤波模板。
下面小白为大家介绍一种没有模板的滤波——中值滤波。
中值滤波由Turky在1971年提出,最初用于时间序列分析,后来被用于图像处理,并在去噪复原中取得了较好的效果。中值滤波器是基于次序统计完成信号恢复的一种典型的非线性滤波器,其基本原理是把图像或序列中心点位置的值用该域的中值替代,具有运算简单、速度快、除噪效果好等优点,曾被认为是非线性滤波的代表。
上面的句子比较长,小白觉得可以用一个简单的例子,或者比较容易懂得话来说明什么是中值滤波。
在原始数据的周围选取一定的区域,将这个区域内所有的数都排序,选取排序后中间的一个数来代替原始数据。
接下来小白举个例子,还是使用上面的图,如果我们对红色区域采用中值滤波。为了小伙伴们阅读方便,我们再次将上面的图片祭出。
采用中值滤波,首先需要对选中的区域内所有的灰度值进行排序,排序结果为[0 0 0 0 90 90 90 90 90],我们发现排在中间位置的是90,所以采用中值滤波后,该像素点的灰度值仍然为90。当然,这里面小白要提醒大家,在采用中值滤波的时候一定要使用奇数个像素作为模板,不然中间的数就不会是一个数,是的滤波时候出现问题。
最后小白要为大家带来高斯滤波
高斯滤波当然和高斯函数有关系,为了不废话,小白直接给出高斯滤波的公式:
小白是最讨厌公式的,相信很多小伙伴也和小白一样讨厌公式,所以直接给出一个5×5,σ=1的一个高斯滤波模板:
通过分析上面的矩阵,我们可以发现高斯滤波的模板的中心位置影响要大于边缘位置的影响,这也正好是高斯函数正态性的体现。下面小白用一个立体图来展示一下这个高斯模板。
通过这个立体图形,可以明显的看出是一个二维正态分布。
讲了几种滤波的原理和模板,小白将在下一讲中为小伙伴们带来如何使用Matlab来实现这些滤波操作。