Halcon 第四章『图像特征和提取』◆第4节:像素级边缘提取

        第4节:像素级边缘提取&相关算子

        含义:就是颜色边缘提取。颜色边缘检测方法是使用边缘滤波器,这些滤波器通过寻找较亮和较暗的区域边界像素点的方式提取边缘,滤波器寻找图像中梯度变化明显的部分。这些梯度一般描述为边缘的振幅和方向。将边缘振幅高的所有像素选择出来,就完成了区域的边缘轮廓提取。对比上述3种算子,有如下总结。

        1、边缘检测的一般流程

        ①获取图像。

        ②选择感兴趣区域。这是为了减少计算量,加快计算速度。

        ③图像滤波。对输入图像使用边缘滤波器是采集后的一个关键步骤,为了获取图像的边缘部分,在读取了输入图像后,可以使用边缘滤波器获取边缘的梯度和方向。

        ④提取边缘。将符合条件的边缘提取出来,应用滤波器之后,可以使用阈值处理将图像中的高亮边缘提取出来。而后可以用threshold减少非关键边缘,skeleton绘制边缘。

        ⑤边缘处理。根据检测的需要对提取出的边缘进行处理,有时得到的边缘可能会比较粗略,往往大于一个像素,需要进行一些细化;有时得到的边缘并不连续,因此还需要对边缘做一些处理,如生成轮廓、合并非连续的边缘、分离背景等。

        ⑥显示结果。

        2、常用的边缘提取算子

        ①Sobel算子

        一阶导数的边缘检测算子。结合了高斯平滑和微分求导,使用卷积核对图像中的每个像素点做卷积核运算,然后采用合适的阈值提取边缘。

        Sobel算子不仅提取的边缘图像清晰,而且使用简单,抗噪声能力很强。

        Sobel算子的卷积核对应的是x与y两个方向,分别在x和y方向上求导,在每个像素点上,结合以上两个结果再求出近似梯度。

        其卷积核如下:

         sobel_amp的算子的滤波器类型及其计算方式如下:

        如何求滤波器内a、b的值,举例说明:

结合卷积核A、B,则:

a=1×94+2×156+1×202+0×84+0×119+0×140+(-1)×61+(-2)×68+(-1)×73 = 338

b=1×94+0×156+(-1)×202+2×84+0×119+(-2)×140+1×61+0×68+(-1)×73 = -232

那么求中间点的sum_abs,尺寸为3 的值为(|338|+|-232|)÷4=142.5

结果如下:

        对于尺寸为3x3的Sobel算子,直接应用相应的滤波器A和B,而对于较大的滤波器尺寸,首先使用尺寸为Size-2的高斯滤波器(参见gauss_image)或二项式滤波器(参见binomial_filter)对输入图像进行平滑处理。

        如果为高斯滤波器,则Size = 5,7,9,11,13。

        如果为二项式滤波器(即后面有_binomial),则Size =  5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31, 33, 35, 37, 39。且二项式滤波器只能用于byte,uint2和real类型的图像,由于平滑减小了边缘幅度,在这种情况下,边缘幅度乘以因子2以防止信息丢失。       

        Sobel算子的梯度方向θ=arctan(a/b)

        Filters滤波器 / Edges图像边缘处理

        使用Sobel算子计算图像中像素的梯度大小(边缘幅度)

sobel_amp(Image : EdgeAmplitude : FilterType, Size : )

        Image:输入参数,输入单通道图像。

        EdgeAmplitude:输出参数,输出带有边缘梯度的图像。

        FilterType:输入参数,表示滤波器的类型。

【 

 'sum_abs',

'sum_abs_binomial', 二项式滤波器

'sum_sqrt',

'sum_sqrt_binomial', 二项式滤波器

'thin_max_abs',

'thin_max_abs_binomial', 二项式滤波器

'thin_sum_abs',

'thin_sum_abs_binomial', 二项式滤波器

'x',

'y',

'x_binomial', 二项式滤波器

'y_binomial'二项式滤波器

        Size:输入参数,滤波器尺寸。该参数值越大,得到的边缘线条会越粗,细节越少。这个值一般为单数,默认为3。【 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31, 33, 35, 37, 39】

        Filters滤波器 / Edges图像边缘处理

        使用Sobel算子计算图像中像素的梯度和方向(幅值和相位)

sobel_dir(Image : EdgeAmplitude, EdgeDirection : FilterType, Size : )

        Image:输入参数,输入单通道图像。

        EdgeAmplitude:输出参数,输出带有边缘梯度的图像。

        EdgeDirection:输出参数输出带有边缘方向的图像。

        FilterType:输入参数,滤波器类型。【'sum_abs', 'sum_sqrt', 'sum_abs_binomial', 'sum_sqrt_binomial'】

        Size:输入参数,滤波器尺寸。(应用规则同sobel_amp)

read_image(Image,'data/flower')
rgb1_to_gray (Image, GrayImage)
sobel_amp(GrayImage,Amp1,'sum_abs',3)
sobel_amp(GrayImage,Amp2,'thin_sum_abs',3)
sobel_amp(GrayImage,Amp3,'thin_max_abs',3)
sobel_amp(GrayImage,Amp4,'sum_sqrt',3)
sobel_amp(GrayImage,Amp5,'x',3)
sobel_amp(GrayImage,Amp6,'y',3)
*
sobel_amp(GrayImage,Amp11,'sum_abs_binomial',9)
sobel_amp(GrayImage,Amp12,'thin_sum_abs_binomial',9)
sobel_amp(GrayImage,Amp13,'thin_max_abs_binomial',9)
sobel_amp(GrayImage,Amp14,'sum_sqrt_binomial',9)
sobel_amp(GrayImage,Amp15,'x_binomial',9)
sobel_amp(GrayImage,Amp16,'y_binomial',9)
原图
灰度图
'sum_abs',3
'thin_sum_abs',3
'thin_max_abs',3
'sum_sqrt',3
'x',3
'y',3
'sum_abs_binomial',9
'thin_sum_abs_binomial',9
'thin_max_abs_binomial',9
'sum_sqrt_binomial',9
'x_binomial',9
'y_binomial',9

        ②Laplace算子

        二阶导数的边缘检测算子。在图像的边缘地区,像素值会发生比较大的变化,对这些像素求导会出现极值。这些极值的位置,其二阶导数为0,就是会在边缘产生零点,因此该算子常常与zero_crossing算子配合使用。求出这些零点,就可以得到图像的边缘。

        Filters滤波器 / Edges图像边缘处理

        用有限差分法计算拉普拉斯算子

        由于Laplace算子对孤立像素的响应要比对边缘或线的响应更强烈,因此在检测之前应先进行去噪处理。

laplace(Image : ImageLaplace : ResultType, MaskSize, FilterMask : )

        Image:输入参数,输入图像,可以是多通道图像。

        ImageLaplace:输出参数,输出的Laplace图像。

        ResultType:输入参数,输入图像的类型。

        MaskSize:输入参数,输入滤波器的核的尺寸。

        FilterMask:输入参数,表示Laplace算子使用的滤波核或者掩膜的类型。

        Filters滤波器 / Edges图像边缘处理

        高斯-拉普拉斯算子

        由于图像中一般会存在噪声,而Laplace算子对噪声比较敏感,因此需要配合使用图像的平滑操作。高斯-拉普拉斯算子将高斯的低通滤波器和Laplace算子进行结合,就能得到较为理想的结果。

laplace_of_gauss(Image : ImageLaplace : Sigma : )

        Image:输入参数,输入图像,可以是多通道图像。

        ImageLaplace:输出参数,输出经过计算滤波后的图像。

        Sigma:输入参数,高斯平滑参数,这个值越大,平滑力度越大,图像越模糊。默认2.0,建议值0.5, 1.0, 1.5, 2.0, 2.5, 3.0, 4.0, 5.0, 7.0,范围值Sigma > 0.7 && Sigma <= 25.0。

        ③Canny算子

        一阶导数的边缘检测算子。

        它先是用高斯滤波对图像进行降噪处理,然后使用4个模板分别检测水平,垂直以及对角线方向的梯度以及边缘方向。最后,用两个阈值:高阈值和低阈值来跟踪边缘,即从一个较大的阈值开始,标识出比较确信的真实边缘,再根据前面导出的方向信息,使用一个较小的阈值,检测出潜在的边缘,最后,通过抑制孤立的弱边缘完成边缘检测。

        Filters滤波器 / Edges图像边缘处理

        使用Deriche, Lanser, Shen或者Canny滤波器提取边缘

edges_image(Image : ImaAmp, ImaDir : Filter, Alpha, NMS, Low, High : )

        Image:输入参数,输入单通道图像或多通道图像。

        ImaAmp:输出参数输出边缘梯度 单/多通道图像。

        ImaDir:输出参数输出边缘方向的图像,转换数据。

        Filter:输入参数,选择的滤波算子。默认canny。【 'canny', 'deriche1', 'deriche1_int4', 'deriche2', 'deriche2_int4', 'lanser1', 'lanser2', 'mshen', 'shen', 'sobel_fast'】

        Alpha:输入参数,表示平滑程度。值越小,表示平滑的程度越大。默认1.0,【Alpha > 0.0】

        NMS:输入参数,表示非极大值抑制,使用可以使模糊的边界变得清晰,因为这步操作只留下边缘上梯度强度最大的点。默认nms,【'hvnms', 'inms', 'nms', 'none'不使用非极大值抑制】

        nms=Non-Maximum Suppression

        Low,High:输入参数,表示滞后阈值的低阈值和高阈值。边缘梯度比高阈值大的部分是可以被接受的;低于低阈值的部分将被排除;介于两者之间的,要看该像素是否与边缘点相连,相连的可以认为是边缘。

        默认:40,【 High > 1 || High < 0 && High >= Low】。

        Filters滤波器 / Edges图像边缘处理

        使用Canny, Deriche或Shen滤波器提取颜色边缘

edges_color(Image : ImaAmp, ImaDir : Filter, Alpha, NMS, Low, High : )

        Image:输入参数,可以输入彩色图像

        其它参数与edges_image一样。

dev_open_window (0, 0, 512, 512, 'black', WindowHandle1)
read_image(Image,'data/flower')
rgb1_to_gray (Image, Snowcity)
*未使用非极大值抑制
edges_image (Snowcity, T1, T11, 'canny', 1, 'none', -1, -1)
*使用了非极大值抑制
edges_image (Snowcity, T2, T21, 'canny', 1, 'nms',20, 40) 
*对使用了非极大值抑制后的边缘梯度图像进行了阈值处理
threshold (ImaAmpGrayNMS, RegionGray, 1, 255) 
NMS=‘none’
NMS=‘nms'

        Sobel算子在边缘检测的同时尽量减少了噪声的影响,比较容易实现。它对像素位置的影响进行了加权,因此效果比较好,是很常用的边缘检测方法。

        Laplace算子是一种各向同性算子,比较适用于只关心边缘的位置而不考虑其周围像素的灰度差值的情况。Laplace算子对孤立像素的响应要比对边缘或线的响应更强烈,因此只适用于无噪声图像。存在噪声的情况下,使用Laplace算子进行边缘检测之前需要先进行低通滤波处理。

        Canny算子是目前理论上相对最完善的一种边缘检测算法,但其也存在不足之处。为了得到较好的边缘检测结果,它通常需要使用较大的滤波尺度,这样容易丢失一些细节。

        ④Roberts算子

        一阶导数的边缘检测算子。利用对角的四个像素的交叉差分来计算得到像素点的导数。

        Roberts算子利用局部差分算子寻找边缘,边缘定位精度较高,但容易丢失一部分边缘,不具备抑制噪声的能力。该算子对具有陡峭边缘且含噪声少的图像效果较好,尤其是边缘正负45度较多的图像,但定位准确率较差;

        Filters滤波器 / Edges图像边缘处理

        使用Roberts滤波器检测边缘

roberts(Image : ImageRoberts : FilterType : )

        Image:输入参数,输入图像。

        ImageRoberts:输出参数,输出图像。

        FilterType:输入参数,角点导数的计算方式【'gradient_max', 'gradient_sum', 'roberts_max'】

        ⑤Prewitt算子

一阶导数的边缘检测算子。目的是为了更加抗噪,同时使边缘更加清晰,在边缘为平滑且要求精度不高时被广泛应用,适合用来识别噪声较多、灰度渐变的图像。

        Prewitt算子对灰度渐变的图像边缘提取效果较好,而没有考虑相邻点的距离远近对当前像素点的影响,与Sobel 算子类似,不同的是在平滑部分的权重大小有些差异;

        Filters滤波器 / Edges图像边缘处理

        使用Prewitt算子计算图像中像素的梯度大小

prewitt_amp(Image : ImageEdgeAmp : : )

        Filters滤波器 / Edges图像边缘处理

        使用Prewitt算子计算图像中像素的梯度方向

prewitt_dir(Image : ImageEdgeAmp, ImageEdgeDir : : )

        ⑥Kirsch算子

        一阶导数的边缘检测算子。

        Kirsch算子是R.Kirsch提出来一种边缘检测新算法,它采用8个模板对图像上的每一个像素点进行卷积求导数,这8个模板代表8个方向,对图像上的8个特定边缘方向作出最大响应,运算中取最大值作为图像的边缘输出。

        Filters滤波器 / Edges图像边缘处理

        使用Kirsch算子计算图像中像素的梯度大小

kirsch_amp(Image : ImageEdgeAmp : : )

        Filters滤波器 / Edges图像边缘处理

        使用Kirsch算子计算图像中像素的梯度方向

kirsch_dir(Image : ImageEdgeAmp, ImageEdgeDir : : )

        ⑦Frei算子

        一阶导数的边缘检测算子。

        Filters滤波器 / Edges图像边缘处理

        使用Frei算子计算图像中像素的梯度大小

frei_amp(Image : ImageEdgeAmp : : )

        Filters滤波器 / Edges图像边缘处理

        使用Frei算子计算图像中像素的梯度方向

frei_dir(Image : ImageEdgeAmp, ImageEdgeDir : : )

        ⑧derivate_gauss算子

        不仅可以提取图像边缘,还可以平滑图像、检测图像上的角点。

        Filters滤波器 / Edges图像边缘处理

        将图像与高斯函数的导数进行卷积。

derivate_gauss(Image : DerivGauss : Sigma, Component : )

        Image:输入参数,输入的灰度图像。

        DerivGauss:输出参数,输出滤波后的图像。

        Sigma:输入参数,输入的高斯导数sigma值。

        Component:输入参数,输入要计算的导数或者特征。

'none', 仅对图像进行平滑处理。

'x', 沿着x轴的方向求导。

'y', 沿着y轴的方向求导。

'gradient', 求梯度的绝对值。

'gradient_dir', 求梯度的方向。

'xx', 沿着x轴方向二阶求导。

'yy', 沿着y轴方向二阶求导。

'xy', 沿着x轴和y轴方向二阶求导。

'xxx', 沿着x轴方向三阶求导。

'yyy', 沿着y轴方向三阶求导。

'xxy', 沿着xxy方向三阶求导。

'xyy', 沿着xyy方向三阶求导。

'laplace' 使用laplace算子求导。

】。

        结尾:Halcon中提取边缘的算子有很多,我们在选择的时候,需要考虑实际使用过程中,图像的干扰因素,是不是有很多噪声,或者图像打光不均匀等问题,如果图像很理想,夸张的说随便一个边缘算子都能够提取很完整的边缘。所以,在一开始学的时候,不需要太深入,大致先了解每个边缘提取的特点和在什么情况下使用即可。

参考文献:

杨青—《Halcon机器视觉算法原理与编程实战》

郭森—《工业机器视觉基础教程 HALCON篇》

数字图像处理(19): 边缘检测算子(Roberts算子、Prewitt算子、Sobel算子 和 Laplacian算子)https://blog.csdn.net/zaishuiyifangxym/article/details/89840396

  • 4
    点赞
  • 48
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值