填充轮廓的线性算法

问题描述:

我正在尝试制作一个算法,以填充线性复杂度中的轮廓。我知道这样的算法存在。我已经在某处读到它与交叉口数量有关的问题,但有一个特殊情况,我还没有很好的解决问题。填充轮廓的线性算法

到目前为止,我已经尝试使用以下算法。请注意,我无法访问以前的元素(左侧),因为它们会/可能会被改写:

for (int y = blob->miny; y < blob->maxy; ++y) 
{ 
int NumberOfBorderCrossings = 0; 
unsigned int NextElem = 0; 
unsigned int NextNextElem = 0; 
for (int x = blob->minx-1; x < blob->maxx-1; ++x) 
{ 
    NextElem = CV_IMAGE_ELEM(labelimg,unsigned int,y,x+1); 
    NextNextElem = CV_IMAGE_ELEM(labelimg,unsigned int,y,x+2); 

    if (CV_IMAGE_ELEM(labelimg,unsigned int,y,x) != label) 
    { 
     if (NextElem == label && NextNextElem != label) 
      ++NumberOfBorderCrossings; 
     else 
      if (NumberOfBorderCrossings%2) 
       CV_IMAGE_ELEM(labelimg,unsigned int,y,x) = label; 
    } 

} 
} 

结果我得到的是以下几点。输入在右边(所有非黑色像素必须被复制),而错误的输出在左边。再次请注意,我只有图像的轮廓在右侧(未呈现)。 enter image description here

+0

'++ x'&'++ y'?那真的是你想要的吗? – devnull 2013-04-05 13:13:22

+0

是的,图像有多行。线性我的意思是线性复杂度(与斑点的大小线性缩放) – 2013-04-05 13:16:11

+0

详细说明“填充轮廓”的含义是有帮助的。 – 2013-04-05 13:25:13

看来您正在寻找一般的Polygon filling algorithm。您的线路交叉计数算法将打破它碰到单点和水平线和垂直线的地方。看看Quickfill可能的替代方案。

+0

这是正确的。我将尝试实施快速填充算法。 – 2013-04-05 13:33:38