在 Halcon 中,边缘提取是图像处理中的关键任务,常用的算子包括 Sobel、Laplace 和 Prewitt。以下是这三种方法的详细说明和实现方式。
Sobel 边缘提取
Sobel 算子通过计算图像的水平方向和垂直方向的梯度来检测边缘。Halcon 中可以使用 sobel_amp
或 sobel_dir
实现。
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)
sobel_amp
输出边缘的幅度。sobel_dir
输出边缘的方向和幅度。- 参数
'sum_abs'
表示使用绝对值求和计算梯度。 - 参数
3
表示 Sobel 核的大小。
Laplace 边缘提取
Laplace 算子通过计算二阶导数来检测边缘,适合检测细小的边缘或噪声。Halcon 中可以使用 laplace
或 laplace_of_gauss
。
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)
*laplace 计算图像的时候采用的拉普拉斯算子,可以增强边缘细节,主要边缘检测和图像锐化
*'absolute' 输出图像都是正直 'signed' 保留正负值
*MaskSize:滤波核 尺寸 写成奇数
*'n_4' 4邻域的矩阵 +size5/7 抗噪检测
*'n_8' 8邻域矩阵 + size3 精细检测
laplace (Image, ImageLaplace, 'signed', 5, 'n_8')
laplace
直接计算二阶导数。laplace_of_gauss
结合高斯滤波和 Laplace 算子,参数2.0
是高斯标准差。
Prewitt 边缘提取
Prewitt 算子类似于 Sobel,但使用不同的卷积核。Halcon 中可以使用 prewitt_amp
或 prewitt_dir
。
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)
*该算子特点对噪声比较敏感。建议先平滑操作
prewitt_amp (Image, ImageEdgeAmp)
prewitt_amp
输出边缘幅度。prewitt_dir
输出边缘方向和幅度。- 参数
'sum_abs'
表示使用绝对值求和计算梯度。
halcon骨骼化操作
Halcon中的骨骼化操作通常用于图像处理中的形态学分析,主要目的是提取目标区域的骨架结构。骨骼化可以通过多种算子实现,具体方法如下:
使用skeleton
算子
skeleton
是Halcon中最直接的骨骼化算子,适用于二值图像处理。该算子通过迭代腐蚀操作保留目标的中心线骨架。
threshold (ImageEdgeAmp, Region, 20, 255)
dev_set_color ('green')
*骨骼化操作:可以将一个区域缩减为单像素宽的骨架进行表示,同时保留原始区域拓扑结构和特征结构
skeleton (Region, Skeleton)
dev_display (Skeleton)
参数调整建议
- 对于细长目标,建议使用较小的结构元素尺寸
- 复杂形状目标可能需要多次迭代骨骼化操作
- 骨骼化前进行适当的平滑处理可以减少分支数量
骨骼化操作的结果可用于后续的特征提取、长度测量或缺陷检测等高级分析任务。