用大量图与公式帮助大家深入理解各种边缘检测

作者丨沙沙@知乎

这篇文章很长,使用了大量的图表和公式来帮助你理解各种边缘检测算子。我希望你能读到它。测试编译器是 Matlab。作为一个入门级的计算机视觉(Computer vision)领域,Matlab是一个非常友好和简单的工具,自带各种高级库函数,实现速度非常快,偏向于实验应用。好了,废话不多说,跟着小编一起来看看今天的话题——边缘检测。

一.前言

首先,让我们简单了解一下什么是数字图像处理。让我们来看看数字图像的两个主要应用领域:

1.改进图形信息供人们解读;

2.对图像数据进行存储、传输和呈现的处理,使其能够被机器自动理解;

我们可以简单的理解为,将一张原始图像处理成计算机更易理解或需要的形式,如图1-1所示,它是基于边缘检测的免疫细胞图像自动分割过程的示意图。

图1-1 克隆细胞图像自动分割过程示意图

图 2-2 车牌检测

在我们对数字图像处理有一个大致的了解之后,我们将介绍一些数字图像处理的基本算法。

二、数字图像处理的基础知识和算法

接下来,我们将简要介绍学习数字图像处理的一些基础知识和算法。

1).数字图像

数字图像是指当前图像用二维数字表示,每个像素的灰度值用一个数字表示,范围为0-255(2^8).

2).二值图、灰度图、彩色图

二值图像:图像中每个像素的灰度值只能为0或1,即要么是黑色,要么是白色。二值图像可以理解为黑白图像。

灰度图像:图像中的每个像素点都可以用一个0-255的灰度值来表示,也就是说从黑到白中间有255个灰度值。

彩色图像:每张图像由三幅灰度图像组成,依次代表红、绿、蓝通道的灰度值,称为RGB。此时,彩色图像应该被视为一个三维的 [height] , width, 3]。

让我们用一张图来感受一下灰度图和彩色图的联系和区别。

图 2-1 RGB 图像的分解

还有一个很重要的公式,就是将彩色图像转换为灰度图像的计算公式:

Gray代表灰度图像,RGB代表彩色图像的红(红)、绿(绿)、蓝(蓝)三通道灰度值。

3)。邻接,连接

4个邻域:假设有一个像素p,坐标为(x, y),它的4个域是(x + 1, y), (x – 1, y), (x, y + 1), ( x, y – 1)。

D邻域:假设有一个像素p,坐标为(x, y),那么它的D域为(x + 1, y + 1), ( x + 1, y – 1), ( x – 1, y + 1)

(x – 1, y – 1)

8个邻域:取4个字段和D个字段的集合并集,表示为8个邻域

图 2 – 2 4-neighborhood(左)、D-neighborhood(中)、8-neighborhood(右)

4-connection:对于像素点p的4-邻域内的像素,与像素点p形成4-connection

8-connection:对于像素点p的8-邻域内的像素,与像素点p形成8-connection

4).过滤

过滤的主要目的有两个:

1.通过滤波提取图像特征,简化图像携带的信息,如同其他后续图像处理一样;

2.为了满足图像处理的需要,通过滤波来消除图像数字化中混入的噪声;

第一点是边缘检测使用的基本思想,就是对图像信息进行简化,用边缘线来表示图像所承载的信息。

过滤可以理解为一个过滤器(一般是3*3、5*5矩阵)从上到下从左到右遍历图像,计算过滤器的值和对应的像素点并按照目的执行过滤的数值计算将值返回给当前像素,如图2-3所示,蓝色块代表过滤器,它对图像进行点积运算并赋值给图像。

具体公式表示为:

(其中表示当前像素,表示乘以当前像素的值和滤波器对应的值,n为滤波器大小,例如如果滤波器值全为1,那么这个公式计算的是8-connection当前像素是像素点的平均值,所以过滤后的图像应该会出现模糊。模糊程度取决于滤镜的大小。滤镜尺寸越大,模糊效果越明显)。

三.边缘检测(Sobel、Prewitt、Roberts、Canny、Marr-Hildreth)1.基本边缘检测算子

介绍了过滤的知识之后,学习基本的边缘检测算法就很容易了,因为边缘检测本质上是一种过滤算法,区别在于过滤器的选择,过滤规则是完全一致的。

为了更好地理解边缘检测算子,我们引入梯度的概念。梯度是人工智能中一个非常重要的概念,它遍布机器学习和深度学习领域。维函数的一阶微分基本定义为:

而我们刚才提到matlab边缘检测算子,图像的滤波一般都是基于灰度图像,所以此时的图像是二维的,所以我们看的是二维函数的微分,也就是偏微分方程:

从上式可以看出,图像梯度是当前像素点相对于X轴和Y轴的偏导数,所以梯度也可以理解为像素点灰度值在场内变化的速度图像处理。让我们举一个简单的例子:

图 3-1

图中我们可以看到,100和90之差的灰度值为10,即当前像素点在X轴方向的梯度为10,其他点为90。推导后,发现梯度全为0,所以我们可以发现,在数字图像处理中,由于像素属性的特殊性,图像处理中微积分的形式是计算当前像素点沿偏微分方向的差异,所以实际应用中不需要用到求导,只需做简单的加减法即可。

另一个概念梯度的大小表示 f(x, y),即单位距离在其最大变化率方向上增加的量,即:

了解了梯度的概念后,我们先介绍几个基本的边缘检测滤波器:Sobel、Prewitt、Roberts 算子。

我们以 Sobel 为例,分别表示 X 轴和 Y 轴的边缘检测算子。从算子结构中可以清楚的发现,这个滤波器计算的是当前像素左右8个连通像素的灰度值之差。,我们先通过一维的概念来理解:

如果现在有一个长度为 10 的一维数组,则值为:

[ 8、6、2、4、9、1、3、5、10、6]

此时,我们的一维边缘检测算子表示为[-1,0,1]。现在我们将边缘检测算子放在数组上进行点积(即对应点相乘后的和),结果为:

[ 6、-6、-2、7、-3、-6、4、7、1、-10]

可以发现得到的值有一个负数,但是我们之前的定义是说像素灰度值定义域在0-255的范围内,所以这里一般的操作是把负数截断到0-255以内或者直接取绝对值,所以现在我们得到的是

[ 6、6、2、7、3、6、4、7、1、10]

数字的大小代表了当前像素点的梯度大小,即灰度变化的快慢。值越大,我们就可以确定当前点就是我们要寻找的边缘点。通过一个一维的例子我们可以更好的理解二维边缘检测的思想,即沿X轴和Y轴进行两次滤波操作,对得到的结果进行平方、求和、求根,得到当前像素的图像梯度。一张图来理解这个过程:

图3-4 原图、X轴梯度图、Y轴梯度图、梯度图可视化

图中(a)为原始灰度图像,(b)和(c)为原始图像使用Sobel算子滤波后得到的图。Y轴的梯度图,最后将两张图融合在一起得到我们需要的梯度图像(d),并给你一张图,帮助理解Sobel算法。

现在我们对边缘检测的基本思想有了一个大致的了解。看图 3-4(d),你觉得它看起来不错,但并不一定意味着它就是我们需要的边缘图。直接使用基本边缘Sobel等算子得到的边缘图存在很多问题,比如噪声污染没有消除,边缘线太粗太宽,所以我们将介绍两个高级边缘检测算子:Canny算子和Marr -Hildreth 操作员。

2.更高级的边缘检测算子

1).Canny 运算符

Canny 算子是澳大利亚计算机科学家 John F. Canny 于 1986 年开发的多级算子。

边缘检测算法,其目标是找到一条最优边缘,最优边缘的定义为:

1.良好的检测——算法可以在图像中标记尽可能多的实际边缘;

2.定位好——识别出的边缘应该尽量靠近实际图像中的实际边缘;

3.最小响应——图像中的边缘只能被识别一次,并且可能的图像噪声不应被识别为边缘。

那么接下来我们来介绍一下目前比较流行的Canny算法的具体步骤

(1).高斯滤波器

高斯滤波是目前最流行的去噪滤波算法。我们学习的概率论中的高斯分布和正态分布指的是同一个意思。根据高斯公式生成的参数规则对灰度值进行加权平均,可以有效滤除叠加在理想图像中的高频噪声。

二维高斯公式为:

常见的高斯滤波器有:

图 3-5 普通高斯滤波器

事实上,高斯滤波器与金字塔结构非常相似。过滤器的值可以理解为一个权重。值越大,对应像素的权重越大,分量也越大。因此,从高斯滤波器中,我们可以看出距离对应于当前像素,距离越远,权重越小,对灰度值的贡献越小。

我们举个例子来理解高斯滤波,比如图 3-5 左边的高斯滤波器,它的中心点 4 我们可以认为它是‘主角’,周围的点是‘邻居’,噪声我们认为它作为一个“坏人”,现在我们假设9个人中的一个是“坏人”,我们也知道这个坏人肯定会称自己为好人,但如果我们有投票机制来决定一个人是否person is a ‘bad person’ The bad guy’,这里的权重对应每个人讲话的权重,投票机制就是我们所说的加权平均策略。现在我们可以直观的发现,高斯滤波器其实就是一个考虑了周围像素点的滤波器。即使当前点是噪声点,高斯滤波器将通过周围点的灰度值来限制噪声的影响。生成高斯滤波器和滤波的代码如下:

(其中 gaussKernel’ 表示转置 gaussKernel)

(2).计算梯度图像和角度图像

刚才我们基本了解了梯度图像的计算。无非就是使用各种边缘检测算子来检测梯度。但是,Canny 中使用的梯度检测算子有点高级。它是通过使用高斯滤波器进行梯度计算得到的滤波器。得到的结果也类似于Sobel算子,即越靠近中心点的像素,权重越大。代码如下:

角度图像的计算比较简单,其作用是为非极大值抑制的方向提供指导。公式如下:

(3).梯度图像的非最大抑制

上一步得到的梯度图像存在边缘粗细、边缘干扰弱等问题。现在我们可以使用非极大值抑制来找到像素的局部极大值,并将非极大值对应的灰度值设置为0,这样会去除很大一部分非边缘像素。

如图3-6所示,C代表当前非极大值抑制点,g1-4是它的8连通邻点,图中蓝色线段代表计算得到的角度图中C点的值上一步,即梯度方向。第一步是判断C的灰度值是否是8值邻域中最大的。如果是,继续检查图中梯度方向交点处dTmp1和dTmp2的值是否大于C,如果C点大于dTmp1和dTmp2的灰度值,则认定C点为最大值value 点并设置为 1,因此最终生成的图像应该是二值图像,并且边缘是理想的单像素边缘。

图 3-6 非最大抑制

(需要注意的是,梯度方向的交点不一定落在这8个场所在的8个点的位置,所以实际应用dTmp1和dTmp2是利用双线性插值形成的灰度值两个相邻的点)。

最后,在最后一张图帮助大家理解,如图3-7所示,梯度方向垂直向上,经过非极大值抑制后,梯度方向的最大值作为边缘点,形成一个细而细的精确的单像素边缘。

图 3-7

(4). 使用双阈值的边连接

经过以上三步得到的边缘质量已经很高了,但是还是有很多假边缘,所以Canny算法中使用的算法就是双阈值法。假边缘设置为0,大于高阈值的点被认为是强边缘设置为1,中间的像素需要进一步检查

根据高阈值图像,将边缘链接成轮廓。当到达轮廓的端点时,算法会在断点的8个邻域点中寻找一个满足低阈值的点,然后基于这个点收集新的边缘,直到整个图像闭合。,具体代码为:

但是由于寻找弱边缘点的计算成本很高,采用递归思维,发现的弱边缘点并不多,所以在实际应用中这一步往往被丢弃,取而代之的是基于形态学的边缘点。细化操作,具体思路后面会提到,具体代码为:

至此,我们已经深入理解了 Canny 算法的思想和实现。在实际应用中,Canny一般是边缘检测的首选,其算法思想也值得学习。接下来,我们将简要介绍 Marr-Hildreth 边缘检测算子。

1).Marr-Hildreth 运算符

在学习 Marr-Hildreth 算子之前,我们先来了解一下为什么要使用二阶导数法。

如图3-8所示,左边代表灰度图像,从左到右从黑色(0)到白色(255),现在我们看它的灰度图,灰度值从小到大稳步上升,其一阶导数在上升区域表示为一个常数值,得到的信息是图像灰度值是平滑过渡的,即梯度值相等,然后在计算二阶导数,得到的图像是过渡开始时的起点为正数,其值为该点一阶导数的梯度值,终点与起点。连接得到与X轴的交点,这个点就是我们认为的边缘点,这就是边缘检测领域使用的二阶导数的神奇之处(第一次接触的时候很神奇)。

看一下 marr 和 Hildreth 证明的结论:

1.灰度变化与图像大小无关,因此它们的检测需要使用不同大小的算子

2.灰度突变会导致一阶导数出现波峰或波谷,等价地导致二阶导数出现过零

图 3-8 过零原理

在学习了基于二阶导数的Malhash算法的原理之后,我们再来看看它的思路:

(1).高斯滤波器

你是对的,它仍然是高斯滤波。基本上所有的边缘检测算法都会在前面加一个高斯滤波来去除高频噪声,这里就不多说了,简单回顾一下。

(2).计算拉普拉斯二阶导数

Marr-Hildreth证明了最能满足图像处理需要的算子是滤波拉普拉斯高斯(Log)算子。具体原理我们就不细说了。下面我们来看看它的公式:

它生成的拉普拉斯滤波器也叫墨西哥草帽算子,因为中间一般是大的正数,8邻域连通点是小的负数。常用的过滤器如图3-9所示:

图 3-9 拉普拉斯滤波器

之后,使用拉普拉斯滤波器对图像进行滤波matlab边缘检测算子,得到待计算的图像。

(3)。计算过零)

过零的实现比较简单。由于过零点意味着至少两个相邻像素的像素值有不同的符号,所以有四种情况需要检测:左右、上下、两条对角线。如果过滤后的图像 g(x,y) 的任意像素 p 处一组四例的差值的绝对值超过设定的阈值,则我们可以称 pa 过零像素。示例如下:

图 3-10

这是 Marr-Hildreth 的一小部分,用于检测是否满足 [-+] 条件,其中 thresh 是提到的阈值。

到目前为止,我们已经学习了两种最流行和最经典的高级边缘检测算法和思想。接下来,我们将谈谈一些经验和算法选择参考。

四.附加

1.过滤器的大小应该是奇数,这样赋值操作只有一个中心点。常见的过滤器或卷积核(Conv kernel)有3*3、5*5等,所以也有半径的概念,比如5*5卷积核的半径是2

2.过滤器中所有元素的总和应该为0。这个限制是为了保证过滤前后图像的整体灰度值保持不变

3.Roberts算子、Sobel算子、Prewitt算子运算率高,对噪声有一定的抑制作用,但检测到的边缘质量不高,比如边缘粗、定位不准、不连续点多

4.Canny算子不易受噪声干扰,得到的边缘精细准确。缺点是计算成本高,难以在实时图像处理中运行。适用于需要高精度的应用

5.Marr-Hildreth算子边缘检测效果比较好,但是对噪声比较敏感(由于二阶运算的性质)。

五.总结

效果如图:

本文亮点总结

1.边缘检测算法,其目标是找到一条最优边缘,最优边缘的定义为:

1)良好的检测——算法可以在图像中标记尽可能多的实际边缘;

2)定位好——识别出的边缘应该尽量靠近实际图像中的实际边缘;

3)最小响应——图像中的边缘只能被识别一次,并且可能的图像噪声不应被识别为边缘。

2.高斯滤波是目前最流行的去噪滤波算法。我们学习的概率论中的高斯分布和正态分布指的是同一个意思。其原理是根据待过滤的像素点对其邻域点的灰度值按照高斯公式生成的参数规则进行加权平均,可以有效滤除理想图像中叠加的高频噪声. 返回搜狐,查看更多

© 版权声明
THE END
喜欢就支持一下吧
点赞0
分享
评论 抢沙发

请登录后发表评论