OpenCV 基於超畫素分割的影象區域選取方法及原始碼
阿新 • • 發佈:2019-01-02
摳取影象區域的一個小demo,藉助影象超畫素分割的方法,將影象成子分塊,再利用種子填充演算法,選取子塊區域。
超畫素分割方法,採用論文 SEEDS: Superpixels Extracted via Energy-Driven Sampling 提出的方法,對於物體的邊界具有較好的保留,如下圖所示。可以輔助目標檢測中製作Banchmark。
本工程在其基礎上,獲得的影象labels
和contours
,然後分別實現區域種子填充,Windows下編譯環境為:
- OpenCV
- CMake
- Visual Studio
工程demo
包括:
SuperSeedsTest
: SEEDS 提供的用例,可獲取超畫素分割labels
contours
SeedFillTest
: 基於labels
種子填充子塊BoundaryFillTest
: 基於contours
種子填充子塊
(測試程式碼以./data
檔案下demo.jpg
為例)
在選取了種子點(col, row)->(248, 71)
後,兩種方法得到的區域mask分別為:
由於儲存的labels
影象是8bit點陣圖(記憶體中是CV_32SC1
),所以是有損的,如果使用labels
區域填充的時候,最好不要使用demo中從儲存影象中載入labels
資料(也就是在記憶體中進行,例如通過函式傳參)。
種子填充演算法使用遞迴的形式,對於小塊的畫素區域比較有效,但是由於編譯器棧深度有限,填充區域過大的時候,會出現棧溢位的BUG,這裡需要注意一下(有時間再優化這裡)。
更復雜的介面以及操作,可以根據需要自己定義。