halcon lines_gauss算子详解

lines_gauss

原型

lines_gauss(Image : Lines : Sigma, Low, High, LightDark, ExtractWidth, LineModel, CompleteJunctions : )

功能

检测线条以及其宽度。

参数列表

Image (input_object) :输入图像
Lines (output_object) :检测线条(XLD)
Sigma (input_control) :高斯滤波值
Low (input_control) :滞后阈值分割的低阈值
High (input_control) :滞后阈值分割的高阈值
LightDark (input_control) :提取线条类型( ‘dark’,‘light’)
ExtractWidth (input_control) :是否提取线宽(‘false’,‘true’)
LineModel (input_control) :用来调整线条位置和宽度的线模型(‘bar-shaped’, ‘gaussian’, ‘none’, ‘parabolic’)
CompleteJunctions (input_control) :在断连的部分是否添加节点使线条连续(‘false’, ‘true’)

详解

lines_gauss 主要功能是提取图像上的线条,提取的结果属于亚像素精度的XLD轮廓。

参数LightDark 其实就是让你选择你要提取线条的类型,暗色还是亮色,选’dark’, ‘light’。

参数ExtractWidth是否提取每条XLD轮廓线的线宽,true提取,false不提取。

参数LineModel 如果选择 除’none’以外的参数,lines_gauss算子会补偿非对称线条(即在线条的中心两侧有不同对比度的线条),来校正提取出的线条的位置和宽度。用于校准的线模型有’bar-shaped’, ‘gaussian’, ‘none’, ‘parabolic’四种。线模型’bar-shaped’适用于大多数应用;如果管状物体采用背光方式打光(比如血管的X光图像),提取线条可以使用’gaussian’, 'parabolic’模型;’parabolic’模型常用来提取边缘比较锐利的线条(比如采用背光照明图像中的线条);’gaussian’则用来提取边缘相对不那么锐利的线条。只有将ExtractWidth设置为true时,参数LineModel才有意义。

由于微分几何算法的原因,线提取器(lines_gauss)不能提取出所有线段结合点,当CompleteJunctions 设置为true时,lines_gauss试图通过不同算法提取出那些被遗漏的节点。

算法通过计算高斯滤波核掩膜与图像卷积的偏导数来确定图像上的每个像素点在x、y方向上的二次多项式参数。参数Sigma的值决定对图像平滑程度,高斯掩膜越大对图像平滑程度越深,这样会导致对线的定位失准。通常,在参数设置类似情况下,lines_gauss对线条定位要比lines_facet表现的好。二次多项式参数被用来计算每个像素的线方向。在垂直于线方向的二阶偏导数中的局部最大像素值被标记为线上的点,这些点组成了XLD轮廓。如果被标记点的二阶偏导数大于High设置的值,那么这个点直接成为XLD轮廓上的点;如果小于Low设置的值,直接被舍弃;如果介于Low、和High之间,参考hysteresis thresholdhttps://blog.csdn.net/qq_18620653/article/details/105467210。

在选择高低阈值的时候,值得注意的是,二阶偏导数取决于线的振幅、宽度以及Sigma值的选择。二阶偏导数与振幅成线性关系,即振幅越大,二阶偏导数越大;对于线的宽度,呈现反指数依赖关系:线越宽,二阶偏导数越小,这和Sigma类似,即Sigma越大,二阶偏导数越小,这意味着选择的Sigma值大,对应选择的高低阈值就小。两个例子说明这个问题,对于一个线宽为5pixel、振幅大于100的线条,如果Sigma值为1.5,那么High的值应该大于14;而对于一个线宽为10pixel、振幅大于100的线条,如果Sigma值为3,那么High的值应该大于3.5,对于Low的值应该选在介于0.25High-0.5High之间较合适。参数Low和High可以根据要提取线条的灰度高低对比度(低对比度和高对比度)以及Sigma值分别计算得出,公式如下:
在这里插入图片描述
对新手来说,使用lines_gauss算子最大的障碍是对参数调节无从下手,真的很痛苦。Halcon开发者在开发过程中感知到了这件事情(哈哈哈),所以配套开发了halcon calculate_lines_gauss_parameters
算子,用来确定lines_gauss输入参数,问题迎刃而解,傻瓜式用lines_gauss。halcon calculate_lines_gauss_parameters详细说明链接:https://blog.csdn.net/qq_18620653/article/details/105465852

提取的线可以理解成是一个数据结构(线段和节点组成),也就是说可以根据节点将线分成一个个线段。
如果ExtractWidth设置为“false”,通过lines_gauss提取到的线上的每个点具有以下属性:
‘angle’:垂直于线条方向的角度
‘response’:二阶偏导数的幅度值
如果ExtractWidth设置为“true,除了’angle’、‘response’属性,下面的属性也被定义:
‘width_left’:线条左侧的宽度
‘width_right’:线条右侧的宽度
如果ExtractWidth 设置为’true’ ,并且LineModel 不选择’none’,那么除了以上四个属性外,下面两个属性也会被定义:
‘asymmetry’:线条两侧的不对称性
‘contrast’:线条的对比度
这里,如果非对称部分,即梯度较弱的部分在直线的右侧,则不对称性为正,而如果非对称部分在直线的左侧,则不对称性为负。对比度是由线条的灰度值和背景的灰度值之间的差异造成的。如果提取亮线,对比度为正;如果提取暗线,对比度为负。
以上属性值可以通过get_contour_attrib_xld获取到,下面有举例说明。

注意

一般来说,特别是在需要提取线条宽度的时候,参数Sigma的选择应满足Sigma >= w/sqrt(3),w表示图像中线条的宽(线条直径的一半),最小允许值是Sigma >= w/2.5。例如,如果要提取的线宽为4pix(直径为8pix),Sigma >= 2.3比较合适。
另外需要注意的一点是,如果Sigma设置的太低,‘width_left’, ‘width_right’, ‘asymmetry’, ‘contrast’ 属性将设置为零。

举例

提取XLD线(红色线条)并显示宽度边界(绿色线条)
halcon lines_gauss算子详解_第1张图片
下图展示了目标物体最宽不超过15,所以代码中MaxLineWidth设置为8(线直径最大为16)
halcon lines_gauss算子详解_第2张图片

代码

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
  • 要提取线与背景间的对比度
    Contrast := 12
  • 根据线宽以及对比度计算出Sigma、Low、High
    calculate_lines_gauss_parameters (MaxLineWidth, [Contrast,0], Sigma, Low, High)
  • lines_gauss分割XLD轮廓Lines
    lines_gauss (Angio, Lines, Sigma, Low, High, ‘dark’, ‘true’, ‘parabolic’, ‘true’)
  • 轮廓点个数
    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)
* 显示提取线的外边界
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,算法,计算机视觉)