Example #1
0
        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);
        }