4

我目前在寻找一个好的算法来获取对象的每个外边缘点的坐标时遇到问题,不幸的是,它可能很复杂并且包含内部区域。


在此处输入图像描述

我有一个点列表,其中包含已从连接组件标记算法生成的对象的每个像素点。这使我能够检查图像中每个像素周围的每个坐标,如果不存在,那么我可以通过以下方式知道它的间隙或边缘。

public List<IntPoint> SquareSearch(List<IntPoint> ListOfPoints, IntPoint point)
{
    List<IntPoint> UnfoundPixels = new List<IntPoint>();

    int MoveX = point.X;
    int MoveY = point.Y;

    for (int LTR = MoveX - 1; LTR <= MoveX + 1; LTR++)
    {
        for (int TTB = MoveY - 1; TTB <= MoveY + 1; TTB++)
        {
            if (ListOfPoints.IndexOf(new IntPoint(LTR, TTB)) == -1)
            {
                if ((LTR > -1) && (TTB > -1))
                {
                   UnfoundPixels.Add(new IntPoint(LTR, TTB));
                }
            }
        }
    }       
}

然而,这个过程非常缓慢并且与每个对象的大小成正比,因为它必须针对对象中的每个像素重复。关于替代方法的任何建议?

4

3 回答 3

2

我会尝试制作某种“边缘检测”算法。

假设您在图像中间从上到下向下直到碰到边缘,然后您可以通过扫描您周围的 8 个像素来跟随该边缘并像这样围绕对象工作。在每个位置上,您检查当前坐标是否在边界框之外,并根据需要增加。

于 2013-04-03T14:13:18.510 回答
1

一种性能改进是使用 aHashSet<T>而不是 a List<T>。这将大大加快检查速度。

于 2013-04-03T14:12:21.827 回答
1

好吧,解决方案是上述答案的组合,因为要真正加快速度,我不仅需要一个新算法,而且我必须使用哈希集来......我选择了 Theo Pavlidis 的算法

http://www.imageprocessingplace.com/downloads_V3/root_downloads/tutorials/contour_tracing_Abeer_George_Ghuneim/theo.html

不幸的是,该算法本身无法击败使用散列集的逐元素方法,但是将散列集结合到算法中产生了 62% 的速度提升。它也不是一个难以应用的方法,因此我只包含了上面的页面。

为所有帮助过的人干杯。

于 2013-04-15T15:28:24.760 回答