我正在尝试制作一种算法来填充线性复杂度的轮廓。我知道存在这样的算法。我在某处读到它与过境次数有关,但有一个特殊情况我还没有很好地解决。
到目前为止,我已经尝试使用以下算法。请注意,我无法访问以前的元素(左侧),因为它们将/可能被覆盖:
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;
}
}
}
我得到的结果如下。输入在右侧(必须复制所有非黑色像素),错误输出在左侧。再次注意,我只有右侧的图像轮廓(未渲染)。