Пример #1
0
        /// <summary>
        /// 获取联通区域
        /// </summary>
        /// <param name="inBase"></param>
        /// <param name="regions"></param>
        /// <param name="x"></param>
        /// <param name="y"></param>
        /// <param name="w"></param>
        /// <param name="h"></param>
        private void grow(ref GrayImg inBase, ref ConnectedRegions regions, int x, int y, int w, int h)
        {
            Stack<int> indicies = new Stack<int>();
            indicies.Push(x + y * w);
            int minX = x;
            int maxX = x;
            int minY = y;
            int maxY = y;
            while (indicies.Count > 0)
            {
                int index = indicies.Pop();
                y = (int)Math.Floor((float)index / (float)w);
                x = index - y * w;
                for (int i = -1; i <= 1; i++)
                {
                    for (int j = -1; j <= 1; j++)
                        if (x + i >= 0 && x + i < w && y + j >= 0 && y + j < h)
                        {
                            int newIndex = x + i + (y + j) * w;
                            if (inBase.Img[newIndex] == 255)
                            {
                                indicies.Push(newIndex);
                                inBase.Img[newIndex] = 0;
                                if (x + i > maxX)
                                    maxX = x + i;
                                if (x + i < minX)
                                    minX = x + i;
                                if (y + i > maxY)
                                    maxY = y + i;
                                if (y + i < minY)
                                    minY = y + i;
                            }
                        }

                }
            }
            Rectangle r = new Rectangle();
            r.X = minX;
            r.Y = minY;
            r.Width = maxX - minX;
            r.Height = maxY - minY;
            if (r.Width * r.Height >= regions.maxRect.Width * regions.maxRect.Height)
                regions.maxRect = r;
            if (r.Width * r.Height <= regions.minRect.Width * regions.minRect.Height)
                regions.minRect = r;
            int midW = (r.Width / 100) * 40;
            int midH = (r.Height / 100) * 40;
            for (int i = minX + midW; i <= maxX - midW; i++)
            {
                for (int j = minY + midW; j <= maxY - midW; j++)
                    regions.connected[i + j * w] = 255;
            }
        }
Пример #2
0
 public ConnectedRegions getConnectedRegions(GrayImg inBase, int w, int h)
 {
     ConnectedRegions regions = new ConnectedRegions();
     regions.connected = new byte[w * h];
     regions.maxRect = new Rectangle(0, 0, 0, 0);
     regions.minRect = new Rectangle(0, 0, w, h);
     Rectangle c = new Rectangle();
     c.Width = c.Height = c.X = c.Y = 0;
     for (int x = 0; x < w; x++)
     {
         for (int y = 0; y < h; y++)
             if (inBase.Img[x + y * w] == 255)
                 grow(ref inBase, ref regions, x, y, w, h);
     }
     return regions;
 }