我目前遇到一个问题,找到一个好的算法来获取一个对象的每个外边缘点的坐标,遗憾的是它可能很复杂并且包含内部区域。
我有一个包含已经从连接组件标记算法生成的对象的每个像素点的点列表。这使我能够检查图像中每个像素周围的每个坐标,如果不存在,则通过以下内容知道它的间隙或边缘。
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));
}
}
}
}
}
然而,经历这个过程非常缓慢并且与每个对象的大小成比例,因为必须对对象中的每个像素重复它。有关替代方法的任何建议吗?
答案 0 :(得分:2)
我会尝试制作某种“边缘检测”算法。
假设你在图像中间从上到下走,直到你碰到一个边缘,然后你可以通过扫描你周围的8个像素来跟随这个边缘并像这样绕着对象。在每个位置上,检查当前坐标是否在边界框之外,并根据需要增加。
答案 1 :(得分:1)
一项绩效改进是使用HashSet<T>
而不是List<T>
。这将大大加快检查速度。
答案 2 :(得分:1)
嗯,解决方案是上述答案的组合,以便真正加快速度,不仅我需要一个新的算法,而且我不得不使用哈希集......我选择了Theo Pavlidis的算法
不幸的是,算法本身无法使用散列集击败逐个元素的方法,但是在算法中加入散列集会产生62%的速度增加。它也不是一个难以应用的方法因此我只包括上面的页面。
为每个帮助过的人欢呼。