• 问答
  • 技术
  • 实践
  • 资源
干货|一文透彻理解:图像卷积、边缘提取和滤波去噪
技术讨论

作者丨程序员阿德@知乎(已授权)
来源丨程序员阿德
编辑丨极市平台

目录

  • 图像卷积
  • 图像梯度
  • 边缘提取

    • 1. Prewitt算子
    • 2. Sobel算子
    • 3. Laplacian算子
  • 平滑去噪

    • 1. 高斯滤波
    • 2. 均值滤波
    • 3. 中值滤波

一、图像卷积

现在有一张图片 f(x,y) 和一个kernel核 w(a,b)。

卷积(Convolution):卷积运算就是对于图像 f(x,y) 中的每个像素,将其作为中心像素,计算它及其邻域像素和kernel核 w(a,b)对应位置元素的乘积,然后把结果相加到一起,得到的值就作为该中心像素的新值,这样就完成了一次卷积运算。然后将kernel向下或向左平移一位继续计算每个像素的新值,直到遍历完整个图像。

如下图所示:

卷积运算的公式如下:

$$
f * w = \sum\limits_{(a,\ b) \in w \ (x-a,\ y-b) \in f} f(x-a,y-b)\ w(a,b)
$$

还有一个概念是互相关(Cross-correlation),流程和卷积类似,区别在于卷积在运算前需要把kernel围绕中心旋转180度(即做一次上下翻转(filp)和一次左右翻转),而互相关则不需要。

互相关的公式如下:

$$
f \otimes w = \sum\limits_{(a,\ b) \in w \ (x+a,\ y+b) \in f} f(x+a,y+b)\ w(a,b)
$$

两者的具体区别可以查看 卷积运算和相关运算的区别与物理含义

互相关主要用于计算两个图像的相关性(主要用于图像配准)。因为我们平时接触的卷积核大都是关于x轴和y轴对称的,所以卷积和互相关在这种情况下没什么区别。

中心像素在图像的边缘时,没有足够的像素与kernel进行运算,有两个方法:

  1. 最外面的一圈像素不进行计算,如果图像非常大,丢掉图像边缘的一圈对结果影响不大。
  2. 更好的办法是人为地在图像四周插入一圈像素(比如最近邻插值)。

图像的处理结果可能超出值域范围(0-255),则小于0的值视作0,大于255的视作255就行了。

二、图像梯度

梯度的方向是函数 f(x,y) 变化最快的方向,当图像中存在边缘时,有一些相邻像素的灰度值变化比较大,即一定有较大的梯度值。所以可以求图像的梯度来确定图像的边缘。

分别对图像按照x方向和y方向进行求偏导,得到x梯度图和y梯度图。梯度是矢量,存在幅值和方向,下面这个公式表示了图像的梯度:

$$
\nabla f=\begin{bmatrix} G{x} \ G{y} \end{bmatrix} = \begin{bmatrix} \dfrac{\partial f(x,y)}{\partial x} \ \dfrac{\partial f(x,y)}{\partial y} \end{bmatrix}
$$

梯度的幅值(magnitude)为:

$$
mag(\nabla f) = \sqrt{G{y}^{2} + G{x}^{2}}
$$

梯度的方向(direction)为:

$$
\theta = \operatorname{arctan} \left (\dfrac{G{y}}{G{x}} \right)
$$

梯度方向会取绝对值,因此得到的角度范围是 [0,180°]。

导数的含义就是计算像素灰度值的变化率,对于离散图像而言,在图像上使用一阶差分来计算相邻像素之间的差值,从而得到图像的梯度。

$$
\dfrac {\partial f}{\partial x} = f(x+1,\ y) - f(x,\ y) \ \dfrac {\partial f}{\partial y} = f(x,\ y+1) - f(x,\ y)
$$

也可以使用二阶差分求梯度:

$$
\dfrac {\partial f^2}{\partial x^2} = f(x+1,\ y) + f(x-1,\ y) - 2 f(x,\ y) \ \dfrac {\partial f^2}{\partial y^2} = f(x,\ y+1) + f(x,\ y-1) - 2 f(x,\ y)
$$

下面是一个边缘的例子:

上面是对斜坡区域进行求导,斜坡区域是图像中最常见的区域,因为图片中的大部分边缘都不是突变的而是渐变的,对于斜坡区域,一阶导数将斜坡变成了平坦区域即变成了粗线,二阶导数将斜坡变成了两条中间存在平台区域的细线。

关于一阶和二阶导数总结如下:

  1. 一阶导数在图像中产生较粗的边缘
  2. 二阶导数对细节更敏感,如细线、噪声等,它提取出来的边缘更细更强(sharp)
  3. 二阶导数在灰度斜坡和灰度台阶过度处会产生双边沿响应
  4. 二阶导数的符号可以确定边缘的过渡是从亮到暗还是从暗到亮
  5. 根据导数提取边缘之前最好对图像做平滑处理,因为导数对噪声比较敏感,尤其是二阶导数
  6. 二阶导数会强化边缘和其他区域的对比度,但是也会将灰度平滑区域的噪声进行放大,使其更明显

三、边缘提取

图像梯度用于边缘检测。边缘是像素值发生跃迁的地方,是图像的显著特征之一,在图像特征提取、目标检测等方面都有重要的作用。

图像中有灰度值的变化就会有梯度,从而产生边缘,在边缘处,具有变化的强弱及方向。这时一些常见的图像识别算法的基础,比如 hog,sift,都是基于梯度的。

边缘分为三类,step edgeramp edgepeak edge,下面是三类边缘的及其导数(一阶或者二阶)的形状:

根据不同的图像边缘特征,来决定是使用一阶还是二阶导数来求梯度。对图像求一阶或者高阶导数,会得到一些峰值,当这些峰值超过指定阈值时,则认为这些峰值对应的像素是边缘。

前面说到在图像上可以使用一阶差分来计算相邻像素之间的变化率,我们利用卷积和特定的算子来计算相邻像素的变化率。prewitt算子sobel算子可以计算相邻三个点之间的变化率。它们用于一阶算子的边缘检测,利用像素点上下、左右相邻点的灰度差求取边缘。

求梯度有三种卷积核(robert,prewitt,sobel算子),每种卷积核有两个,对图像分别做两次卷积,一个代表水平梯度,一个代表垂直梯度。

3.1、Prewitt算子

下面是prewitt的两个算子:

$\begin{bmatrix} -1 & 0 & 1 \ -1 & 0 & 1 \ -1 & 0 & 1 \end{bmatrix}$ :计算水平梯度,检测垂直边缘

$\begin{bmatrix} -1 & -1 & -1 \ 0 & 0 & 0 \ 1 & 1 & 1 \end{bmatrix}$ :计算垂直梯度,检测水平边缘

(梯度方向跟边缘方向垂直)

3.2、Sobel算子

Sobel算子是在Prewitt算子的基础上进行改进,增强了中间这个位置的权重:

$\begin{bmatrix} -1 & 0 & 1 \ -2 & 0 & 2 \ -1 & 0 & 1 \end{bmatrix}$ :计算水平梯度,检测垂直边缘

$\begin{bmatrix} -1 & -2 & -1 \ 0 & 0 & 0 \ 1 & 2 & 1 \end{bmatrix}$ :计算垂直梯度,检测水平边缘

Sobel更强调了和边缘相邻的像素点对边缘的影响。相比较Prewitt算子,Sobel模板能够较好的抑制噪声(平滑)效果。

3.3、Laplacian算子

上述两个算子都是通过求一阶导数来计算梯度的,用于线的检测,通常用于边缘检测。在图像处理过程中,除了检测线,有时候也需要检测特殊点,这就需要用二阶导数进行检测,著名的就是拉普拉斯(Laplacian)算子。

对图像求两次导数,公式如下:

所以拉普拉斯算子为:

$$
\begin{bmatrix} 0 & 1 & 0 \ 1 & -4 & 1 \ 0 & 1 & 0 \end{bmatrix} \ \ \ \ \text or \ \ \ \ \begin{bmatrix} 0 & -1 & 0 \ -1 & 4 & -1 \ 0 & -1 & 0 \end{bmatrix}
$$

下面这个拉普拉斯算子提取边缘更明显:

$$
\begin{bmatrix} 1 & 1 & 1 \ 1 & -8 & 1 \ 1 & 1 & 1 \end{bmatrix} \ \ \ \ \text or \ \ \ \ \begin{bmatrix} -1 & -1 & -1 \ -1 & 8 & -1 \ -1 & -1 & -1 \end{bmatrix}
$$

拉普拉斯算子在边缘检测的应用中并不局限于水平方向或垂直方向,这是Laplacian与soble的区别。

因为一阶二阶导数都能放大孤立点和孤立线(噪声)的影响,所以如果存在噪声,那么一阶二阶导数处理过后的图像将会有更多更大的噪声。所以对图像进行一阶二阶导数运算之前需要先对图像做平滑去噪处理。

四、平滑去噪

噪声的产生是因为图像中的某些像素的灰度值发生了突变,使得和周围区域不和谐。除噪其实去除高频噪声,使得图像中的噪声像素的灰度值不那么突兀。

噪声去除有基于卷积(高斯滤波,均值滤波,中值滤波等)和基于形态学(开运算、闭运算)两种方法。

用于平滑去噪和图像锐化(之后会介绍)的卷积核所有的元素之和一般要等于1,这是为了原始图像的能量(亮度)守恒。如果滤波器矩阵所有元素之和大于1,那么滤波后的图像就会比原图像更亮,反之,如果小于1,那么得到的图像就会变暗。如果和为0,图像不会完全黑,但只会突出一些边缘。

从频率域观点来看这些滤波器是一种低通滤波器,高频信号将会去掉,因此可以帮助消除图像尖锐噪声,实现图像平滑,模糊等功能。

4.1、高斯滤波

高斯滤波就是对整幅图像进行加权平均数的过程,每一个像素点的值,都由其本身和邻域内的其他像素值经过加权平均后得到。高斯滤波时水平和垂直方向呈现高斯分布,更突出了中心点在像素平滑后的权重。

高斯平滑中的滤波器是一个高斯核,二维零均值高斯函数为:

下面是高斯函数的形象表示:

常见的3x3高斯核(高斯核的宽和高必须是奇数)为: $\dfrac{1}{16} \begin{bmatrix} 1 & 2 & 1 \ 2 & 4 & 2 \ 1 & 2 & 1 \end{bmatrix}$

可以看到高斯核里的值符合高斯分布,中心的值最大,其他值根据距离中心元素的距离递减,用高斯核对图像进行卷积运算,会使图像更模糊(平滑),而模糊的程度由高斯的标准方差 $\sigma$ 决定, $\sigma$ 越大,平滑程度越大。高斯滤波可以有效的从图像中去除高斯噪音。

高斯函数的值域在(0,1)之间,也就是说高斯核的九个数加起来应该等于1(也就是100\%),把 1 这个数分摊到九个像素上,给了中间点更高的百分比。即高斯滤波对高斯核所覆盖的像素点的灰度值做了一个权重平均,中间的点权重大,周围的点权重小。

因为中心点是正在处理的点,也就是噪声点,给它更多的权重更能保持它自己的特性,从而使得平均运算对周围的像素影响更小。

4.2、均值滤波

使用进行均值滤波操作来模糊图像。输出图像的每一个像素灰度值是卷积核在输入图像中对应的像素的平均值( 所有像素加权系数相等)。

均值滤波卷积核所覆盖的九个像素点具有同样权重, 该卷积核的作用在于取九个值的平均值代替中间像素值,所以起到的平滑的效果。

相比于高斯滤波,它不能很好地保护图像细节,在图像去噪的同时也破坏了图像的细节部分,丢失了图像本身的一些属性,从而使图像变得模糊,不能很好地去除噪声点。

均值滤波的卷积核为: $\dfrac{1}{9} \begin{bmatrix} 1 & 1 & 1 \ 1 & 1 & 1 \ 1 & 1 & 1 \end{bmatrix}$

4.3、中值滤波

高斯滤波和均值滤波对去除高斯噪声的效果比较好,但是在噪声是椒盐噪声而不是高斯噪声,即图像偶尔会出现很大的噪声点的时候,用高斯滤波和均值滤波对图像进行平滑模糊的话,噪声像素是不会被去除的,它们只是转换为更为柔和但仍然可见的散粒。

椒盐噪声(salt \& pepper noise)(散粒噪声)是数字图像的一个常见噪声,所谓椒盐,椒就是黑,盐就是白,椒盐噪声就是在图像上随机出现黑色白色的像素。椒盐噪声是一种因为信号脉冲强度引起的噪声,要对椒盐噪声处理就需要用中值滤波。

其他滤波器都是用计算得到的一个新值来替代中心像素的值,而中值滤波是将周围像素和中心像素九个值进行排序以后,取中间值来替代中心像素。

中值滤波在一定的条件下可以克服常见线性滤波器带来的图像细节模糊,而且对滤除脉冲干扰及图像扫描噪声非常有效,也常用于保护边缘信息,使得边缘不会被模糊。但是对一些细节多,特别是线、尖顶等细节多的图像不宜采用中值滤波。

总结

中值滤波器与均值滤波器的比较:在均值滤波器中,由于噪声成分被放入平均计算中,所以输出受到了噪声的影响,但是在中值滤波器中,由于噪声成分很难选上,所以几乎不会影响到输出。因此同样用3x3区域进行处理,中值滤波消除的噪声能力更胜一筹。中值滤波无论是在消除噪声还是保存边缘方面都是一个不错的方法。

上面介绍的都是低通滤波器,使用低通滤波器可以图像模糊,去除图像中的高频成分(包括噪音和边界)。有一些去滤波技术不会模糊掉边界,比如双边滤波

  • 1
  • 0
  • 274
收藏
暂无评论