最近手頭有個項目需要加速graph cut,這裏就參考一篇論文banded graph cut: A Multilevel Banded Graph Cuts Method for Fast Image Segmentation(鏈接: https://pan.baidu.com/s/1-1Wjlzkgd2bd5rynwvKAtg 提取碼: num5)
Graph Cut
首先回憶下graph cut的流程
- 構圖: 其中邊有兩種,一個是像素與像素之間的連接,主要看相鄰像素的差異,越相似權重越大越不可分割。另一個是每個像素與S/T的連接,如果該像素被用戶標記爲背景那和T連接權重設爲K,與S設置0;而如果是前景則與S連接權重爲K,與T設置0;而如果是非種子像素則像素的灰度和給定的目標和前景的灰度直方圖來獲得
- 最大流/最小割: 有很多解法,OpenCV用的是An Experimental Comparison of Min-Cut/Max-Flow Algorithms for Energy Minimization in Vision 詳情參考Grab Cut學習筆記1(new min-cut /max-flow algorithm)
banded graph cut
- 構建圖像金字塔,以兩層爲例
- 在最小的圖像上構建graph,做max flow算法得到小圖的分割結果,放大到原圖,此時的mask較爲粗糙
- 對mask進行腐蝕膨脹,兩者相減得到邊緣位置的band,或者利用雙邊濾波/引導濾波得到更細更精準的band
- 只對band內的像素點構圖,做max flow算法得到band內的分割結果
- “粗糙”的mask和band內的分割結果進行融合,得到邊緣光滑的分割結果
Grab cut
-
Graph Cut的目標和背景的模型是灰度直方圖,Grab Cut取代爲RGB三通道的混合高斯模型GMM;
-
Graph Cut的能量最小化(分割)是一次達到的,而Grab Cut取代爲一個不斷進行分割估計和模型參數學習的交互迭代過程(GMM可以用EM算法一直迭代更新)
-
Graph Cut需要用戶指定目標和背景的一些種子點,但是Grab Cut只需要提供背景區域的像素集就可以了。也就是說你只需要框選目標,那麼在方框外的像素全部當成背景,這時候就可以對GMM進行建模和完成良好的分割了。即Grab Cut允許不完全的標註(incomplete labelling)。
- Interactive Graph Cuts for Optimal Boundary & Region Segmentation of Objects in N-D Images
- An Experimental Comparison of Min-Cut/Max-Flow Algorithms for Energy Minimization in Vision
- 圖像分割之(二)Graph Cut(圖割)
- 圖像分割之(三)從Graph Cut到Grab Cut
- 經典圖割算法中圖的構建及實現:Graph-Cut