graphcut/banded graphcut/grabcut解读

Posted 爆米花好美啊

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了graphcut/banded graphcut/grabcut解读相关的知识,希望对你有一定的参考价值。

最近手头有个项目需要加速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

  1. 构建图像金字塔,以两层为例
  2. 在最小的图像上构建graph,做max flow算法得到小图的分割结果,放大到原图,此时的mask较为粗糙
  3. 对mask进行腐蚀膨胀,两者相减得到边缘位置的band,或者利用双边滤波/引导滤波得到更细更精准的band
  4. 只对band内的像素点构图,做max flow算法得到band内的分割结果
  5. “粗糙”的mask和band内的分割结果进行融合,得到边缘光滑的分割结果

Grab cut

  1. Graph Cut的目标和背景的模型是灰度直方图,Grab Cut取代为RGB三通道的混合高斯模型GMM;

  2. Graph Cut的能量最小化(分割)是一次达到的,而Grab Cut取代为一个不断进行分割估计和模型参数学习的交互迭代过程(GMM可以用EM算法一直迭代更新)

  3. Graph Cut需要用户指定目标和背景的一些种子点,但是Grab Cut只需要提供背景区域的像素集就可以了。也就是说你只需要框选目标,那么在方框外的像素全部当成背景,这时候就可以对GMM进行建模和完成良好的分割了。即Grab Cut允许不完全的标注(incomplete labelling)。


以上是关于graphcut/banded graphcut/grabcut解读的主要内容,如果未能解决你的问题,请参考以下文章

python graphcut - networkx ref:https://qiita.com/naivete5656/items/d8d1219719e802574d4f

32opencv入门GrabCut & FloodFill图像分割

图像分割之从Graph Cut到Grab Cut

CV toolbox - grab cut

图像分割之Graph Cut(图割)

求助一个github上的c++工程应该如何编译使用