用過Halcon的基本都用過這個select_shape,靈活用起來,還是非常好用的。
下面來說說它的使用。
我們門檻值分割後,通常的想法是直接選取自己感興趣的。
但是這是非常理想的狀态,按這個思路寫的程式,八成要被工程蹂躏。
一般用select_shape算子來進行兩類的操作來達成工程上更好的魯棒性:
-
首先是用select_shape很小心的過濾掉确定沒用的幹擾區域,但是有用資訊又不會損失太大。
比如用area去掉dyn_threshold提取出來的很多小噪點。比如離目标較遠的其他選中區域去掉等。
- 進行blob分析和形态學操作,對感興趣的目标特征進行各種特征增強,為後面的最後提取目标做準備。
- 最後再用select_shape,一般用多條件組合來選取目标區域。
這樣寫出來的程式才具有更好的魯棒性,更能适應工程需求。
在它的各項特征中,最常用而有效的就是area面積了,
另外其他的特性雖然用的沒那麼普及,但是深入了解每個特性的具體定義,絕對是事半功倍。
比如用圓度去除非圓弧長條,反之,離心率提取細長特征體等等。
磨刀不誤砍柴工,花在這個select_shape上的時間是絕對值得的。
- 題外話:模闆比對,邊緣提取,多種門檻值分割都值得花力氣掌握,後面有時間陸續寫。
下面是select_shape的Feature的中英文解釋
核心:提取出來目标形狀和幹擾形狀最大最明顯的本質特征差别,組合特性進行篩選。
'area': Area of the object
目标的面積:ROI面積大小進行篩選,去掉小面積的幹擾,和其他組合效果更好。
'row': Row index of the center
'column': Column index of the center
中心行列的值:定位在一個範圍進行篩選
'width': Width of the region
'height': Height of the region
區域的寬度和高度:對區域的整體大小占地進行篩選
'row1': Row index of upper left corner
'column1': Column index of upper left corner
左上角的行列值:可以得到形狀的最左最上值
'row2': Row index of lower right corner
'column2': Column index of lower right corner
右下角的行列值:可以得到形狀的最右最下值
圓度,與圓相似程度,圓度=區域面積/((中心到區域邊界的最大距離)^2PI),區域面積和以最大距離為半徑的圓面積做比較,越接近圓,這個比值就會越接近1。
圓度對于大的凸起、孔洞和不相連的區域敏感。必須實心圓度才高。
緊湊度=輪廓的長度^2/(4區域的面積PI)。一個圓的緊湊度是1。如果區域是長條或有孔,則緊湊度大于1。
緊湊度對粗糙度和孔洞敏感。大于1,外表越是粗糙毛刺多,值越大。孔洞多,值越大。越接近實心圓越緊湊。鐵匠鍛鐵塊就是這樣的。
輪廓長度:輪廓線的總長度。同等尺寸下,多刺多孔的值大。
凸性,又稱凸度,凸性=凸包面積/原區域面積,如果是矩形、圓,凸性為1,如果區域含有缺口或孔洞,凸性小于1. 凸包内每個頂點所對應的内角是否小于180度
矩形相似度,越接近矩形,就越接近1,否則小于1
等效橢圓的主半徑
等效橢圓的副半徑
等效橢圓的方向
離心率,等距=等效橢圓主軸/副軸
蓬松性=PI主軸*副軸/區域面積
結構元素
最小外接圓的半徑
最小内接圓的半徑
區域最大内接矩形的寬度
區域最大内接矩形的高度
從區域邊界到中心的平均距離
從區域邊界到中心的偏差
圓度
多邊形的邊的數量
連接配接區域的數量
孔洞數
目标的孔洞面積
區域最大直徑
區域方向
歐拉數
最小外接矩形的方向
最小外接矩形的長度的一半
最小外接矩形的寬度的一半
區域的幾何矩