1. 程式人生 > >Lines_gauss——檢測影象中的線條及其寬度,在視覺表面檢測方面應用廣泛。

Lines_gauss——檢測影象中的線條及其寬度,在視覺表面檢測方面應用廣泛。

lines_gauss(Image : Lines : Sigma, Low, High, LightDark, ExtractWidth, LineModel, CompleteJunctions : )
Image:輸入影象
Lines:提取出的亞畫素精度線條
Sigma:應用的高斯平滑的係數
Low:後滯閾值分割的低值
High:後滯閾值分割的高值
LightDark:提取影象中的亮色或者暗色線條
ExtractWidth:是否提取線條的寬度
LineModel:提取線條的模式,有’none’, ‘bar-shaped’, ‘parabolic’, ‘gaussian’ 四種
CompleteJunctions:是否新增能夠提取的接合點(junction)
當LineModel被設定為除’none’以外的其他值時,lines_gauss運算元會補償非對稱線條(即線上條的中心兩側有不同對比度的線條),來校正提取出的線條的位置和寬度。對大多數應用來說,LineModel的’bar-shaped’引數是正確的選擇,’parabolic’引數常用來提取邊緣比較銳利的線條(比如背光照明的影象中的線條),’gaussian’則線上條邊緣不那麼銳利的時候使用。引數LineModel僅在引數ExtractWidth被設定為’true’時才有意義。
這裡寫圖片描述

因為幾何演算法的原因,線條提取器(即lines_gauss運算元)不可能提取出所有確定的接合點,當CompleteJunctions被設定為’true’時,運算元會試圖通過不同的演算法提取出那些能夠提取出來的接合點。

線條提取演算法通過影象與一個高斯掩膜的卷積的偏導數來決定影象中的每個點在x方向和y方向的泰勒二次多項式的引數。引數Sigma指定了高斯掩膜的引數(平滑程度)。高的Sigma值代表對影象進行大尺度的平滑處理,但由此可能造成提取線條的定位失準。一般來說,在具有對比性的引數下,lines_guass能比lines_facet返回更加準確的線條位置。泰勒二次多項式的引數被用來計算每個畫素點的線條方向。那些二階偏導數在垂直於線條方向上具有區域性最大值的點被標記為線條上的點,這些點隨後被連線成亞畫素精度輪廓。如果被標記的點的二階偏導數值大於引數High,其被認為是線條上的點而被立即接受,如果低於引數Low,其被認為不是線條上的點而被立即捨棄,如果其大於引數Low但小於引數High,則僅在此點能夠通過某一路徑與已經被接受的點相連時這些點才被接受。(參考hysteresis_threshold)

在選在引數High和引數Low時,應該注意,二階偏導數受線條幅度和寬度影響的同時,也受引數Sigma的影響。二階偏導數對線條幅度呈近似線性響應(即幅度值越大,二階偏導數越大)。而對線條寬度的響應卻差不多呈反指數關係(即線條的寬度越寬,二階偏導數越小),這跟對引數Sigma值的大小響應差不多(即Sigma值越大,得到的二階偏導數越小)。這就意味著對於一個大的Sigma值,應該選擇一個比較小的High值和Low值。兩個例子說明這個問題,對於一個幅度值大於100的5個畫素寬的線條,如果Sigma=1.5,那麼引數High應該大於14。而對於一個幅度值大於100的10個畫素寬的線條來說,如果Sigma=3,那麼引數High應該大於3.5。引數Low的值選在0.25High到0.5High之間比較合適。

在提取線條的同時,lines_guass運算元還提取線條上每個點的以下屬性:
如果ExtractWidth=’false’
(1)’angle’:垂直於線條的方向的角度
(2)’response’:二階偏導數的幅度值
如果ExtractWidth=’true’,下面的屬性也會被提取出來
(3)’width_left’:線條左側的寬度
(4)’width_right’:線條右側的寬度
如果LineModel沒有被設定為’none’,那麼下面的屬性也會被提取出來
(5)’asymmetry’:線條的不對稱度
(6)’contrast’:線條的對比度
上面這些引數能夠通過get_contour_attrib_xld運算元得到。

注意:
一般來說,特別是在需要提取線條寬度的時候,引數Sigma的選擇應該滿足Sigma >= w/sqrt(3)(w代表影象中線條的寬度(線條直徑的一半)),最小允許值是Sigma >= w/2.5。例如,對於一個寬度為4個畫素(直徑為8個畫素)的線條來說,Sigma >= 2.3是合適的引數。