一、基本功能
lines_gauss算子能够准确地检测出图像中的线条,并且可以提供亚像素精度的线条轮廓。这使得它在视觉表面检测、图像处理、机器视觉等领域具有广泛的应用。
二、参数说明
lines_gauss算子的参数列表如下:
- Image:输入图像,应为二值图像或灰度图像。
- Lines:输出的线条,以亚像素精度的XLD(Extended Line Description)轮廓形式表示。
- Sigma:高斯平滑的系数,用于控制图像的平滑程度。较高的Sigma值会对图像进行更强烈的平滑处理,但可能导致线条定位的精度下降。
- Low:后滞阈值分割的低值,用于控制线条检测的灵敏度。
- High:后滞阈值分割的高值,同样用于控制线条检测的灵敏度。通常,High值越高,检测到的线条细节越少;Low值越低,检测到的线条细节越多。
- LightDark:指定提取线条的类型,可以选择提取亮色线条('light')或暗色线条('dark')。
- ExtractWidth:是否提取线条的宽度。如果设置为'true',则会提取线条的宽度信息;如果设置为'false',则不提取。
- LineModel:用于调整线条位置和宽度的线模型。可选的模型包括'none'(无模型)、'bar-shaped'(条形)、'parabolic'(抛物线形)和'gaussian'(高斯形)。不同的模型适用于不同类型的线条检测。
- CompleteJunctions:是否添加能够提取的接合点(junction)。当设置为'true'时,算子会尝试提取并连接线条的接合点,以形成更完整的线条轮廓。
三、工作原理
lines_gauss算子通过以下步骤来检测线条:
- 对输入图像进行高斯平滑处理,以减少噪声和细节。
- 计算图像与高斯掩膜的卷积的偏导数,以确定图像中每个像素点在x方向和y方向的泰勒二次多项式的参数。
- 使用泰勒二次多项式的参数来计算每个像素点的线条方向。
- 在垂直于线条方向上具有局部最大值的点被标记为线条上的点,这些点随后被连接成亚像素精度轮廓。
- 根据设置的Low和High阈值,接受或舍弃标记的点,以形成最终的线条轮廓。
四、注意事项
- 在选择Sigma值时,需要权衡平滑程度和线条定位的精度。较高的Sigma值会导致更强烈的平滑处理,但可能降低线条定位的精度。
- Low和High阈值的选择取决于要检测的线条的灰度对比度和宽度。通常,Low值应选择在0.25High到0.5High之间。
- LineModel参数的选择取决于线条的类型和形状。对于大多数应用来说,'bar-shaped'模型是一个不错的选择。如果线条的边缘比较锐利,可以选择'parabolic'模型;如果线条的边缘不那么锐利,可以选择'gaussian'模型。
- 在使用lines_gauss算子之前,建议对输入图像进行适当的预处理,以提高线条检测的效果。
五、示例代码
cpp
dev_close_window ()
read_image (Angio, 'angio-part')
get_image_size (Angio, Width, Height)
dev_open_window (0, 0, 3 * Width / 2, 3 * Height / 2, 'black', WindowID)
dev_display (Angio)
dev_set_color ('blue')
MaxLineWidth := 8 // 设置最大线条宽度为8
Contrast := 12 // 设置对比度为12,用于lines_gauss算子的线条检测
calculate_lines_gauss_parameters (MaxLineWidth, [Contrast,0], Sigma, Low, High) // 根据最大线条宽度和对比度计算lines_gauss算子所需的Sigma、Low和High参数
lines_gauss (Angio, Lines, Sigma, Low, High, 'dark', 'true', 'parabolic', 'true') // 使用lines_gauss算子在图像Angio中检测暗色线条,提取线条宽度,线条模型为抛物线形,并提取接合点,检测到的线条存储在Lines变量中
count_obj (Lines, Number)
dev_update_pc ('off')
dev_update_var ('off')
for I := 1 to Number by 1
select_obj (Lines, Line, I)
get_contour_xld (Line, Row, Col)
get_contour_attrib_xld (Line, 'angle', Angle)
get_contour_attrib_xld (Line, 'width_left', WidthL)
get_contour_attrib_xld (Line, 'width_right', WidthR)
* 为了显示线条,将显示灰度值降至线条与背景之间对比度25%的点。对于抛物线模型线条,这个点由sqrt(3/4)给出。
RowR := Row + cos(Angle) * WidthR * sqrt(0.75)
ColR := Col + sin(Angle) * WidthR * sqrt(0.75)
RowL := Row - cos(Angle) * WidthL * sqrt(0.75)
ColL := Col - sin(Angle) * WidthL * sqrt(0.75)
dev_set_color ('red')
dev_display (Line)
dev_set_color ('green')
disp_polygon (WindowID, RowL, ColL)
disp_polygon (WindowID, RowR, ColR)
endfor
Halcon算子**calculate_lines_gauss_parameters
** 是一个用于计算lines_gauss
算子所需参数的函数。这些参数包括高斯滤波器的标准差(Sigma)、用于滞后阈值方法的低值(Low)和高值(High)。这些参数根据要提取线条的最大宽度(MaxLineWidth)和对比度(Contrast)来确定。
以下是**calculate_lines_gauss_parameters
**算子的详细说明:
参数说明
- MaxLineWidth (input_control):
- 类型:数值型
- 说明:
lines_gauss
算子要提取线条的最大宽度(以像素为单位)。这个值用于确定高斯滤波器的尺寸,因为较宽的线条需要更宽的滤波器来平滑。
- Contrast (input_control):
- 类型:数值型或数值型数组(长度为1或2)
- 说明:
lines_gauss
算子要提取线的对比度。这个值用于计算阈值分割的低值和高值,以便从背景中分离出线条。- 当Contrast为单个数值时,最小对比度将默认为最大对比度的1/3。
- 当Contrast为两个数值的数组时,数组中的第二个值表示最小对比度,且其值不能大于第一个值(最大对比度)。
- Sigma (output_control):
- 类型:数值型
- 说明:获取用于
lines_gauss
输入的高斯滤波器标准差Sigma值。这个值由calculate_lines_gauss_parameters
函数根据线条宽度和对比度计算得出。
- Low (output_control):
- 类型:数值型
- 说明:获取用于
lines_gauss
输入的滞后阈值低值Low。这个值用于确定哪些灰度值较低的像素点被认为是线条的一部分。
- High (output_control):
- 类型:数值型
- 说明:获取用于
lines_gauss
输入的滞后阈值高值High。这个值用于确定哪些灰度值较高的像素点也被认为是线条的一部分。
功能说明
calculate_lines_gauss_parameters
算子根据输入的最大线条宽度和对比度,计算出适用于lines_gauss
算子的Sigma、Low和High值。这些参数共同决定了线条检测的灵敏度和准确性。