2017-03-18 26 views
0

我正在尝试使用洪泛填充的队列实现来填充轮廓之外的所有内容。不过,我有一些问题推断出要添加到队列中的起点。在C++中找不到FloodFill实现的正确startvalue

我定义了一个名为tmpSlice的400 * 400的新double,并用零填充。然后我映射标签值为1.0的轮廓。这部分工作得很好。

,会出现问题时,我必须起点推到队列最好的情况是推左上角或点0

但是我无法推送0为起点没有得到一个分段故障。我目前推160000这是tmpSlice的大小这是我已经能够插入没有错误的唯一号码。 然而,当我将160000推到队列上并且在洪水填充执行后,我运行从0-160000运行的循环(在代码的底部)。

此循环应将所有值为0和1的所有颜色都作为一个颜色,所有值为2的所有颜色都应为零。但目前tmpSlice里面一切都值0,除了拥有价值1

为了澄清2表示轮廓外的原始轮廓,1代表轮廓的边界,0表示轮廓

里面什么所以基本上,填充填充对我的数据集tmpSlice不起作用。我认为这是因为插入队列的起始点,但我一直无法插入任何值的工作。

想法? PS。 我仅限于使用新的double,因为vector :: std不能与我正在使用的minc库中的一些函数一起使用。

 /* Flood fill */ 
    //Colour we are looking for as background 
    int TargetColour = 0.0; 
    //The new colour we will write 
    int NewColour = 2.0; 
    //create set to secure unique entries into the queue, otherwise we etc. insert the 9th element in a 3x3 array 6 times. 
    set <int> Set; 
    //Create queue 
    queue <int> MyQue; 
    //Insert first point into the queue 
    MyQue.push(sizes[1]*sizes[2]); 
    int Node; 
    //While loop for iterating over the nodes. 
    while (!MyQue.empty()){ 
     //Set front element to Node, and pop the front element from queue 
     Node = MyQue.front(); 
     MyQue.pop(); 

     //Change the colour to newcolour 
     tmpSlice[Node] = NewColour; 
     //Define the Node directions 
     int WestNode = Node-1; 
     int EastNode = Node+1; 


     //sizes are the lengths x,y 
     int NorthNode = Node-sizes[1]; 
     int SouthNode = Node+sizes[2]; 

     //Boundary checks 
     EastNodeBoundaryCheck = floor((Node-sizes[1]*sizes[2]*floor(Node/(sizes[1]*sizes[2])))/sizes[1]) == floor((EastNode-sizes[1]*sizes[2]*floor(EastNode/(sizes[1]*sizes[2])))/sizes[1]); 
     SouthNodeBoundaryCheck = floor(Node/(sizes[1]*sizes[2])) == floor(SouthNode/(sizes[1]*sizes[2])); 
     WestNodeBoundaryCheck = floor((Node-sizes[1]*sizes[2]*floor(Node/(sizes[1]*sizes[2])))/sizes[1]) == floor((WestNode-sizes[1]*sizes[2]*floor(WestNode/(sizes[1]*sizes[2])))/sizes[1]); 
     NorthNodeBoundaryCheck = floor(Node/(sizes[1]*sizes[2])) == floor(NorthNode/(sizes[1]*sizes[2])); 


     //East Node 
     if (Set.insert(EastNode).second) { 
      if (tmpSlice[EastNode] == TargetColour && EastNodeBoundaryCheck == 1){ 
       MyQue.push(EastNode); 
      } 
      } 

      //South Node 
     if (Set.insert(SouthNode).second) { 
      if (tmpSlice[SouthNode] == TargetColour && SouthNodeBoundaryCheck == 1){ 
       MyQue.push(SouthNode); 
      } 
     } 

     //West Node 
     if (Set.insert(WestNode).second) { 
      if (tmpSlice[WestNode] == TargetColour && WestNodeBoundaryCheck == 1){ 
       MyQue.push(WestNode); 
      } 
     } 

     //North Node 
     if (Set.insert(NorthNode).second) { 
      if (tmpSlice[NorthNode] == TargetColour && NorthNodeBoundaryCheck == 1){ 
       MyQue.push(NorthNode); 
       } 
     } 


    } 

    // Insert the colored points as 0 and everything else as 1 
    for(i = 0; i < sizes[1]*sizes[2]; i++){ 
     if(tmpSlice[i] == 0.0 || 1.0){ 
      slab[first_voxel_at_slice + i] = 1.0; 
     } 
     if(tmpSlice[i] == 2.0){ 
      slab[first_voxel_at_slice + i] = 0.0; 
     } 
} 
+0

什么是尺寸类型[] []? – em2er

+0

@ em2er对不起我的坏。他们是int,在我的测试案例中,他们是400和400.我似乎可以插入0到起点,如果我删除'tmpSlice [NorthNode] == TargetColour'。显然我无法检查'tmpSlice [-399]'的值,这实际上是有意义的。但是现在轮廓的底部消失了。 –

+0

考虑到Node的类型是int和size [] [],为什么你要使用类似'floor(Node /(sizes [1] * sizes [2]))''的表达式?如果int除以更大的int,结果始终为0,否则结果将已经被定位。 floor是浮点值,它在使用它的方式上没有意义。 – em2er

回答

0

,我发现自己的答案回答:-) 我需要检查NorthNode如果第一行,以避免分段错误是大于0评论时。

  //North Node 
     if (Set.insert(NorthNode).second) { 
      if (NorthNode > 0){ 
       if (tmpSlice[NorthNode] == TargetColour && NorthNodeBoundaryCheck == 1){ 
         MyQue.push(NorthNode); 
        } 
      } 
     }