bandpass_image(Image : ImageBandpass : FilterType : )
bandpass_image被用作边缘过滤器。
对图像Image 采用线性滤波,卷积掩模如下:
FilterType:
'lines'相对于edge操作符sobel_amp,这个过滤器检测的是lines而不是edge,
即,两条相邻的边。
0 -2 -2 -2 0
-2 0 3 0 -2
-2 3 12 3 -2
-2 0 3 0 -2
0 -2 -2 -2 0
在图像的边界处,灰度值被镜像。
灰度值的过流和下流被剪切。
生成的图像在ImageBandpass中返回。
例程:
read_image (Bk45, 'bk45')
bandpass_image (Bk45, Lines, 'lines')
threshold (Lines, Region, 128, 255)
skeleton (Region, Skeleton)
dev_set_colored (12)
gen_contours_skeleton_xld (Skeleton, Contours, 5, 'filter')
dev_display (Bk45)
dev_display (Contours)
2.lines_color(Image : Lines : Sigma, Low, High, ExtractWidth, CompleteJunctions : )
lines_color从输入图像Image 中提取颜色线,并将提取的线以亚像素精度xld -轮廓线的形式在Lines 返回。
颜色线定义为颜色边缘过滤器振幅图像中的深色线(参见edges_color)。
lines_color总是使用Canny颜色边缘过滤器。
因此,图像所需的偏导数总是通过与高斯平滑掩模的各自偏导数卷积来计算(见derivate_gauss)。
相应的平滑由参数Sigma决定。
通过在振幅图像中将颜色线定义为暗线,与lines_gauss相反,
对于单通道图像,不区分这些线是比周围环境更暗还是更亮。
此外,lines_color还返回楼梯线,即,其中线的灰度值位于线左右两侧周围区域的灰度值之间。
在多通道图像中,上述定义允许每个通道具有不同的行类型。
例如,在三通道图像中,
第一通道可能有一条暗线,
第二通道可能有一条亮线,
第三通道可能在同一位置有一条楼梯线。
如果ExtractWidth设置为“true”,则为每个行点提取行宽。
由于线提取器由于微分几何原因无法提取某些连接,
因此如果将complete tejunction设置为“true”,它将尝试用不同的方法提取这些连接。
lines_color使用类似于滞后阈值操作的算法将线点链接成线,
该算法也用于lines_gauss和edges_color_sub_pix。
振幅大于 High的点被立即接受为直线,而振幅小于 Low的点被拒绝。
如果所有其他点都连接到所接受的线点,则它们都被接受为线(参见lines_gauss)。
这里,振幅表示暗线的线振幅(参见lines_gauss和lines_facet)。
这个值对应于平滑后的输入图像在垂直于直线方向上的第三个方向导数。
在选择高阈值和低阈值时,必须记住,第三方向导数取决于直线的振幅和宽度以及Sigma的选择。
三阶导数的值与振幅呈线性关系,即,振幅越大,响应越大。
对于线的宽度有一个逆相关关系:线越宽,响应越小。
这类似于依赖Sigma:Sigma选择的越大,二阶导数就越小。
这意味着,对于较大的平滑,相应地应该选择较小的High和Low。
提取的线在拓扑健全的数据结构 Lines中返回。
这意味着线在连接点被正确分割。
如果ExtractWidth被设置为“false”,lines_color为每个行点定义以下属性:
angle
垂直于直线方向的角(使法向量在直线从起点到终点经过时指向直线的右侧);
角度是相对于图像的行轴给出的。)
response
二阶导数的大小
如果ExtractWidth被设置为“true”,则定义了以下属性:
width_left 线左边的线宽
width_right 线右边的线宽
所有这些属性都可以通过操作符get_contour_attrib_xld查询。
3.lines_facet(Image : Lines : MaskSize, Low, High, LightDark : )
lines_facet可用于从图像图像中提取线(曲线结构)。
提取的线以亚像素级精度的xld轮廓线Lines 返回。
参数LightDark决定是否提取亮线或暗线。
提取是通过使用facet模型完成的,即,最小二乘拟合,确定图像中每个点在x和y中的二次多项式的参数。
参数MaskSize决定用于最小二乘拟合的窗口的大小。
较大的掩模尺寸值会导致较大的图像平滑,但会导致较差的线定位。
该多项式的参数用于计算每个像素的直线方向。
在垂直于直线方向的二阶方向导数中,局部最大的像素点被标记为直线点。
然后以这种方式找到的线点被连接到轮廓线上。
这是通过立即接受二阶导数大于高的直线点来实现的。
二阶导数小于Low的点被拒绝。如果所有其他线点通过连接路径连接到所接受的点,则它们都被接受。
这类似于具有无限路径长度的滞后阈值操作(参见滞后is_threshold)。
但是,这个函数没有在内部使用,因为它不允许提取亚像素精确轮廓。
如何在lines_gauss描述中选择阈值的要点也适用于这个操作符。
这里的Sigma= 1.5大致相当于这里的掩码大小为5。
提取的线在拓扑健全的数据结构Lines 返回。这意味着线在连接点被正确分割。
lines_facet为每个行点定义以下属性:
angle
垂直于直线的方向的角
response
二阶导数的大小
可以通过操作符get_contour_attrib_xld查询这些属性。
4.lines_gauss(Image : Lines : Sigma, Low, High, LightDark, ExtractWidth, LineModel, CompleteJunctions : )
lines_gauss可用于从图像Image 中提取线(曲线结构)。
提取的线以亚像素级精度的xld轮廓线形式在Lines 返回。
参数LightDark决定是否提取亮线或暗线。
如果ExtractWidth设置为“true”,则为每个行点提取行宽。
如果LineModel被设置为不同于“none”的值,
lines_gauss将补偿不对称线(线的每一边有不同的对比度)的影响,并纠正线的位置和宽度。
用于校正的直线模型可以通过LineModel设置用于条形线(LineModel = 'bar-shaped')、
抛物线模型(LineModel = 'parabolic')和
高斯线模型(LineModel = 'gaussian'')。
对于大多数应用程序,条形线是正确的选择。
如果需要提取背光管状物体(如x射线图像中的血管),另外两种模式可以选择使用。
抛物线模型应应用于线条非常清晰的应用场合。高斯线模型应用于线条不那么清晰的地方。
只有当ExtractWidth='true'时,参数LineModel才有意义。
线提取器由于微分几何原因无法提取某些连接,因此如果将CompleteJunctions 设置为“true”,它将尝试用不同的方法提取这些连接。
该方法利用高斯平滑核的偏导数来确定图像中每个点的x和y的二次多项式的参数。
参数 Sigma 决定了要执行的平滑量。 Sigma 值越大,图像的平滑度越大,但会导致直线的局部化更差。
通常,局部线要比lines_facet返回的具有可比参数的线好得多。
该多项式的参数用于计算每个像素的直线方向。
在垂直于直线方向的二阶方向导数中,局部最大的像素点被标记为直线点。
然后以这种方式找到的线点被连接到轮廓线上。
这是通过立即接受二阶导数大于High的直线点来实现的。二阶导数小于Low的点被拒绝。
如果所有其他线点通过连接路径连接到所接受的点,则它们都被接受。
这类似于具有无限路径长度的滞后阈值操作(参见 hysteresis_threshold)。
但是,这个函数没有在内部使用,因为它不允许提取亚像素精确轮廓。
在选择High阈值和Low阈值时,必须记住,二阶方向导数取决于直线的振幅和宽度以及Sigma的选择。
二阶导数的值与振幅成线性关系,即,振幅越大,响应越大。
对于线的宽度有一个近似的指数反比关系:线越宽,响应越小。
这类似于依赖:选择的越大,二阶导数就越小。
这意味着,对于较大的平滑,相应地必须选择较小的High和Low。
两个例子有助于说明这一点:
如果要从Sigma = 1.5平滑的图像中提取振幅大于100的5像素宽的线,则应选择大于14的High。
另一方面,如果要检测到振幅大于100且Sigma = 3的10像素宽线,则应选择大于3.5的High。
对于在0.25High和0.5High之间选择Low值是合适的。
由待提取直线的灰度值对比度(ContrastLow and ContrastHigh)和Sigma的选取值计算出High、Low参数,
公式如下:
提取的线以拓扑健全的数据结构Lines返回。这意味着线在连接点被正确分割。
如果ExtractWidth被设置为“false”,lines_gauss为每个行点定义以下属性:
angle
垂直于直线的方向的角
response
二阶导数的大小
如果ExtractWidth被设置为“true”,除了“angle”和“response”外,还定义了以下属性:
width_left,width_right线左右边的线宽
如果ExtractWidth被设置为'true', LineModel被设置为与'none'不同的值,
那么除了'angle'、'response'、'width_left'和'width_right'之外,还定义了以下属性:
asymmetry 线点的不对称性
contrast 线点的对比度。
这里,如果非对称部分,即,梯度较弱的部分在直线的右侧,如果不对称部分在直线的左侧,则为负。
对比是由线条的灰度值与背景的灰度值的差异造成的。如果提取亮线,对比度为正;如果提取暗线,对比度为负。
所有属性都可以通过操作符get_contour_attrib_xld查询。
lines_gauss可以在OpenCL设备上执行。
5.calculate_lines_gauss_parameters( : : MaxLineWidth, Contrast : Sigma, Low, High)
calculate_lines_gauss_parameters根据要提取的线的最大宽度和对比度计算lines_gauss的参数Sigma、Low和High。
MaxLineWidth定义要用lines_gauss提取的线的最大宽度。
对比度应设置为要提取的典型线的灰度值对比度。在任何情况下,都会提取对比度较高的所有行。
参数对Contrast可以包含第二个值,第二个值定义要提取的线之间的最小对比度。
参数Contrast的第二个值不能大于第一个值。
如果只给出一个值,则最小Contrast设置为contrast /3.0。
最小Contrast值越小,线条越长,延伸到对比度较低的区域。较高的值导致更短但更突出的线。
注意,lines_gauss使用了一种滞后阈值方法,它使用了由MaxLineWidth和上面描述的两个对比度值计算得到 Low, High。
简单地说,滞后阈值方法的工作原理是,所有位于对比度高于(第一个值)的直线上的点都被认为是突出的直线点。
只要这些线点的对比度高于最小对比度,这些突出线点就与相邻线点进行扩展。
例程:
read_image (Bk45, 'bk45')
*bandpass_image (Bk45, Lines, 'lines')
*lines_color (Bk45, Lines, 1.5, 3, 8, 'true', 'true')
*lines_facet (Bk45, Lines, 5, 3, 8, 'light')
calculate_lines_gauss_parameters (5, 60, Sigma, Low, High)
lines_gauss (Bk45, Lines, Sigma, Low, High, 'light', 'true', 'bar-shaped', 'true')
dev_display (Bk45)
dev_display (Lines)
|