1. 程式人生 > >Halcon XLD 幾種邊緣連接函數

Halcon XLD 幾種邊緣連接函數

條件 優先 說明 要求 投影 方法 最終 shift 拷貝

幾種邊緣連接函數的中文解釋:

union_cotangential_contours_xld
根據輸入的輪廓的端點處的局部曲率,連接曲率滿足一定條件的輪廓


輸入:
contours (xld object)
FitClippingLengt輪廓的一部分的長度小於這個值,則跳過計算切線
默認:0.0
一般設置範圍:大於等於0
FitLength 輪廓的一部分大於這個值的,參與計算切線
默認:30
建議值:10.0, 20.0, 30.0,‘auto’
範圍:大於等於0
MaxTangAngle 弧度制 兩個輪廓的切線的最大角,大於該值的不合並
默認:0.78539816
範圍:0.0 < MaxTangAngle<3.1415926

MaxDist 兩個輪廓的端點之間的最大距離
默認:25.0
建議值:5.0, 10.0 , 25.0, 50.0
範圍:大於等於0
MaxDistPerp:輪廓端點到另一輪廓切線垂直距離的最大值,大於該值的不合並
默認:10.0
建議值:2.0, 5.0, 10.0, 20.0
範圍:大於等於0
MaxOverlap:兩個輪廓的最大重疊值,大於該值的不參與合並
默認:2.0
建議值:2.0, 5.0, 10.0, 20.0
Mode:如何處理輪廓的屬性值
默認:‘attr_forget’
可選值列表:‘attr_keep’,


輸出:
UnionContours (xld object)


函數工作原理:對於輸入的contours中的每個輪廓,首先確定其末端。FitClippingLength這個參數代表了一個輪廓的兩個末端之間的歐氏長度。有了這個參數,可以忽略輸入輪廓末端的artifacts(?嘛意思?)。FitLength則表示了輪廓末端參與計算曲率的一小段的歐式長度。在一個輪廓的末端,至少Fitlength長度的在輪廓末端上的點,參與計算。這裏可以使用‘auto’設置。然後算子將把輪廓分割為很多直線和圓弧段,然後將第一段和最後一段分割的結果作為末端。因為計算非常花時間,所以推薦盡可能賦予長度具體的數值。

算子嘗試將每個末端來擬合一個圓。然後決定輸入輪廓的端點,離這些圓最近的端點(用到擬合圓的rms距離)。這些點的切線相當於這些輸入輪廓的端點處的局部曲率。(不是很明白。。。)
如果圓擬合失敗,算子就嘗試擬合回歸線。則輪廓末端的局部曲率就由端點回歸線的方向代替。
輸入的輪廓根據其端點處的局部曲率來決定是否組合在一起。如果兩個輪廓達到了幾個閾值的要求,則組合成一個輪廓。MaxTangAngle表示了兩個輪廓切線的最大角。MaxDist代表了兩個輪廓的端點到對方的最大距離。MaxDistPerp表示了端點到切線垂直距離的最大值。這個距離是一個端點到另一個輪廓切線的垂直距離的最大值,反之一樣。最後一個閾值考慮的是互相有重疊的輪廓,MaxOverlap。重疊的程度由一個端點到另一個輪廓的切線投影來決定,反之一樣。端點之間的距離、端點投影的距離必須比MaxOverlap值短的才參與算子計算。不同於其他閾值,MaxOverlap可以為負。負值表示的是沿切線方向的端點到輪廓距離的最小值。(不太明白,正值不是沿切線投影方向嗎?怎麽負值就是沿切線方向了呢?)
如果滿足以上條件的話,一個輪廓、或者多個輪廓可以由這個算子計算後合並成為閉合的輪廓。但註意,如果已經閉合的輪廓,則不參與算子計算。
如果所有閾值滿足,一個分數值將被計算。由這些角度和距離計算的值越接近0,分數值越高。然後根據這些分數值,執行合並操作。因此,如果有多個合並候選輪廓,最好的那個輪廓優先合並。
Mode為標簽設定,決定是否將輸入輪廓的屬性拷貝到輸出輪廓去。‘attr_keep’是拷貝屬性,可能會對算子的性能產生不好的影像(為啥?)。’attr_forget’則告訴算子忽略已有屬性。更多的屬性設置說明,見算子union_adjacent_contours_xld中的解釋。


我的評論:曲率是一個很好的方法,對於一個物體邊緣的提取,在沒有大拐彎的情況下,也就是說,在物體的一個較為平滑的邊緣提取後,邊緣斷裂也就是不連續的時候,用這個算子可以將它們連接起來。但是對於拐角的斷裂的邊緣,以及不是太平滑也就是七拐八拐的斷裂邊緣,可能就不是那麽有效了。


union_collinear_contours_xld
連接共線的輪廓


輸入:
Contours XLD
MaxDistAbs: 沿參考回歸線方向輪廓端點的最大距離,大於該值不參與計算
默認:10.0
範圍:大於等於0
MaxDistRel:輪廓端點距離相對於沿參考回歸線方向相對於被延長的輪廓的長度的值(比值的意思?)
默認:1.0
範圍:大於等於0
MaxShift:輪廓到參考回歸線的最大距離(垂直距離)
默認:2.0
範圍:大於等於0
MaxAngle: 兩個輪廓的最大角度差,弧度制
默認:0.1
範圍:0.0< MaxAngle<=0.78539816339
Mode: :對待輪廓屬性處理的標簽設置,字符
默認:‘attr_keep‘
可選list:‘attr_keep‘, ‘attr_forget‘


輸出:
UnionContours


算子對所有輸入輪廓進行計算然後合並共線的輪廓,就是說大概位於同一線的輪廓會被合並。合並的輪廓由輸入輪廓的點串聯而成。如果必要的話,這些輸入輪廓點的順序會被翻轉,因此可見待連接輪廓的端點應和最終結果的點直接相鄰(也就是說必須是鄰近的輪廓吧)。算子一直重復,直到沒有可以連接的輪廓為止。最終,連接的輪廓,以及未滿足條件沒有被連接的輸入輪廓,一並作為輸出,返回至UnionContours.
兩條線共線的意思是,其中一條線如果以直線方式延長,將和另一條線重合。值得註意的是,一條線可以由另一條線延續,也就是說,並不是兩條線都能被對方互相延續(有何區別:就是有方向性的)。然而,如果一條線比另一條線長得多(兩倍長以上),長的線將延續至短的線,反之不行。
如果兩個輪廓的回歸線基本共線-由輪廓端點的投影限定,則認為是共線的。在使用這個算子之前,確定輸入的輪廓為直線。註意閉合的輪廓就不參與計算了。
MaxDistAbs,MaxDisRel,MaxShift和MaxAngle用來定義兩個輪廓的共線條件。前三個參數被認為和當前要處理延長到另一輪廓的被檢測輪廓有關(也就是和長的輪廓有關)。MaxDistAbs描述了對於被檢測的輪廓,在回歸線方向到另一個輪廓回歸線的最大可接受距離(大於的就不合並)。這等同於臨近的端點在第一條回歸線上的投影距離。MaxDistRel表示一樣的距離,然後和被檢測輪廓的長度是有關的。這個閾值實際上表示被檢測輪廓的由這兩個參數決定的最小距離(哪兩個參數決定的什麽距離?)。
MaxShift定義了第二輪廓相對於被檢測輪廓回歸線的大距離,也就是說,這個距離是從回歸線垂直測量的。這裏標準是第二輪廓在其自己回歸線的距離,還有到被檢測輪廓回歸線的距離,也就更大些的那個值(嘛意思?)。最後,MaxAngle閾值規定了兩個備選輪廓的回歸線之間的最大角度。
兩個輪廓不會被合並,除非滿足所有條件(與其中一個輪廓定為被檢測輪廓有關),也就是說,所有值必須小於等於所給的閾值。另一個先決條件是,輪廓不能和其它輪廓有較大重疊度。最大重疊度為0.5像素。如果想容忍更大的重疊度,並設置精確的值,就用Unoin_collinear_contours_ext_xld。這是本算子的一個擴展算子,給出了另外幾個參數,可以設置重疊度。
除了找到最合適的備選輪廓進行合並,對於這個算子重要的是決定用來連接輪廓的順序。考慮這個的原因是因為,一般將兩個輪廓合並後,評價結果輪廓和評價之前的輪廓就不同了。因此,一個輪廓可能會和其周圍的某一個輪廓連接,但是不會和兩個同時連接。因此,所有可能被連接輪廓對,算子都會對其進行評分,計算出合並的總距離的損失值。損失值最小的一對輪廓優先合並。在連接後的結果中,輪廓列表將會被再次搜索來獲得潛在的備選連接。如果存在新的可以連接輪廓對,就加入備選清單。如果最好的評價值就是這兩個備選輪廓,連接的順序取決於輪廓在XLD存儲的順序。註意如果一個輪廓為幾個輪廓中的一部分,第二個輪廓的連接可能被第一個輪廓廢棄(啥意思?)。
連接的損失值(或者稱總距離)由上面定義的距離計算出來。兩個輪廓之間的距離越小,損失值越小。如果距離和閾值相近,則損失值很大。另一個機制是損失值取決於連接兩個輪廓的分割線。這部分取決於回歸線分割線和其長度的夾角(the angle of the line segment against the regression line as well as of its length,看不懂….).
總而言之,不同的參數由閾值和權值歸一化。相反的,Unoin_collinear_contours_ext_xld給了控制每個參數單獨作用的機會。還有,這個算子允許設置損失值的限制,從而避免輪廓連接相近於所有標準的值。
最後,Mode參數可以控制隨著輸入輪廓的屬性。比如,edges_sub_pix附著於每個輪廓點一些屬性:局部方向、邊緣反映、邊緣方向等。選擇默認值‘attr_keep‘,所有的屬性都會拷貝到輸出值,如果一個輪廓在連接的時候被翻轉,則適應新的方向。如果輸入輪廓過多,可能就會影響性能,尤其是接下來用不到這些屬性。這時,使用‘attr_forget‘比較好。


我的評論:算子說明裏說,要確保是對直線進行處理,因此可能只對一些弧度彎曲很小的邊緣進行連接,或者說是對直線邊緣提取斷裂的情況進行連接,如方塊、直線邊等。

union_adjacent_contours_xld
連接端點相近的輪廓


輸入:
Contours
MaxDistAbs:輪廓之間端點的最大距離
默認:10.0
範圍:大於等於0
MaxDistRel:端點之間距離相對於長的輪廓(到底是不是指距離與長輪廓長度之比?)
默認:1.0
範圍:大於等於0
Mode: :對待輪廓屬性處理的標簽設置,字符
默認:‘attr_keep‘
可選list:‘attr_keep‘, ‘attr_forget‘


輸出:
UnionContours


這個算子連接所有端點相近的輸入輪廓,是一個串聯結果。如果必要的話,這些輸入輪廓上的點的順序會發生翻轉,所以這些輪廓的要被連接的端點位於直接鄰域中(大致意思就是輪廓本來是從左到右的順序存的點,因為連接需要,變成了從右到左的存儲順序。因為跟這個輪廓連接的另一個輪廓更長,所以以人家的方向為準)。這個算子一直重復直到沒有更多的鄰域輪廓。結果就是所有新連接的輪廓,以及輸入輪廓中不滿足連接條件而未發生變化的輪廓,都返回到輸出UnionContours中。
如果兩個輪廓的端點之間的距離不超過閾值MaxDistAbs,或者由長一些的輪廓的長度乘以相對閾值MaxDistRel,則連接。(也就是說maxDistRel是個比例值,長一些的輪廓的長度乘以這個值得到的值,去與兩輪廓端點距離相比)。
連接臨近輪廓的順序主要取決於臨近的端點的距離,有最小距離的輪廓最先連接。如果有兩對輪廓有一樣的距離,則第一對不含最短輪廓的將被連接。
參數Mode的意義和用法參見 union_collinear_contours_xld 中的相關說明。


我的評論:對連接臨近的輪廓具有較好適應性,但是未考慮一些相似性,僅根據離的遠近來決定是否連接,可能會產生錯誤連接,比如會不會產生一個輪廓在同一端連接多個?在去除了很多雜輪廓的前提下,這個方法還是非常值得一試的。


union_cocircular_contours_xld
連接位於同一圓上的輪廓片段。


我的評論:這個適用性對圓形物體的提取比較有用,連接的差不多了,就可以進行下一步擬合。


union_straight_contours_xld
將臨近的具有同方向的直線輪廓連接。


輸入:
Contours
MaxDist:端點之間的最大距離
默認:5.0
MaxDiff:方向差別的最大值
默認0.5
Percent:上面兩個參數之間的權值
默認:50%
Mode:平行的輪廓是否考慮
默認:‘noparallel’
可選值:‘noparallel‘, ‘paralleltoo‘, ‘every‘
Iterations:叠代的次數
默認:‘maximum‘
建議值:1,2,3,4,5,6,7,8,9,10,‘maximum’
範圍1<= Iterations<= 500
最小步進:1


MaxDist兩個輪廓的端點之間的距離。註意端點是輪廓第一個點和最後一個點在其回歸線上的投影。回歸線的方向要小於MaxDiff。
如果上述兩個閾值只有一個滿足的話,考慮權重參數Percent,可以決定一個滿足要求,但另一個比閾值高。
例如,如果兩個輪廓的端點距離是5.0,方向差是0.5,閾值設置的是MaxDist = 4.0,MaxDiff = 0.625,每個值都和閾值有25%的差距。如果Percent = 60%,則大的端點距離的權值比小的方向差值的權值高,因此這兩個輪廓不被連接。相反,如果Percent = 40%,則兩個輪廓就被連接。
如果設置Percent = 100%,則只有端點距離被考慮。當Percent = 0%,則只有方向差被考慮。如果Percent = 50%,則兩個閾值的權重一樣。
萬一存在平行輪廓的情況,合並相鄰的輪廓則具有風險。如果需要避免這種情況,則在Mode裏設置‘noparallel’,否則使用Mode = ‘paralleltoo’就可以了。Mode = ‘every’則表示,每個輪廓都無條件連接,其他參數都無影響。
合並是只對兩個輪廓,采用遞歸的方式。


我的評論:和collinear的區別在於,可以對非直線進行連接。可以在距離和方向中找到比較合適的平衡權重。但是不明白遞歸是有什麽作用。
一點不明白的是方向差別,如果方向相反,即使夾角很小,但是顯示的可能是鈍角,會不會被濾除了呢?

Halcon XLD 幾種邊緣連接函數