Halcon算子学习:XLD几种边缘连接函数
Halcon算子學習:XLD幾種邊緣連接函數(shù)
1.union_cotangential_contours_xld
(Contours : UnionContours : FitClippingLength, FitLength, MaxTangAngle, MaxDist, MaxDistPerp, MaxOverlap, Mode : )
根據(jù)輸入的輪廓的端點處的局部曲率,連接曲率滿足一定條件的輪廓
輸入:
-
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)
函數(shù)工作原理:
1)對于輸入的contours中的每個輪廓,首先確定其末端。
- FitClippingLength這個參數(shù)代表了一個輪廓的兩個末端之間的歐氏長度。有了這個參數(shù),可以忽略輸入輪廓末端的假象。
2) - FitLength則表示了輪廓末端參與計算曲率的一小段的歐式長度。**在一個輪廓的末端,至少Fitlength長度的在輪廓末端上的點,參與計算。**這里可以使用‘auto’設置。然后算子將把輪廓分割為很多直線和圓弧段,然后將第一段和最后一段分割的結果作為末端。因為計算非?;〞r間,所以推薦盡可能賦予長度具體的數(shù)值。
3)算子嘗試將每個末端來擬合一個圓。然后決定輸入輪廓的端點,離這些圓最近的端點(用到擬合圓的rms距離)。這些點的切線相當于這些輸入輪廓的端點處的局部曲率。
如果圓擬合失敗,算子就嘗試擬合回歸線。則輪廓末端的局部曲率就由端點回歸線的方向代替。
4)輸入的輪廓根據(jù)其端點處的局部曲率來決定是否組合在一起。如果兩個輪廓達到了幾個閾值的要求,則組合成一個輪廓。 - MaxTangAngle表示了兩個輪廓切線的最大角。
- MaxDist代表了兩個輪廓的端點到對方的最大距離。
- MaxDistPerp表示了端點到切線垂直距離的最大值。這個距離是一個端點到另一個輪廓切線的垂直距離的最大值,反之一樣。
- MaxOverlap。最后一個閾值考慮的是互相有重疊的輪廓,重疊的程度由一個端點到另一個輪廓的切線投影來決定,反之一樣。端點之間的距離、端點投影的距離必須比MaxOverlap值短的才參與算子計算。不同于其他閾值,MaxOverlap可以為負。負值表示的是沿切線方向的端點到輪廓距離的最小值。(不太明白,正值不是沿切線投影方向嗎?怎么負值就是沿切線方向了呢?)
如果滿足以上條件的話,一個輪廓、或者多個輪廓可以由這個算子計算后合并成為閉合的輪廓。但注意,如果已經閉合的輪廓,則不參與算子計算。
如果所有的閾值都在輪廓線之間被滿足,則計算一個評分值。角度和距離的計算值越接近于0,則得分值越高。然后按照分數(shù)值的順序執(zhí)行統(tǒng)一。因此,如果統(tǒng)一有多個候選項,則首先合并最佳擬合輪廓。 - Mode為標簽設定,決定是否將輸入輪廓的屬性拷貝到輸出輪廓去。
‘attr_keep’是拷貝屬性,可能會對算子的性能產生不好的影像。’attr_forget’則告訴算子忽略已有屬性。更多的屬性設置說明,見算子union_adjacent_contours_xld中的解釋。
小結:曲率是一個很好的方法,對于一個物體邊緣的提取,在沒有大拐彎的情況下,也就是說,在物體的一個較為平滑的邊緣提取后,邊緣斷裂也就是不連續(xù)的時候,用這個算子可以將它們連接起來。但是對于拐角的斷裂的邊緣,以及不是太平滑也就是七拐八拐的斷裂邊緣,可能就不是那么有效了。
2.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
3.union_adjacent_contours_xld
(Contours : UnionContours : MaxDistAbs, MaxDistRel, Mode : )
連接端點相近的輪廓
輸入:
- Contours
- MaxDistAbs:輪廓之間端點的最大距離
默認:10.0
范圍:大于等于0 - MaxDistRel:端點之間距離相對于長的輪廓(到底是不是指距離與長輪廓長度之比?)
默認:1.0
范圍:大于等于0 - Mode: :對待輪廓屬性處理的標簽設置,字符
默認:‘attr_keep’
可選list:‘attr_keep’, ‘attr_forget’
輸出:
- UnionContours
描述:
- 這個算子連接所有端點相近的輸入輪廓,是一個串聯(lián)結果。統(tǒng)一輪廓由輸入輪廓的輪廓點拼接而成。如果必要的話,這些輸入輪廓上的點的順序會發(fā)生翻轉,所以這些輪廓的要被連接的端點位于直接鄰域中(大致意思就是輪廓本來是從左到右的順序存的點,因為連接需要,變成了從右到左的存儲順序。因為跟這個輪廓連接的另一個輪廓更長,所以以人家的方向為準)。重復此操作,直到不再有未連接的相鄰輪廓,結果就是所有新連接的輪廓,以及輸入輪廓中不滿足連接條件而未發(fā)生變化的輪廓,都返回到輸出UnionContours中。
參數(shù):
1)參數(shù)MaxDistAbs和MaxDistRel用于定義兩個輪廓的接近條件。原則上,這些參數(shù)的測量取決于每一對輪廓線的計算順序,即其中的輪廓作為參考輪廓,并與第二個輪廓連接。為了避免這種依賴關系,在兩個方向上對各自的測量值進行評估,并選擇輪廓線的順序,從而使這些測量值更小。注意,在下圖中,左邊的輪廓線始終作為參考輪廓線。參數(shù)模式控制輸入輪廓屬性的處理。
- 參數(shù)MaxDistAbs定義了兩個輪廓之間可接受的最大絕對距離。距離是沿著參考輪廓的回歸線測量的。因此,它是兩個輪廓線之間的間隙投影到參考輪廓線的回歸線上的長度。
- 參數(shù)MaxDistRel定義了兩個輪廓之間可接受的最大相對距離。相對距離的計算方法是將距離a(參數(shù)MaxDistAbs的描述)除以參考輪廓的長度b
2) 如果兩個輪廓的端點之間的距離不超過閾值MaxDistAbs,或者由長一些的輪廓的長度乘以相對閾值MaxDistRel,則連接。(也就是說maxDistRel是個比例值,長一些的輪廓的長度乘以這個值得到的值,去與兩輪廓端點距離相比)。
3)連接臨近輪廓的順序主要取決于臨近的端點的距離,有最小距離的輪廓最先連接。如果有兩對輪廓有一樣的距離,則第一對不含最短輪廓的將被連接。
參數(shù)Mode的意義和用法參見 union_collinear_contours_xld 中的相關說明。
小結:對連接臨近的輪廓具有較好適應性,但是未考慮一些相似性,僅根據(jù)離的遠近來決定是否連接,可能會產生錯誤連接,比如會不會產生一個輪廓在同一端連接多個?在去除了很多雜輪廓的前提下,這個方法還是非常值得一試的。
4.union_cocircular_contours_xld
連接位于同一圓上的輪廓片段。
這個適用性對圓形物體的提取比較有用,連接的差不多了,就可以進行下一步擬合。
5.union_straight_contours_xld
將臨近的具有同方向的直線輪廓連接。
輸入:
- Contours
- MaxDist:端點之間的最大距離
默認:5.0 - MaxDiff:方向差別的最大值
默認0.5 - Percent:上面兩個參數(shù)之間的權值
默認:50% - Mode:平行的輪廓是否考慮
默認:‘noparallel’
可選值:‘noparallel’, ‘paralleltoo’, ‘every’ - Iterations:迭代的次數(shù)
默認:‘maximum‘
建議值:1,2,3,4,5,6,7,8,9,10,‘maximum’
范圍1<= Iterations<= 500
最小步進:1
MaxDist兩個輪廓的端點之間的距離。注意端點是輪廓第一個點和最后一個點在其回歸線上的投影?;貧w線的方向要小于MaxDiff。
如果上述兩個閾值只有一個滿足的話,考慮權重參數(shù)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’則表示,每個輪廓都無條件連接,其他參數(shù)都無影響。
合并是只對兩個輪廓,采用遞歸的方式。
PS:和collinear的區(qū)別在于,可以對非直線進行連接。可以在距離和方向中找到比較合適的平衡權重。但是不明白遞歸是有什么作用。
一點不明白的是方向差別,如果方向相反,即使夾角很小,但是顯示的可能是鈍角,會不會被濾除了呢?
總結
以上是生活随笔為你收集整理的Halcon算子学习:XLD几种边缘连接函数的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 进程同步,异步,互斥
- 下一篇: Halcon学习笔记:读取多张图片