算法从坐标中获取第一,第二,第三个邻居

eli*_*264 2 c# algorithm image image-processing

在每个像素的位图中,我试图得到它的第一个,第二个,第三个......级别的邻居,直到位图结束,但我的解决方案有点慢,所以让我知道你们是否有人更好的算法或方法:

例

private IEnumerable<Point> getNeightboorsOfLevel(int level, Point startPos, Point[,] bitMap)
{
    var maxX = bitMap.GetLength(0);
    var maxY = bitMap.GetLength(1);
    if (level > Math.Max(maxX, maxY)) yield break;

    int startXpos = startPos.X - level;
    int startYpos = startPos.Y - level;
    int sizeXY = level * 2;

    var plannedTour = new Rectangle(startXpos, startYpos, sizeXY, sizeXY);
    var tourBoundaries = new Rectangle(0, 0, maxX, maxY);

    for(int UpTour  = plannedTour.X; UpTour<plannedTour.Width; UpTour++) 
        if (tourBoundaries.Contains(UpTour,plannedTour.Y)) 
            yield return bitMap[UpTour,plannedTour.Y];

    for(int RightTour  = plannedTour.Y; RightTour<plannedTour.Height;RightTour++)
        if (tourBoundaries.Contains(plannedTour.Right,RightTour)) 
            yield return bitMap[plannedTour.Right,RightTour];

    for(int DownTour  = plannedTour.X; DownTour<plannedTour.Width;DownTour++)
        if (tourBoundaries.Contains(DownTour,plannedTour.Bottom)) 
            yield return bitMap[DownTour,plannedTour.Bottom];

    for (int LeftTour = plannedTour.Y; LeftTour < plannedTour.Height; LeftTour++)
        if (tourBoundaries.Contains(plannedTour.X,LeftTour)) 
            yield return bitMap[plannedTour.X,LeftTour];

}
Run Code Online (Sandbox Code Playgroud)

tst*_*ter 6

好吧,如果这太慢了,你可能想改变你的方法.

例如,Dictionary<Color, List<Point>>为位图中的每种颜色生成一个具有该颜色的点列表.然后,当您获得一个点时,您将获得颜色,然后浏览点列表以找到与给定点最接近的点.

这是对图像进行1次预计算,然后将复杂度更改为相同颜色的点数.我现在假设它很慢,因为你必须看很多点,因为找到一个颜色相同的点是很少见的.