【机械视觉】Halcon—【十二、边缘提取】
【机械视觉】Halcon—【十二、边缘提取】
目录
【机械视觉】Halcon—【十二、边缘提取】
Halcon边缘提取算子详解与应用场景
1. 一阶导数边缘检测算子
(1) Sobel算子
(2) Prewitt算子
(3) Roberts算子
2. 二阶导数边缘检测算子
(1) Laplacian算子
3. Canny边缘检测(最优边缘检测)
4. 亚像素级边缘检测
(1) edges_sub_pix
(2) lines_gauss(高斯线检测)
5. 其他边缘检测算子
(1) Frei-Chen算子
(2) Kirsch算子
总结:如何选择合适的边缘检测算子?
例子
区域增长原理
Halcon边缘提取算子详解与应用场景
Halcon提供了多种边缘提取方法,包括一阶导数算子(如Sobel、Prewitt、Roberts)、二阶导数算子(如Laplacian)、Canny边缘检测、亚像素级边缘检测等。不同算子适用于不同场景,如工业检测(高精度测量)、医学图像分析(弱边缘提取)、自动驾驶(实时边缘检测)等。
1. 一阶导数边缘检测算子
基于梯度计算,适用于快速边缘检测,但对噪声较敏感。
(1) Sobel算子
函数:
sobel_amp(Image, EdgeAmplitude, FilterType, Size) % 计算梯度幅值
sobel_dir(Image, EdgeAmplitude, EdgeDirection, FilterType, Size) % 计算梯度幅值和方向
参数说明:
-
FilterType
:滤波方式('sum_abs'
绝对值求和、'sum_sqrt'
平方和开方、'thin_max'
最大梯度) -
Size
:卷积核大小(3、5、7、9等,越大抗噪性越强但边缘越模糊)
特点:
-
计算水平和垂直方向的梯度,适合检测垂直和水平边缘。
-
对噪声有一定的平滑作用,但不如高斯类算子(如Canny)。
应用场景:
-
工业检测(如PCB板边缘、零件轮廓)
-
快速边缘提取(实时性要求较高的场景)
(2) Prewitt算子
函数:
prewitt_amp(Image, EdgeAmplitude) % 计算梯度幅值
prewitt_dir(Image, EdgeAmplitude, EdgeDirection) % 计算梯度幅值和方向
特点:
-
类似Sobel,但卷积核不同(Sobel更注重中心像素,Prewitt更平均)。
-
计算速度较快,但边缘定位精度略低于Sobel。
应用场景:
-
医学图像边缘检测(如X光片中的骨骼轮廓)
-
简单场景下的快速边缘提取(如文档扫描)
(3) Roberts算子
函数:
roberts(Image, EdgeAmplitude, FilterType)
参数说明:
-
FilterType
:'roberts_max'
(取最大值)、'roberts_sum'
(求和)
特点:
-
使用2×2卷积核,计算简单,但对噪声敏感。
-
适合高对比度图像的边缘检测。
应用场景:
-
高对比度图像(如黑白条形码、二维码)
-
计算资源受限的嵌入式设备(如小型工业相机)
2. 二阶导数边缘检测算子
基于二阶微分(Laplacian),检测灰度突变点(过零点),对噪声敏感,通常需要先做高斯平滑。
(1) Laplacian算子
函数:
laplace(Image, ImageLaplace, ResultType, MaskSize, FilterMask)
参数说明:
-
ResultType
:输出类型('byte'
、'int2'
等) -
MaskSize
:卷积核大小(3、5、7等) -
FilterMask
:'positive'
(正Laplacian)、'negative'
(负Laplacian)
特点:
-
对噪声敏感,通常需要先做高斯滤波(
gauss_filter
)。 -
能检测边缘的过零点,但边缘较粗。
应用场景:
-
边缘增强(如指纹识别)
-
结合高斯滤波用于LOG(Laplacian of Gaussian)边缘检测
3. Canny边缘检测(最优边缘检测)
Canny是最经典的边缘检测方法,包括高斯平滑→梯度计算→非极大值抑制→双阈值检测。
函数:
edges_image(Image, ImaAmp, ImaDir, Filter, Alpha, NMS, Low, High)
参数说明:
-
Filter
:滤波器类型('canny'
、'deriche1'
、'deriche2'
、'lanser1'
、'lanser2'
) -
Alpha
:平滑系数(越小越平滑,推荐0.5~2.0) -
NMS
:非极大值抑制('nms'
启用,'none'
禁用) -
Low
、High
:滞后阈值(低阈值用于弱边缘,高阈值用于强边缘)
特点:
-
抗噪能力强(高斯平滑)。
-
边缘连续性好(双阈值连接)。
-
计算量较大(相比Sobel)。
应用场景:
-
高精度工业检测(如半导体晶圆缺陷检测)
-
自动驾驶(车道线检测)
-
医学图像(血管分割)
4. 亚像素级边缘检测
适用于高精度测量,返回XLD(亚像素轮廓),可用于Halcon的几何测量(如measure_pos
)。
(1) edges_sub_pix
函数:
edges_sub_pix(Image, Edges, Filter, Alpha, Low, High)
参数说明:
-
Filter
:'canny'
、'lanser2'
、'deriche2'
等 -
Alpha
:平滑系数(推荐1.0~2.0) -
Low
、High
:双阈值
特点:
-
亚像素精度(精度可达0.1像素)。
-
输出XLD轮廓,可用于拟合直线、圆等几何形状。
应用场景:
-
精密尺寸测量(如齿轮齿距、PCB线宽)
-
3D视觉(结构光边缘提取)
(2) lines_gauss(高斯线检测)
函数:
lines_gauss(Image, Lines, Sigma, Low, High, LightDark, ExtractWidth, LineModel, CompleteJunctions)
参数说明:
-
Sigma
:高斯平滑系数(越大越平滑) -
LightDark
:'light'
(亮线)、'dark'
(暗线) -
ExtractWidth
:是否提取线宽('true'
/'false'
)
特点:
-
适用于细线检测(如电路板走线、纤维检测)。
-
可返回线的宽度信息。
应用场景:
-
FPC柔性电路板检测
-
纺织行业(纤维直径测量)
5. 其他边缘检测算子
(1) Frei-Chen算子
函数:
frei_amp(Image, EdgeAmplitude) % 幅值
frei_dir(Image, EdgeAmplitude, EdgeDirection) % 幅值+方向
特点:
-
对斜边缘响应更好,计算速度较快。
(2) Kirsch算子
函数:
kirsch_amp(Image, EdgeAmplitude) % 幅值
kirsch_dir(Image, EdgeAmplitude, EdgeDirection) % 幅值+方向
特点:
-
使用8方向模板,适合复杂边缘检测。
总结:如何选择合适的边缘检测算子?
算子 | 特点 | 适用场景 |
---|---|---|
Sobel | 计算快,适合水平和垂直边缘 | PCB检测、简单轮廓提取 |
Prewitt | 类似Sobel,但更平均 | 医学图像、文档扫描 |
Roberts | 2×2卷积核,计算快但噪声敏感 | 高对比度图像(条形码) |
Laplacian | 二阶微分,需高斯平滑 | 边缘增强(指纹识别) |
Canny | 最优边缘检测,抗噪强 | 高精度工业检测、自动驾驶 |
edges_sub_pix | 亚像素精度,XLD输出 | 精密尺寸测量(齿轮、PCB) |
lines_gauss | 高斯线检测,可测线宽 | 电路板走线、纤维检测 |
推荐选择:
-
实时检测 → Sobel / Prewitt
-
高精度测量 → Canny / edges_sub_pix
-
细线检测 → lines_gauss
-
抗噪需求高 → Canny / Deriche滤波器
例子
read_image (Image, 'fabrik')
get_image_size (Image, Width, Height)
dev_close_window ()
dev_open_window (0, 0, Width, Height, 'black', WindowHandle)
dev_display (Image)*边缘提取
*参数3 提取边缘的算法
*'sum_abs':水平梯度和竖直梯度绝对值和 + 5 一般检测
* sum_sqrt:水平梯度和竖直梯度平方根和 + 3 精细检测
* sum_abs':水平梯度和竖直梯度绝对值和 + 7 抗噪检测
*参数4 滤波核的大小
sobel_amp (Image, EdgeAmplitude, 'sum_abs', 5)*laplace 计算图像的时候采用的拉普拉斯算子,可以增强边缘细节,主要边缘检测和图像锐化
*'absolute' 输出图像都是正直 'signed' 保留正负值
*MaskSize:滤波核 尺寸 写成奇数
*'n_4' 4邻域的矩阵 +size5/7 抗噪检测
*'n_8' 8邻域矩阵 + size3 精细检测
laplace (Image, ImageLaplace, 'signed', 5, 'n_8')*该算子特点对噪声比较敏感。建议先平滑操作
prewitt_amp (Image, ImageEdgeAmp)threshold (ImageEdgeAmp, Region, 20, 255)
dev_set_color ('green')
*骨骼化操作:可以将一个区域缩减为单像素宽的骨架进行表示,同时保留原始区域拓扑结构和特征结构
skeleton (Region, Skeleton)
dev_display (Skeleton)
区域增长原理
以坐标为种子坐标,向四周进行搜索,寻找合适的区域,这个区域满足灰度值与当前的均值图
read_image (Image, 'fabrik')
*对图像进行中值处理,以2为半径的圆所有像素中间值
median_image (Image, ImageMedian, 'circle', 2, 'mirrored')
regiongrowing (ImageMedian, Regions, 1, 1, 2, 5000)
*提取区域的中心点的区域
shape_trans (Regions, RegionTrans, 'inner_center')
connection (RegionTrans, ConnectedRegions)
*获取提取区域的中心点坐标
area_center (ConnectedRegions, Area, Row, Column)*regiongrowing_mean:以坐标为种子坐标,向四周进行搜索,寻找合适的区域,这个区域满足灰度值与当前的均值图
*对应的区域的灰度值差小于5的,并且区域像素数大于100*参数1 按照中值滤波进行平滑
*参数2 Regions1 输出的区域
*参数3 参数4Row, Column种子生在点坐标
*参数5 灰度值差异值
*参数6 过滤的面积
regiongrowing_mean (ImageMedian, Regions1, Row, Column, 25, 100)*种子点选择在图像的左上角,逐行扫描像素点 ,比较的是相邻的1*1像素,如果像素灰度值差异小于2,归为一个区域
*regiongrowing (ImageMedian, Regions, 1, 1, 2, 5000)