最常用的提取亚像素轮廓的算子是edges_sub_pix算子,该算子同样提供了大量的提取方法,只需要在Filter 参数中设置方法的名字,就可以完成边缘的提取。该算子的输入是灰度图像,输出是XLD轮廓,其原型如下:
edges_sub_pix(Image : Edges, Filter, Alpha, Low, High :)
其各参数含义如下。
参数1:Image为输入的单通道图像。
参数2:Edges 为输出的XLD轮廓。
参数3:Filter 为输入参数,与edges_image 算子中的Filter 参数类似,表示选择的滤波算子.默认的是canny,可选的有canny、derichel、derichel int4、deriche2、deriche2 int4、lanserl、lanser2、mshen、shen、sobel_fast,还有一些以“_junctions”结尾的滤波器,适用于一些非连接的边缘。最常见的滤波器有canny 和lanser2。使用lanser2滤波器的一个优点是,它是一个递归的实现,当加大平滑的力度时,计算时间却不会因此增加。如果图像质量比较好,噪声也比较小,但对速度有要求,可以选择sobel_fast 算子,因为它速度比较快,但缺点是对噪声敏感。
参数4:Alpha 为输入参数,表示平滑的程度。其值越小,表示平滑的程度越大。默认是0,可以取0.1到1.1之间的值。
参数5和6:Low和High分别表示滞后阈值的低阈值和高阈值。低阈值越低,图像的细节会越丰富。高阈值用于将边缘与背景区分开来,高于高阈值的像素可以确定是边缘,这些边缘是强边缘,但往往是不连续的,因此需要用一些弱边缘进行补充。低于低阈值的像素可以被认为一定不是边缘。高于低阈值又低于高阈值的部分像素是弱边缘,需要进行判断。如果该像素的相邻像素是边缘,则该像素被认为是边缘,否则就不是。
举例说明edges_sub_pix算子的用法,并测试滞后阈值的值对边缘计算结果的影响。图为使用edges_sub_pix算子进行亚像素边缘提取的结果。输入图片仍是图(a)。图(a)的低阈值为5,高阈值为50。图(b)将低闽值提高到了25,高阈值仍为50,可见边缘数量稍有减少,并且减少的都是与原边缘线条相连的部分。图(c)的低阈值回到5,高阈值调低到25,与图(a)相比,边缘线条明显增多。这是因为强边缘的判断阈值明显降低,所以许多背景线条也被认为是边缘。
上述实现过程代码如下:
read_image (Image, 'data/flower')
*转换为单通道灰色图像
rgb1_to_gray (Image, GrayImage)
*进行亚像素边缘提取。分别使用了不同的滞后阈值以便进行对比
edges_sub_pix (GrayImage, Edges1, 'lanser2', 0.5, 5, 50)
edges_sub_pix (GrayImage, Edges2, 'lanser2', 0.5, 25, 50)
edges_sub_pix (GrayImage, Edges3, 'lanser2', 0.5, 5, 25)
*将提取结果显示在窗口中
dev_display (Edges1)
stop()
dev_display (Edges2)
stop()
dev_display (Edges3)
本例中使用edges_sub_pix算子进行亚像素边缘的提取,并使用了不同的滞后阈值参数,然后对比了其对提取结果的影响。