c# - 从坐标获得第一、第二、第三邻居的算法

标签 c# image algorithm image-processing

在每个像素的位图中,我试图获得它的第一、第二、第三……级别的邻居,直到位图结束,但我的解决方案有点慢,所以如果有任何问题请告诉我你们有更好的算法或方法来做到这一点:

example

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];

}

最佳答案

好吧,如果这太慢了,您可能需要改变您的方法。

例如生成一个Dictionary<Color, List<Point>>对于位图中的每种颜色,它都有一个点列表,这些点是该颜色。然后当你得到一个点时,你会得到颜色,然后遍历点列表以找到最接近给定点的点。

这是对您的图像进行 1 次预计算,然后将复杂度更改为相同颜色的点数。我假设目前它很慢,因为你必须查看很多点,因为很难找到具有相同颜色的点。

关于c# - 从坐标获得第一、第二、第三邻居的算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16153721/

相关文章:

html - 带有 Sprite 图像的 Div

java - 构建堆时间复杂度最坏情况与上限/严格上限

c# - Ninject InThreadScope 绑定(bind)

c# - 从 byte[] 返回文件在 MVC 3 中无法正常工作

c# - 如何遍历元组项

java - 在单个小程序中显示多个图像

image - 如何更改 UIImageView 中 UIImage 的位置

有效绘制树木的算法?

algorithm - 产品的最大总和

c# - 如何使用 C# Ado.Net 在 sql 查询中查找参数