用于填充轮廓的线性算法

时间:2013-04-05 12:38:06

标签: c opencv image-processing

我正在尝试制作一个能够填充线性复杂度轮廓的算法。我知道这样的算法存在。我在某个地方看过它与交叉点的数量有关,但有一个特殊情况,我还没有好好解决。

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

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

1 个答案:

答案 0 :(得分:2)

您似乎正在寻找一般Polygon filling algorithm。您的线穿越计数算法将在其击中单点以及水平和垂直线的位置中断。请查看Quickfill以获取替代方案。