提示:文章参考了网络上其他作者的文章,以及相关书籍,如有侵权,请联系作者。
文章目录
- 前言
- 一、像素级边缘提取
- 1.经典的边缘检测算子
- 2.边缘检测的一般流程
- 3.sobel_amp 算子
- 参考文献
前言
除了阈值分割外,也可以通过检测区域的边缘得到目标区域。区域的边缘像素的灰度值往往会发生灰度上的突变,针对这些跳跃性的突变进行检测和计算,可以得到区域的边缘轮廓,并作为分割图像的依据。Halcon 中有许多边缘滤波器能计算出边缘的幅值和方向,用以实现边缘的提取。本文就以常用的Sobel算子、Laplace 算子和Canny 算子为例,介绍边缘检测的常用方法。
本文涉及的知识点如下:
1)、像素级边缘提取:学会如何使用边缘滤波器寻找图像中梯度变化明显的部分。
2)、亚像素级边缘提取:学会完成亚像素边缘提取、轮廓合并以及XLD轮廓输出。
3)、轮廓处理:学会轮廓的生成、分割、筛选、连接以及拟合操作。
一、像素级边缘提取
像素级边缘提取,直观地说,也就是颜色的边缘提取。传统的颜色边缘检测方法是使用边缘滤波器,这些滤波器通过寻找较亮和较暗的区域边界像素点的方式提取边缘,即使用这些滤波器寻找图像中梯度变化明显的部分。这些梯度一般描述为边缘的振幅和方向。将边缘振幅高的所有像素选择出来,就完成了区域的边缘轮廓提取。
Halcon也提供了许多标准的边缘滤波器,如Sobel、Roberts、Robinson和Frei滤波器。此外,还提供了非极大值抑制算子,用于进行提取边缘后的处理。
1.经典的边缘检测算子
关于边缘检测,有许多经典的算子,各大图形处理库都有各自的边缘检测算子,这里简要介绍几种。
1)、1.Sobel 算子
Sobel算子结合了高斯平滑和微分求导。它是一阶导数的边缘检测算子,使用卷积核对图像中的每个像素点做卷积和运算,然后采用合适的阈值提取边缘。Soble算子有两个卷积核,分别对应x与y两个方向。其计算过程如下。
a)、分别在x和y两个方向求导。
b)、在图像的每一个像素点上,结合以上两个结果求出近似梯度。
2)、Laplace 算子
Laplace算子是一种二阶导数算子。在图像的边缘区域,像素值会发生比较大的变化,对这些像素求导会出现极值。在这些极值位置,其二阶导数为0,所以也可以用二阶导数来检测图像边缘。
3)、Canny 算子
Canny算子的基本思想是寻找梯度的局部最大值。首先使用高斯平滑滤波器卷积降噪,再用一对卷积阵列计算边缘梯度和方向,然后使用非极大值抑制移除非边缘线条,最后使用滞后阈值(高阈值和低阈值)检测并连接边缘。
对比上述3种算子,有如下总结。
a)、Sobel算子在边缘检测的同时尽量减少了噪声的影响,比较容易实现。它对像素位置的影响进行了加权,因此效果比较好,是很常用的边缘检测方法。
b)、Laplace算子是一种各向同性算子,比较适用于只关心边缘的位置而不考虑其周围像素的灰度差值的情况。Laplace算子对孤立像素的响应要比对边缘或线的响应更强烈,因此只适用于无噪声图像。存在噪声的情况下,使用Laplace算子进行边缘检测之前需要先进行低通滤波处理。
c)、Canny 算子是目前理论上相对最完善的一种边缘检测算法,但其也存在不足之处:为了得到较好的边缘检测结果,它通常需要使用较大的滤波尺度,这样容易丢失一些细节。
2.边缘检测的一般流程
边缘检测的一般流程如下。
a)、获取图像。
b)、选择感兴趣区域。这是为了减少计算量,加快处理速度。
c)、图像滤波。对输入图像使用边缘滤波器是采集后的一个关键步骤,为了获取图像的边缘部分,在读取了输入图像之后,可以使用边缘滤波器获取边缘的梯度和方向。对于像素级边缘,Halcon中提供了常用算子,如 sobel_amp、sobel_dir、edges_image、derivate_gauss、edges_color等。
d)、提取边缘。将符合条件的边缘提取出来,应用滤波器之后,可以使用阈值处理将图像中的高亮边缘提取出来。这里可以使用前文介绍的threshold算子,也可以使用hysteresis_threshold 算子减少非关键的边缘,将符合条件的边缘提取出来。还可以进一步对结果进行非极大值抑制,然后使用skeleton 算子将边缘绘制出来。
e)、边缘处理。根据检测的需要对提取出的边缘进行处理,有时得到的边缘可能会比较粗略,往往大于1个像素,需要进行一些细化;有时得到的边缘并不连续,因此还需要对边缘做一些处理,如生成轮廓、合并非连续的边缘、分离背景等。
f)、显示结果。将结果绘制在窗口中,以表现直观的边缘提取效果。
3.sobel_amp 算子
Halcon提供了大量的边缘滤波器,最常用的是Sobel滤波器。它是一种经典的边缘检测算子,速度和效率都非常令人满意。其在Halcon中对应的算子为sobel_amp算子和sobel_dir算子,二者都是使用Sobel算子进行边缘检测。前者用于计算边缘的梯度,后者除了能表示梯度外,还能表示边缘的方向,本小节主要介绍sobel_amp算子。
下面以一个简单的例子说明sobel_amp算子的用法。该例子输入的是一幅灰度值图像,读取图像后,使用sobel_amp 算子进行边缘滤波。滤波类型参数选择sum_abs,以获得细节比较多的边缘;然后通过阈值处理选择符合梯度阈值的区域,提取出的区域宽度大于1个像素;最后使用skeleton算子将边缘框架显示出来,如下图所示。
上述过程的实现代码如下:
read_image (Image,' data/flower')
rgb1_to_gray (Image,,GrayImage)
sobel_amp (GrayImage,Amp, ' sum_abs',3)
threshold (Amp,Edg,100,255)
skeleton (Edg, Skeleton)
dev clear window ()
dev_display (Skeleton)
该例子使用sobel_amp 算子对灰度图像进行了边缘检测,选择了sum_abs类型的滤波器,并将带有边缘梯度的图像Amp输出。第4行通过阈值处理去除一些非关键的轮廓点和线,第5行使用skeleton提取区域的框架。由上图可知,前景目标的轮廓基本都被提取出来了。
sobel_amp 算子是一种常用的边缘滤波器,该算子是一阶导数的边缘检测算子,使用一个卷积核对图像中的每个像素点做卷积运算,然后采用合适的阈值提取边缘。根据滤波器的不同,卷积核的运算方式也不同。该算子的原型如下:
sobel_amp(Image : EdgeAmplitude : FilterType, Size : )
其各参数含义如下。
参数1:Image为输入的图像,这里是单通道图像。
参数2:EdgeAmplitude 为输出参数,是带有边缘梯度的图像。
参数3:FilterType为输入参数,表示卷积核或滤波器的类型。
参数4:Size为输入参数,表示滤波器的尺寸。该参数值越大,得到的边缘线条会越粗,细节越少。这个值一般为单数,默认为3,也可以根据图像的检测需要选择合适的奇数。
这里的FilterType是基于两种滤波器掩膜的,它决定了卷积的计算方式。假设两个卷积的滤波掩膜矩阵是A和B,其中
掩模矩阵可以理解为内核或者结构元素,A和B分别表示图像与两种波滤器掩膜进行卷积操作的结果。
FilterType有几种可供选择的值,如 sum_abs、sum_sqrt、sum_sqrt_binomial、thin_max_abs、thin_sum_abs、x、y等。下面在代码中分别测试了几种不同类型的滤波器对同一图像进行边缘检测的结果,如下图所示。输入图像仍为上面左图所示的灰度图像。下图(a)~(f)分别为sobel_amp 算子中的 FilterType参数值为sum_abs、thin_sum_abs、thin_max_abs、sum_sqrt、x、y时的计算结果。
参考文献
1、Halcon机器视觉算法原理与编程实战/杨青编著.北京大学出版社
文章出处登录后可见!