Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
c#获取不规则物体边缘坐标的其他快速方法?_C#_Image Processing - Fatal编程技术网

c#获取不规则物体边缘坐标的其他快速方法?

c#获取不规则物体边缘坐标的其他快速方法?,c#,image-processing,C#,Image Processing,我目前遇到了一个问题,那就是如何找到一个好的算法来获得物体每个外部边缘点的坐标,不幸的是,这个算法可能很复杂,并且包含内部区域 我有一个点列表,其中包含一个对象的每个像素点,这个对象已经由一个连接的组件标记算法生成。这使我能够检查图像中每个像素周围的每个坐标,如果不存在坐标,则通过以下内容我知道它是一个间隙或边缘 public List<IntPoint> SquareSearch(List<IntPoint> ListOfPoints, IntPoint point)

我目前遇到了一个问题,那就是如何找到一个好的算法来获得物体每个外部边缘点的坐标,不幸的是,这个算法可能很复杂,并且包含内部区域


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

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));
                }
            }
        }
    }       
}
public List SquareSearch(点列表、点列表)
{
列出未找到的像素=新列表();
int MoveX=点X;
int MoveY=点Y;
对于(int-LTR=MoveX-1;LTR-1))
{
添加(新的输入点(LTR,TTB));
}
}
}
}       
}

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

一个性能改进是使用
哈希集而不是
列表。这将大大加快检查速度。

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


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

解决方案是上述答案的组合,以便真正加快速度。我不仅需要一个新算法,而且必须使用哈希集。。。我采用了西奥·帕夫利迪斯的算法

不幸的是,该算法本身无法击败使用散列集的逐元素方法,但是将散列集合并到该算法中可以提高62%的速度。这也不是一个很难应用的方法,因此我只包括上面的页面


为所有帮忙的人干杯

这是一个好主意,但是如果物体内部的边缘接触的像素距离为零,事情可能会变得一团糟。我在想类似的事情,当你得到第一个未找到的像素并开始跟踪边缘时,你会爆发出来。但我的方法只是告诉你你有一个优势,它可能是一个内部的空白(如图所示)。所以我没办法知道我什么时候做完。至少你知道你有外缘。当物体没有“闭合边缘”时,它会变得更糟糕。触摸边界问题可以通过总是选择最“远离中心”的路径来解决。我相信在网上的某个地方是一个很好的算法,任何合适的算法都一定能击败暴力手段。一条偏离中心的路径可能会奏效。。。我会很快去做。你能添加你的结果图片吗?你是否尝试过[检测图像中的一些简单形状][1][1]:是的,我已经研究了一个图像,不幸的是,它的主要算法按行和列扫描图像,寻找最小和最大的x和y值,如果没有折叠的形状,这是很好的,如果他们这样做了,就会丢失一整段形状。而且我没有返回图像,我是在寻找一系列边缘点。我不确定我是否完全理解了你的问题。比如说,从连接区域的最高像素开始,然后沿着外部轮廓一直走,这能解决您的问题吗?我想我甚至可以找到一些旧的C代码,我在其中实现了一个相当标准的轮廓跟踪算法,就是为了这个目的,如果这是你想要的话。它将我的处理速度提高了约60%,仍然有点太慢,但感谢你向我介绍哈希集:)你提供的链接被破坏了:(@YuriyY.Yermilov)我的答案中没有链接…?感谢您花时间将答案放在后面供参考。如果有人需要一些代码,没问题,我已经写了这篇文章,并对网站进行了一些修改,现在可以在这里找到文章和代码