一、算子介紹
1.1 種類
halcon內常用的邊緣檢測算子包括如下幾種:
1.edges_image: 提取2D 圖像邊緣
2.edges_sub_pix:提取2D圖像亞像素邊緣
3.edges_object_model_3d :提取3D圖像邊緣
4.edges_color和edges_color_sub_pix:提取彩色圖像邊緣
1.2 區別
edges_image可選擇多種邊緣檢測算法來提取物體邊緣,其與亞像素邊緣算子的區別在于edges_image提取是以像素為單位的邊緣特征,edges_sub_pix是以比像素還小的單位來提取的邊緣,一般采用矩方法,插值法和擬合法。
二、詳解
2.1 edges_image(Image : ImaAmp, ImaDir : Filter, Alpha, NMS, Low, High : )
該算子內主要參數包括:
ImaDir(圖像邊緣方向,對sobel_fast算法無用,因為其不計算方向信息)
Filter(邊緣算子,包括’canny’, ‘deriche1’, ‘deriche1_int4’, ‘deriche2’, ‘deriche2_int4’, ‘lanser1’, ‘lanser2’, ‘mshen’, ‘shen’, ‘sobel_fast’)
Alpha(過濾器參數,小的值導致強平滑,但是更少的細節(canny算子相反))
NMS(非最大值抑制(設置為none,表示不需要使用該值))
Low(滯后閾值操作的下閾值(如果不需要閾值設置,則為負值))
High(滯后閾值操作的上閾值(如果不需要閾值設置,則為負值))
2.2 邊緣檢測算法
對于算法來講,目前canny算子是最穩定的邊緣檢測方法。
canny算法由邊緣強度、邊緣細化(NMS)、滯后閾值三個階段組成。
首先,邊緣強度的計算是計算圖像梯度:梯度幅值矩陣、梯度方向矩陣:
1)圖像灰度化
2)高斯濾波
3)sobel濾波器求出x,y方向上梯度圖像,記為fx、fy
4)利用fx、fy求出梯度幅值和梯度的方向
5)此時的梯度方向為[-90,+90]之間的任意值,將它們規則化為四類種0、45、90、135度。
然后,計算非最大值抑制(NMS),我們根據已經規則化的方向矩陣中存儲的方向先分類,之后比較相同方向上的三顆像素,確保中間像素的值最大,否則將它置零,最后得出了清洗過的梯度幅值矩陣。
最后,繼續處理梯度幅值矩陣,根據設定高閾值high、低閾值low將圖像分成三部分:
1.梯度幅值大于high的像素,將值置為255;
2.梯度幅值小于low的像素,將值置為0;
3.梯度幅值在中間的像素,用它的8鄰域判斷,鄰域內若有值大于high,則將中間的像素置為255;
下面對涉及
下面結合程序對每種濾波算法進行演示講解:
read_image (I, 'C:/Users/Administrator/Desktop/a.png')
dev_close_window ()
dev_open_window(0, 0, 512, 512, 'black', WindowHandle)
get_image_size (I, Width, Height)
dev_set_window_extents (0, 0, Width, Height)
rgb1_to_gray(I, GrayImage)
*dev_set_lut ('change2')
*設置滯后閾值為默認值
*濾波參數值Alpha
*設置滯后閾值必須大于0,小于255,值越小細節越多,但同時會帶來很多不需要的邊緣信息。
*值越大則會丟失邊緣,很多邊緣點值都會被設置為0。
edges_image(GrayImage, ImaAmp, ImaDir, 'canny', 1, 'nms', 20, 40)
dev_display(ImaAmp)