public static List <Blob> FindBlobs(bool[] pixels, int width, int height, int dilation = 2) { List <Blob> blobs = new List <Blob>(); Stack <Point> stack = new Stack <Point>(); bool[] isSeen = new bool[pixels.Length]; for (int x = dilation; x < width - dilation; ++x) { for (int y = dilation; y < height - dilation; ++y) { int z = x * height + y; if (!isSeen[z] && pixels[z]) { stack.Clear(); Blob blob = new Blob(); blob.AddPoint(x, y); stack.Push(new Point(x, y)); isSeen[z] = true; while (stack.Count > 0) { Point p = stack.Pop(); for (int i = p.X - dilation; i <= p.X + dilation; ++i) { for (int j = p.Y - dilation; j <= p.Y + dilation; ++j) { if (i < 0 || i >= width || j < 0 || j >= height) { continue; } int k = i * height + j; if (!isSeen[k] && pixels[k]) { blob.AddPoint(i, j); stack.Push(new Point(i, j)); isSeen[k] = true; } } } } if (blob.Count > 20) { blobs.Add(blob); } } else { isSeen[z] = true; } } } return(blobs); }