一、边缘检测简单介绍
边缘检测是图像分割中最常见的操作之一,一般提到边缘可能有三个概念:
- 边缘检测:定位边缘像素的过程
- 边缘增强:增强边缘和背景之间的对比度
- 边缘跟踪:沿着边缘进行跟踪,将边缘像素采集到一个列表中。链码算法是边缘跟踪的一个算法
图像分割的主要目的是识别图像中的区域,一般首先需要边缘检测得到物体区域,然后在后续的处理中判断物体属于什么类型。
二、理论基础
要定义一个边缘检测算法首先需要定义什么是边缘
- 边缘的定义:
边缘有很多种定义,每种都有适用于的特定场景。最理想的是理想阶梯型边缘。
理想阶梯型边缘:这种边缘是边缘两侧的像素的灰度级有着阶梯状的区别,但是这种情况是不可能存在的。原因有二,首先数据化采样会使得边缘锯齿话,因为图像的采样不可能使得整个边缘恰好在像素的边界上,因此实际中灰度的变化会涉及到很多像素。第二,存在的噪声会随机干扰每个像素的灰度级。
B= A+N 其中B为实际图像,A为理想图像,N为噪声影响
除去最理想的状态,我们希望,边缘由灰阶的等高线定义,越过等高线时,灰度会迅速变换,沿着等高线,灰阶的变换会比较轻柔。边缘具有一个可以测量的方向。
- 噪声:
边缘的噪声有两种类型,一种是和像素无关的,一种是和像素相关的。和像素无关的噪声比较常见,比如椒盐噪声、随机白噪声等等;和像素相关的比较少见,而且也比较难处理。
噪声的本质是随机的,因此无法在一个有噪声的图像中准确的测量噪声,噪声可能没有特定的统计学属性,但是我们可以测试一下,如果噪声具有特定的统计特性,那么有些图像的噪声是可以估计的。比如高斯噪声,可以通过计算一张图的视觉恒定区域的均值、方差,大致得到高斯噪声的均值方差。
噪声和边缘像素一样都具有和周围像素灰度区别明显的特点。但是边缘像素可以互相连接构成等高线,而噪声没有这样的特性。这是两者的区别,可以通过这个区别两者。
三、三种定位边缘的算子:
边缘是由灰阶值的变换定义的,因此对这种变换敏感的算子就可以用作边缘检测器。常见的有三种算子
- 导数算子:导数的意义就是表示函数值的变换率,图像上的灰阶值变换在边缘附近很大,在常量区比较小
- 类似于模板匹配的方案:这种就是我们熟悉卷积核啦~这种方式的思想是将一个小的离散的模板作为边缘的模型,然后作为卷积掩膜依次和图像上每个像素相乘。比如sobel算子和拉普拉斯算子
- 使用边缘的数学模型:使用了边缘的数学模型,并且考虑了噪声模型的。比如LoG,Canny。
下面依次简单介绍:
3.1 导数算子
基于导数的算子有一阶导数和二阶导数,其中二阶导数对边缘的识别效果要更优秀,因为他对像素灰度的变换更加敏感。
图像可以看作是二方向的函数A(x,y),因为图像是离散的,所以可以使用差分来计算一个像素点的导数。
边缘响应也称为边缘强度,是两个梯度向量之和的长度,反应的边缘变化的强度。
3.2 基于模板的边缘检测
常见的边缘检测算子sobel算子,拉普拉斯算子等
3.2.1 sobel算子
比如sobel算子,sobel算子长这样
sy是类似的。sobel算子可以理解为对2*2区域的像素应用一阶梯度计算公式,然后计算结果的平均值。
sobel算子对于每个像素的结果得到一个实数,考虑到x轴和y轴两个方向,可以用两者的平方之和的开方得到一个响应值,如果响应值大于某个阈值,则认为是边缘像素点。一般在实际计算时,因为开平方运算计算消耗大,往往会使用其他的替代方案得到响应值。
注意:
从上面这个理解可以看出,对于不同类型的图片需要设置不同的阈值,阈值是需要根据实际情况调节的。
还需要注意如果图像存在噪声,需要先进性噪声去除,比如简单的高斯滤波、中值滤波等等。
3.2.2 kirsch算子
它采用8个模板对图像上的每一个像素点进行卷积求导,这8个模板代表8个方向,对图像上的8个特定边缘方向作出最大响应,运算中取最大值作为图像的边缘输出。
3.3 边缘模型
3.3.1 高斯拉普拉斯算子LOG
这种模型和2.2的模板其实有点相像,都是采用某种策略生成卷积掩码,然后和原图做卷积。
Laplacian(拉普拉斯)是对于一张图像的二阶空间导数上各向同性的测量。一张图像的Laplacian会显示出intensity(亮度) 剧烈变化的区域,所以经常用作边缘检测。
因为卷积核是对图像二阶求导的一种近似,所以它对于噪声来说更加敏感。为了克服这一点,通常在进行laplacian之前,先进行Gaussian Smooth(高斯平滑)。所以L(GI), 这里I 表示的是图像,G表示的是Gaussian Smoothing Filter。
因为上面两个操作的顺序是没有关系的,所以可以结合在一起。
1. 设置不同的高斯滤波器的方差可以得到不同的LOG算子,
2. 通过算子和原始图像进行卷积可以得到不同的图像,
3. 在这些图像上寻找0交叉点。所谓0交叉点就是卷积之后值为0的点。我们知道一阶导数的极值点对应二阶导数的0交叉点。这些点表示信号的强度趋势开始变化,也就是我们需要的边缘像素点。
4. 结合不同尺度的图像或者不同的高斯方差得到的边缘像素点,进行合并操作就可以得到边缘像素
https://blog.csdn.net/lanling1996/article/details/112431607
3.3.2 Canny算子
Canny算子与Marr(LoG)边缘检测方法类似(Marr大爷号称计算机视觉之父),也属于是先平滑后求导数的方法。
John Canny研究了最优边缘检测方法所需的特性,给出了评价边缘检测性能优劣的三个指标:
1 好的信噪比,即将非边缘点判定为边缘点的概率要低,将边缘点判为非边缘点的概率要低;
2 高的定位性能,即检测出的边缘点要尽可能在实际边缘的中心;
3 对单一边缘仅有唯一响应,即单个边缘产生多个响应的概率要低,并且虚假响应边缘应该得到最大抑制。
Canny算子求边缘点具体算法步骤如下:
1. 用高斯滤波器平滑图像.
2. 用一阶偏导有限差分计算梯度幅值和方向
3. 对梯度幅值进行非极大值抑制
4. 用双阈值算法检测和连接边缘.
简单的介绍上面的过程:
1. 用高斯滤波器平滑图像:在真实的图像中,一般会有噪声,噪声会影响梯度的计算,所以步骤1上来先滤波。
2. 用一阶偏导有限差分计算梯度幅值和方向:
何为边缘?图象局部区域亮度变化显著的部分,对于灰度图像来说,也就是灰度值有一个明显变化,既从一个灰度值在很小的缓冲区域内急剧变化到另一个灰度相差较大的灰度值。导数就是表征变化率的,但是数字图像都是离散的,也就是导数肯定会用差分来代替。可选用的算子有soble算子、Prewitt算子、Roberts模板等等;
参考文章:
Canny边缘检测算法原理及C语言实现详解https://www.cnblogs.com/love6tao/p/5152020.html