edges_color(Image : ImaAmp, ImaDir : Filter, Alpha, NMS, Low, High : )
edges_color从输入图像Image 中提取颜色边缘。
为了定义颜色边缘,将多通道图像看作一个映射
,
其中n为图像Image 中的通道数。
为实现此功能,有梯度的自然延伸:
G度规张量,它可以用来计算每一个方向,方向向量v,方向的变化率f诉为符号方便,
G将被视为一个二维矩阵。
因此,函数f在v方向上的变化率由v^T G v给出,其中
利用与 edges_image相似的边缘滤波器,计算了计算度量张量所必需的图像偏导数。
对于filter='canny',使用高斯平滑遮罩的偏导数(参见Derivate_Gauss),
对于'Deriche1'和filter='Deriche2'使用相应的Deriche滤波器,对于filter='Shen'使用相应的Shen滤波器,
对于filter='Sobel_Fast'使用Sobel滤波器。
与单通道图像类似,梯度方向由变化率f最大的向量v定义。
矢量V由G的最大特征值对应的特征向量给出。
特征值的平方根等于单通道图像的梯度幅度(振幅),并以ImaAmp返回。
对于单通道图像,这两个定义是等效的。
由于渐变幅度可能大于输入图像数据类型(byte或uint2)中可以表示的值,
因此它存储在imaamp中的下一个较大的数据类型(uint2或int4)中。
特征向量也用于定义边缘方向。
与单通道图像相比,边缘方向只能定义为180度的模。与edges_image的输出一样,边缘方向以2度步进存储,并返回到imadir。
边缘振幅为0的点被指定为边缘方向255(未定义的方向)。
由于速度原因,没有为filter='sobel'u fast'显式计算边缘方向。
因此,在这种情况下,imadir是一个空对象。
“filter width”(即除“sobel_fast”(滤波宽度为3x3,忽略Alpha值)外,所有滤波器均可任意选择,
参数Alpha的具体值可通过调用info_edges来估计。
它随着Deriche和Shen滤波器的Alpha值的增加而减小,随着Canny滤波器的Alpha值的增加而增大,
其中Canny算子所依据的高斯函数的标准差就是该滤波器的标准差。
“Wide”滤波器对噪声的不变性更大,但检测小细节的能力也下降了。
非递归滤波器,如Canny滤波器,使用滤波器掩模实现,从而随着滤波器宽度的增加,执行时间增加。
相反,递归过滤器的执行时间不依赖于过滤器的宽度。
因此,在不增加操作符运行时间的情况下,使用Deriche和Shen过滤器可以实现任意的滤波器宽度。
与Canny算子相比,在速度上的优势自然会随着滤波器宽度的增大而增大。
作为边界处理,递归算子假设图像外为零,Canny算子在图像边界处映射灰度值。
可通过以下Alpha选择获得可比较的滤波器宽度:
Alpha('deriche2') = Alpha('deriche1') / 2,
Alpha('shen') = Alpha('deriche1') / 2,
Alpha('canny') = 1.77 / Alpha('deriche1').
edges_color可选地提供应用非最大抑制(NMS = ' NMS '/'inms'/'hvnms';“none”(如果不需要)
和滞后阈值操作(Low,High;;如果不需要,至少有一个负片)到生成的边缘图像。从概念上讲,这相当于以下调用:
nonmax_suppression_dir(...,NMS,...)
hysteresis_threshold(...,Low,High,1000,...).
注意,如果NMS设置为“none”,则不应用滞后阈值操作。
对于“sobel_fast”,对除“none”之外的所有NMS值执行相同的非最大抑制。
此外,对于“sobel_fast”,生成的边缘被减薄到一个像素的宽度。
参数
Image 输入图像
ImaAmp 输出 的边缘振幅(梯度大小)图像。
ImaDir 输出的边缘方向图像
Filter 要应用的边缘算子。
Alpha 滤波参数:数值越小,平滑效果越好,因此细节越少(与canny相反)。
NMS 非最大抑制(“none”,如果不需要)。
Low ,High 迟滞阈值函数的低高阈值(如果不需要阈值,则为负值)。
1.edges_color_sub_pix(Image : Edges : Filter, Alpha, Low, High : )
edges_color_sub_pix从输入图像Image 中提取亚像素级的精确颜色边缘。
在edges_color描述中给出了颜色边缘的定义。可以选择与edges_color中相同的边缘过滤器:“canny”、“deriche1”、“deriche2”和“shen”。
此外,可以使用“sobel_fast”选择一个快速Sobel过滤器。过滤器由参数过滤器指定。
“filter width”(即,平滑量)可任意选择。
有关此参数的详细描述,请参见edges_color。Filter = 'sobel_fast'将忽略此参数。
提取的边缘作为亚像素级精确的XLD轮廓返回到 Edges中。
对于除'sobel_fast'之外的所有边缘操作符,为每个边缘点定义了以下属性(参见get_contour_attrib_xld):
edge_direction 边缘方向
angle 法向量到轮廓线的方向(法向量指向轮廓线的右侧,使轮廓线从起点经过终点;角度是相对于图像的行轴给出的。)
response 边缘振幅(梯度大小)
2.edges_image(Image : ImaAmp, ImaDir : Filter, Alpha, NMS, Low, High : )
edges_image使用递归实现的过滤器(根据Deriche、Lanser和Shen)或Canny提出的传统实现的“高斯导数”过滤器(使用过滤器掩模)检测阶跃型边缘。
此外,可以使用Sobel过滤器的一个非常快速的变体。因此,可以使用以下边缘操作符:
'deriche1', 'lanser1', 'deriche1_int4', 'deriche2', 'lanser2', 'deriche2_int4', 'shen', 'mshen', 'canny', and 'sobel_fast'(通过参数Filter)传递)。
边缘振幅(梯度大小)在ImaAmp中返回。
对于除“sobel_fast”之外的所有过滤器,边缘方向都返回到imadir中。
对于“sobel_fast”,不计算边缘方向以加速滤波器。
因此,imadir是一个空的image对象。
边缘操作符“deriche1”和“deriche2”也可用于int4图像,并返回带符号的过滤器响应,而不是其绝对值。
对于字节图像,也可以通过分别选择“deriche1_int4”和“deriche2_int4”作为过滤器来获得此行为。
这可以用来计算图像的二阶导数,方法是将边图像(参数为'lanser2')应用于带符号的一阶导数。
边缘方向以2度步骤存储,即在数学上为正的意义上X度的边缘方向,相对于水平轴,在边缘方向图像中存储为X/2。
此外,还考虑了强度变化的方向。用[Ex,Ey]表示图像的梯度。
然后,以下边缘方向返回为R/2:
边缘幅值为0的点指定边缘方向255(未定义方向)。
““filter width”(即除“sobel_fast”(滤波宽度为3x3,忽略Alpha值)外,所有滤波器均可任意选择,
参数Alpha的具体值可通过调用info_edges来估计。
当Deriche, Lanser和Shen滤波器的Alpha值增加时,它会减小,而Canny滤波器的Alpha值增加,
这是Canny算子所基于的高斯函数的标准差。
例程:
*例程展示如何使用edges_color,以及使用只能从彩色图像中提取某些边缘的图像输出edges_color和edges_image之间的区别。
dev_update_off ()
read_image (Image, 'olympic_stadium')
get_image_size (Image, Width, Height)
dev_close_window ()
dev_open_window (0, 0, Width, Height, 'black', WindowHandle)
* 将彩色图像转换为灰度值图像。注意,在灰度值图像中,足球场和跑道之间没有对比。
rgb1_to_gray (Image, GrayImage)
*计算无非最大抑制和滞后阈值的颜色边缘,即,原始边缘振幅图像。请注意,在彩色边缘图像中,足球场和跑道之间有一条清晰可见的边缘。
edges_color (Image, ImaAmp, ImaDir, 'canny', 1, 'none', -1, -1)
*计算无非最大抑制的灰度值边缘滞后阈值,即,原始边缘振幅图像。请注意,在灰度值边缘图像中,足球场和跑道之间没有可见的边缘
edges_image (GrayImage, ImaAmpGray, ImaDirGray, 'canny', 1, 'none', -1, -1)
*现在执行颜色边缘提取,包括非最大抑制和滞后阈值。注意足球场和跑道之间的分段边缘。
edges_color (Image, ImaAmpHyst, ImaDirHyst, 'canny', 1, 'nms', 20, 40)
edges_color_sub_pix (ImaAmpHyst, Edges, 'canny', 1, 20, 40)
threshold (ImaAmpHyst, RegionColor, 1, 255)
skeleton (RegionColor, EdgesColor)
dev_display (Image)
dev_set_color ('blue')
dev_display (EdgesColor)
Message := 'Segmented color edges'
disp_message (WindowHandle, Message, 'window', 12, 12, 'black', 'true')
stop ()
*现在进行灰度值边缘提取,包括非最大抑制和滞后阈值提取。注意足球场和跑道之间没有边缘。
edges_image (GrayImage, ImaAmpGrayHyst, ImaDirGrayHyst, 'canny', 1, 'nms', 20, 40)
threshold (ImaAmpGrayHyst, RegionGray, 1, 255)
skeleton (RegionGray, EdgesGray)
dev_display (GrayImage)
dev_set_color ('blue')
dev_display (EdgesGray)
Message := 'Segmented gray value edges'
disp_message (WindowHandle, Message, 'window', 12, 12, 'black', 'true')
|