我正在尝试使用洪泛填充的队列实现来填充轮廓之外的所有内容。不过,我有一些问题推断出要添加到队列中的起点。在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;
}
}
什么是尺寸类型[] []? – em2er
@ em2er对不起我的坏。他们是int,在我的测试案例中,他们是400和400.我似乎可以插入0到起点,如果我删除'tmpSlice [NorthNode] == TargetColour'。显然我无法检查'tmpSlice [-399]'的值,这实际上是有意义的。但是现在轮廓的底部消失了。 –
考虑到Node的类型是int和size [] [],为什么你要使用类似'floor(Node /(sizes [1] * sizes [2]))''的表达式?如果int除以更大的int,结果始终为0,否则结果将已经被定位。 floor是浮点值,它在使用它的方式上没有意义。 – em2er