1. 程式人生 > >OpenCV 基於超畫素分割的影象區域選取方法及原始碼

OpenCV 基於超畫素分割的影象區域選取方法及原始碼

摳取影象區域的一個小demo,藉助影象超畫素分割的方法,將影象成子分塊,再利用種子填充演算法,選取子塊區域。

超畫素分割方法,採用論文 SEEDS: Superpixels Extracted via Energy-Driven Sampling 提出的方法,對於物體的邊界具有較好的保留,如下圖所示。可以輔助目標檢測中製作Banchmark。

star
star_labels

本工程在其基礎上,獲得的影象labelscontours,然後分別實現區域種子填充,Windows下編譯環境為:

  • OpenCV
  • CMake
  • Visual Studio

工程demo包括:

  • SuperSeedsTest: SEEDS 提供的用例,可獲取超畫素分割labels
    contours
  • SeedFillTest : 基於labels種子填充子塊
  • BoundaryFillTest : 基於contours種子填充子塊

vs_solution

(測試程式碼以./data檔案下demo.jpg為例)

demo-seg

在選取了種子點(col, row)->(248, 71)後,兩種方法得到的區域mask分別為:

demo-contours-sf

demo-contours-bf

由於儲存的labels影象是8bit點陣圖(記憶體中是CV_32SC1),所以是有損的,如果使用labels區域填充的時候,最好不要使用demo中從儲存影象中載入labels資料(也就是在記憶體中進行,例如通過函式傳參)。

種子填充演算法使用遞迴的形式,對於小塊的畫素區域比較有效,但是由於編譯器棧深度有限,填充區域過大的時候,會出現棧溢位的BUG,這裡需要注意一下(有時間再優化這裡)。

更復雜的介面以及操作,可以根據需要自己定義。

References