/// <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; } }
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; }