知道连通性,在升压邻接图中构建相邻顶​​点

时间:2014-04-22 16:02:22

标签: c++ image-processing boost-graph

升压图库存在问题。

在初始化步骤中,我想将图像存储在此邻接图中:

typedef boost::adjacency_list<boost::vecS,
                              boost::vecS,
                              boost::undirectedS,
                              boost::property<boost::vertex_bundle_t, unsigned int>,
                              boost::property<boost::edge_bundle_t, float>,
                              boost::no_property> GraphType

我做了第一个循环来为图像的每个像素创建一个顶点(使用OTB库来处理图像,in_iter只是图像像素上的迭代器):

unsigned long int curr_id = 0;
for(in_iter.GoToBegin(); !in_iter.IsAtEnd(); ++in_iter)
{
    boost::add_vertex(curr_id, *_graph);
    curr_id++;
}

现在我想为一个顶点创建它与邻居的连接(4个连接点): 我尝试了这个,但它不起作用:

curr_id = 0;
long int neighbors[4];
auto iterBounds = boost::vertices(*_graph);
for(auto v_iter = iterBounds.first; v_iter != iterBounds.second; v_iter++)
{
  FindNeighboring(curr_id, neighbors, rows, cols);
  for(short j = 0; j<4; j++)
  { 
    if(neighbors[j] > -1)
    {
      boost::add_vertex(*_graph->m_vertices[curr_id], 
                        *_graph->m_vertices[neighbors[j]],
                        std::numeric_limits<float>::max();
                        *_graph);
    }
  }
}

我想要知道它的位置来访问顶点描述符。 是否有可能在BGL中做到这一点?

感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

答案是&#34;是和否#34;。

如果您为图表使用通用adjacency_list,那么当然,您必须自己维护通信<coords> <--> <vertex>。你可以把它保存为boost :: unordered_map&lt;提供的映射。 Point,vertex_descriptor&gt;或者作为boost :: bimap甚至是std :: map。您有责任填充地图并使其与图表保持一致。

或者,您可以考虑BGL内置类grid_graph。它为您提供从坐标到顶点描述符的映射:

// Get the vertex associated with vertex_index
Traits::vertex_descriptor
vertex(Traits::vertices_size_type vertex_index,
       const Graph& graph);

// Get the index associated with vertex
Traits::vertices_size_type
get(boost::vertex_index_t,
    const Graph& graph,
    Traits::vertex_descriptor vertex);

(以及边缘的类似功能)。

在这里,您不需要创建单个顶点,只要您指定图形的尺寸,它们就会由图形构造函数中的BGL创建。

您可能希望使用某种自定义属性贴图将像素与每个顶点相关联,但这是一个单独的故事。