Halcon —— 边缘检测算子详解

一、算子介绍

1.1 种类
halcon内常用的边缘检测算子包括如下几种:
1.edges_image: 提取2D 图像边缘
2.edges_sub_pix:提取2D图像亚像素边缘
3.edges_object_model_3d :提取3D图像边缘
4.edges_color和edges_color_sub_pix:提取彩色图像边缘
1.2 区别
edges_image可选择多种边缘检测算法来提取物体边缘,其与亚像素边缘算子的区别在于edges_image提取是以像素为单位的边缘特征,edges_sub_pix是以比像素还小的单位来提取的边缘,一般采用矩方法,插值法和拟合法。

二、详解

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

该算子内主要参数包括:
ImaDir(图像边缘方向,对sobel_fast算法无用,因为其不计算方向信息)
Filter(边缘算子,包括’canny’, ‘deriche1’, ‘deriche1_int4’, ‘deriche2’, ‘deriche2_int4’, ‘lanser1’, ‘lanser2’, ‘mshen’, ‘shen’, ‘sobel_fast’)
Alpha(过滤器参数,小的值导致强平滑,但是更少的细节(canny算子相反))
NMS(非最大值抑制(设置为none,表示不需要使用该值))
Low(滞后阈值操作的下阈值(如果不需要阈值设置,则为负值))
High(滞后阈值操作的上阈值(如果不需要阈值设置,则为负值))
2.2 边缘检测算法
对于算法来讲,目前canny算子是最稳定的边缘检测方法。
canny算法由边缘强度、边缘细化(NMS)、滞后阈值三个阶段组成。
首先,边缘强度的计算是计算图像梯度:梯度幅值矩阵、梯度方向矩阵:
1)图像灰度化
2)高斯滤波
3)sobel滤波器求出x,y方向上梯度图像,记为fx、fy
4)利用fx、fy求出梯度幅值和梯度的方向
5)此时的梯度方向为[-90,+90]之间的任意值,将它们规则化为四类种0、45、90、135度。
然后,计算非最大值抑制(NMS),我们根据已经规则化的方向矩阵中存储的方向先分类,之后比较相同方向上的三颗像素,确保中间像素的值最大,否则将它置零,最后得出了清洗过的梯度幅值矩阵。
最后,继续处理梯度幅值矩阵,根据设定高阈值high、低阈值low将图像分成三部分:
1.梯度幅值大于high的像素,将值置为255;
2.梯度幅值小于low的像素,将值置为0;
3.梯度幅值在中间的像素,用它的8邻域判断,邻域内若有值大于high,则将中间的像素置为255;
下面对涉及
下面结合程序对每种滤波算法进行演示讲解:

read_image (I, 'C:/Users/Administrator/Desktop/a.png')
dev_close_window ()
dev_open_window(0, 0, 512, 512, 'black', WindowHandle)
get_image_size (I, Width, Height)
dev_set_window_extents (0, 0, Width, Height)
rgb1_to_gray(I, GrayImage)
*dev_set_lut ('change2')
*设置滞后阈值为默认值
*滤波参数值Alpha
*设置滞后阈值必须大于0,小于255,值越小细节越多,但同时会带来很多不需要的边缘信息。
*值越大则会丢失边缘,很多边缘点值都会被设置为0。
edges_image(GrayImage, ImaAmp, ImaDir, 'canny', 1, 'nms', 20, 40)
dev_display(ImaAmp)

在这里插入图片描述
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/baidu_35536188/article/details/112351198