fast_threshold (Image, Region, 0, 120, 7)
boundary (Region, RegionBorder, 'inner')
dilation_circle (RegionClipped, RegionDilation, 2.5)
reduce_domain (Image, RegionDilation, ImageReduced)
一副圖片的前期處理:
1、 Blob應用(逼近感興趣區域)
2、 Boundary
3、 膨脹
4、 形成Image
edges_sub_pix(Image : Edges : Filter, Alpha, Low, High : )
提取圖像精確邊緣 (精確邊緣就是亞像素邊緣)
(這個函數就是將含有邊緣的圖像變成亞像素輪廓XLD)
Image: 輸入圖像
Edges: 輸出邊緣輪廓
Filter: 邊緣提取算法的名稱 (canny,lanser1 )
Alpha: 高斯平滑系數
Low: 低閾值
High: 高閾值
edges_sub_pix (ImageReduced, Edges, 'canny', 2, 20, 60)
(20,60,這兩個越小,邊緣越多,越細膩,越大,邊緣越少)
介紹一下Canny算子:
使用累計直方圖計算兩個閥值。凡是大於高閥值的一定是邊緣; 凡是小於低閥值的一定不是邊緣;如果檢測結果大於低閥值但又小於高閥值,那就要看這個像素的鄰接像素中有沒有超過高閥值的邊緣像素:如果有的話那么它就是邊緣了,否則他就不是邊緣;
segment_contours_xld(Contours : ContoursSplit : Mode, SmoothCont, MaxLineDist1, MaxLineDist2 : )
將一個XLD輪廓分割為直線段、圓(圓弧)、橢圓弧。
Contours: 需要進行分割的輪廓。
ContoursSplit: 分割后的輪廓tuple。
Mode: 分割輪廓的方式,可以選擇'lines'(使用直線段分割),
'lines_circles'(使用直線段和圓(弧)分割),
'lines_ellipses'(使用直線段和橢圓弧分割)。
SmoothCont: 輪廓平滑的參數,可以抑制在折線逼近過程中過短的線段,能更加魯棒的逼近圓和橢圓。
MaxLineDist1: 第一次用Ramer算法(即用直線段遞進逼近輪廓)時的MaxLineDist,在逼近完成之后,再 用圓弧或橢圓弧對相鄰分割線段進行擬合,如果擬合圓弧到輪廓的距離小於逼近線段到輪廓的距離,就用圓 弧替代逼近線段,這個過程一致迭代直到所有的線段擬合完畢。
MaxLineDist2: 第二次逼近輪廓時的MaxLineDist,只有當MaxLineDist2
這種兩步逼近算法效率較高,因為在第一次逼近過程中,遞進逼近的直線段較少,因此較大直徑的圓弧能夠被高效的分割出來。在第二次逼近過程中,能夠被小直徑圓弧逼近的輪廓被找到,同時大直徑圓弧的末端被重新定義。
segment_contours_xld (Edges, ContoursSplit, 'lines_circles', 5, 4, 3)
Remark:
分割得到的輪廓是直線段、圓(圓弧)或者橢圓弧可以通過分割后輪廓的全局屬性'cont_approx’參數的值來確定(參考get_contour_global_attrib_xld)。
如果'cont_approx'=-1,這一部分輪廓最適合被擬合為直線段。
如果'cont_approx'=0,這一部分輪廓最適合被擬合為橢圓弧。
如果'cont_approx'=1,這一部分輪廓最適合被擬合為圓弧。
Count_obj (ContoursSplit,Number)
計算ContoursSplit連通域的個數
Select_obj (ContoursSplit,i)
選擇ContoursSplit連通域中第i個連通域
get_contour_global_attrib_xld(Contour : : Name : Attrib)
用於得到一段XLD輪廓的全局特征
參數列表:
Contour(in):單個輪廓
Name : 特征名稱,如
regr_norm_row\regr_norm_col\regr_mean_dist\regr_dev_dist\cont_approx
Attrib(out):特征值
可能前置項:
lines_gauss, lines_facet, edges_sub_pix
get_contour_global_attrib_xld (ObjectSelected, 'cont_approx', Attrib)
如果Attrib =-1,這一部分輪廓最適合被擬合為直線段。
如果Attrib =0,這一部分輪廓最適合被擬合為橢圓弧。
如果Attrib =1,這一部分輪廓最適合被擬合為圓弧。
If (Attrib > 0)
fit_circle_contour_xld(Contours : : Algorithm, MaxNumPoints, MaxClosureDist, ClippingEndPoints, Iterations, ClippingFactor : Row, Column, Radius, StartPhi, EndPhi, PointOrder)
對亞像素擬合圓的函數
Contours(in): 輸入輪廓
Algorithm(in): 擬合圓的算法
MaxNumPoints(in): 用於計算的最大輪廓點個數
MaxClosureDist(in): 一個輪廓的末尾點最大間距被認為是閉合
ClippingEndPoints(in):在逼近過程中被忽略的開始及末尾點個數
Iterations(in): 迭代的最大次數用於魯棒加權擬合
ClippingFactor(in): 消除異常值的裁剪因子
Row(out): 圓心行坐標
Col(out): 圓心列坐標
Radius(out): 圓半徑
StartPhi(out): 開始點的角度(rad)
EndPhi(out): 末尾點的角度(rad)
PointOrder(out): 邊界點的順序
fit_circle_contour_xld (ObjectSelected, 'ahuber', -1, 2, 0, 3, 2, Row, Column, Radius, StartPhi, EndPhi, PointOrder)
函數作用:
對一些線段的XLD做近似計算直線計算
參數Algorithm的可選項解釋如下:
algebraic:這種方法減少了輪廓點與結果圓之間的代數距離
ahuber:類似於algebraic,輪廓點被加權以減小異常值的影響基於方法Huber
atukey:類似於algebraic,輪廓點被加權以減小異常值的影響基於方法Tukey
geometric:該法減少了輪廓點與結果圓之間的幾何距離,該法被統計是最優的,但占用很多計算時間。如果輪廓點被噪聲干擾嚴重,可以考慮使用該方法。
geohuber:類似於geometric,輪廓點被加權以減小異常值的影響基於方法Huber
geotukey:類似於geometric,輪廓點被加權以減小異常值的影響基於方法Tukey
ClippingFactor控制被弱化的異常值個數,值越小,越多異常值被檢測到。
最小擬合一條線的必要輪廓點個數是2,因此,一條輪廓線點個數至少是2+2*ClippingEndPoints
可替代項:
fit_ellipse_contour_xld
fit_line_contour_xld
fit_rectangle2_contour_xld
可能后置項:
gen_circle_contour_xld
disp_circle,
get_points_
edges_sub_pix(Image : Edges : Filter, Alpha, Low, High : )
提取圖像精確邊緣 (精確邊緣就是亞像素邊緣) (zero—cross)
segment_contours_xld(Contours : ContoursSplit : Mode, SmoothCont, MaxLineDist1, MaxLineDist2 : )
將一個XLD輪廓分割為直線段、圓(圓弧)、橢圓弧。
get_contour_global_attrib_xld(Contour : : Name : Attrib)
用於得到一段XLD輪廓的全局特征
fit_circle_contour_xld(Contours : : Algorithm, MaxNumPoints, MaxClosureDist, ClippingEndPoints, Iterations, ClippingFactor : Row, Column, Radius, StartPhi, EndPhi, PointOrder)
對亞像素擬合圓的函數
第一步:提取輪廓
第二部:分割輪廓
第三部:選取輪廓,得到特征
第四部:根據特征,選擇函數進行擬合
1、亞像素精度閾值分割
threshold_sub_pix(Image : Border : Threshold : )
2、亞像素輪廓查找
edges_sub_pix(Image : Edges : Filter, Alpha, Low, High : )
zero_crossing_sub_pix(Image : ZeroCrossings : : )
轉載自:http://blog.sina.com.cn/s/blog_c01c55220102ypsx.html