使用maxflow进行图像分割

时间:2014-06-02 15:11:29

标签: image-processing computer-vision image-segmentation background-foreground max-flow

我必须在C ++中使用maxflow算法进行前景/背景分割。 (http://wiki.icub.org/iCub/contrib/dox/html/poeticon_2src_2objSeg_2src_2maxflow-v3_802_2maxflow_8cpp_source.html)。我根据他们的RBG从png文件中获取了一个像素数组,但接下来的步骤是什么。我怎么能用这个算法解决我的问题?

1 个答案:

答案 0 :(得分:14)

我非常清楚地认识到这个来源。那是Boykov-Kolmogorov Graph Cuts库。我建议你先做的是read their paper

Graph Cuts是一种交互式图像分割算法。您可以在图像中标记您认为属于对象(a.k.a。前景)的内容以及不属于该对象的内容(a.k.a the background)。那是你首先需要的。执行此操作后,图形剪切算法最佳猜测图像中其他像素的标签。它基本上会遍历每个未标记的其他像素,并确定它们是否属于前景和背景。

Graph Cuts背后的整个前提是图像分割类似于能量最小化。图像分割可以表示为具有两个项的总和的成本函数:

  1. Self-Penalty:这是将每个像素指定为前景或背景的成本。这也称为数据费用
  2. 相邻惩罚:这会强制相邻像素或多或少应共享相同的分类标签。这也称为平滑成本
  3. 这种公式是众所周知的最大后验马尔可夫随机场分类问题(MAP-MRF)。目标是最小化该成本函数,以便您实现最佳的图像分割。这实际上是一个 NP-Hard 问题,实际上是Clay Math Institute的资金问题之一。

    Boykov和Kolmogorov理论上证明了MAP-MRF问题可以转化为图论,解决MAP-MRF问题类似于拍摄图像并将其形成带有源和汇链接的图形,以及链接将相邻像素连接在一起。要解决MAP-MRF,请执行最大流量/最小割算法。有很多方法可以做到这一点,但是Boykov / Kolmogorov找到了一种更有效的方法,比更成熟的算法更快,比如Push-Relabel,Ford-Fulkenson等。

    自我惩罚是所谓的 t 链接,而相邻的惩罚则是所谓的 n 链接。您应该阅读论文以了解这些是如何计算的,但 t 链接描述了分类惩罚。基本上,将每个像素分类为属于前景或背景的成本是多少。这些通常基于图像的负对数概率分布。你所做的是创建一个被分类为前景的分布的直方图和一个被归类为背景的直方图。

    通常,前景和背景的每个颜色通道的统一量化就足够了。然后将这些转换为PDF但除以每个直方图中的元素总数,然后在计算每个像素的t链接时,访问颜色,然后查看它在直方图中的位置,然后取负数日志。这将告诉您将该像素分类为前景或背景需要多少费用。

    相邻像素成本更直观。人们通常只取一个像素和一个相邻像素之间的欧几里德距离,并将该距离应用于高斯。为简单起见,通常使用4像素邻域(北,南,东和西)。

    了解如何计算成本后,请按照以下步骤操作:

    1. 将像素标记为前景或背景。
    2. 使用图书馆
    3. 创建图表结构
    4. 计算前景和背景像素的直方图
    5. 计算t-links并添加到图表
    6. 计算n-links并添加到图表
    7. 调用图表上的maxflow例程来细分图像
    8. 浏览每个像素,找出该像素是属于前景还是背景。
    9. 创建一个反映这一点的二进制地图,然后复制二进制地图为真的图像像素,并且当它为假时不要这样做。
    10. maxflow的原始来源可在此处找到:http://pub.ist.ac.at/~vnk/software/maxflow-v3.03.src.zip

      它还有一个自述文件,因此您可以看到图书馆应该如何工作给出一些示例图像。

      你有很多要消化的东西,但Graph Cuts是最强大的交互式分割工具之一。

      祝你好运!