4

当我使用 BGL boykov_kolmogorov_max_flow() 函数时,我得到了奇怪的结果。我虽然会看到 2 个类(0-1 或其他任何东西,但只有 2 个!)但我经常看到三个类:0、1 和 4。

例如,使用下面的图像

  • 来源:左边框的中间像素
  • sink:右边框的中间像素
  • 水平边缘成本 = 10 * e^(rightPixel / 50)
  • 垂直边码 = 0.1。

8 位图像

我得到以下结果:

444444444444400000000000000000
444444444444440000000000000000
444444444444440000000000000000
444444444444440000000000000000
444444444444444000000000000000
444444444444444000000000000000
444444444444444000000000000000
444444444444444000000000000000
444444444444444000000000000000
444444444444444000000000000000
444444444444444411000000000000
444444444444444444000000000000
444444444444444444000000000000
444444444444444444000000000000
444444444441111111000000000000
444444444440000000000000000000
444444444440000000000000000000
444444444440000000000000000000
444444444440000000000000000000
444444444444000000000000000000
444444444444000000000000000000
444444444444100000000000000000
444444444444110000000000000000
444444444444110000000000000000
444444444444411000000000000000
444444444444444400000000000000
444444444444444400000000000000
444444444444444400000000000000
444444444444444400000000000000
444444444444444400000000000000

有人可以解释这些类的真正含义吗?我很确定 4 是源类,0 是接收器类,但是 1 呢?我在文档中一无所获。我认为这意味着一个“不确定”的水平区域,但为什么会这样呢?!?

第二个问题。1可靠吗?是否可以使用它们找到更平滑的边框,如下图所示?目标是选择一个绿色像素而不是右侧太远的红色像素。我的意思是,我知道在这种情况下我可以使用 1 来做到这一点,但是我可以相信他们在我需要的时候会在那里吗?:)

彩色边框

谢谢你的时间。

4

1 回答 1

1

在您的示例中:

boykov_kolmogorov_max_flow(graph,
     make_iterator_property_map(&capacity[0], get(boost::edge_index, graph)), 
     make_iterator_property_map(&residual_capacity[0], get(boost::edge_index, graph)),
     make_iterator_property_map(&reverse_edges[0], get(boost::edge_index, graph)), //CHANGED
     make_iterator_property_map(&groups[0], get(boost::vertex_index, graph)),
     get(boost::vertex_index, graph),
     s,
     t
 );

他们从这里调用以下构造函数:

boykov_kolmogorov_max_flow(Graph& g,
                       CapacityEdgeMap cap,
                       ResidualCapacityEdgeMap res_cap,
                       ReverseEdgeMap rev,
                       ColorMap color,
                       IndexMap idx,
                       typename graph_traits<Graph>::vertex_descriptor src,
                       typename graph_traits<Graph>::vertex_descriptor sink)

这意味着,您认为的类确实是颜色。根据文件

如果运行算法后顶点的颜色为黑色,则该顶点属于源树,否则它属于汇树(用于最小切割)。

现在,如果您在这里查看默认颜色图,颜色是从 0 到 4 的枚举,其中 4 是黑色。

通过所有这些,您可以得出结论,4 确实是源,但其他所有内容(包括 1)都属于接收器!

不同的颜色可能取决于实现本身,但我认为你不能在不知道实现是什么的情况下对 1 做出任何假设......

于 2013-07-04T06:52:28.093 回答