public List<AnalyzedObject> analyzeImage(Bitmap origImage) { ColorRange redRange = new ColorRange(); redRange.redMin = 150; redRange.redMax = 256; redRange.greenMin = 0; redRange.greenMax = 80; redRange.blueMin = 0; redRange.blueMax = 80; ColorRange greenRange = new ColorRange(); greenRange.redMin = 0; greenRange.redMax = 50; greenRange.greenMin = 120; greenRange.greenMax = 256; greenRange.blueMin = 50; greenRange.blueMax = 180; int[,] idMat = new int[origImage.Width, origImage.Height]; int currId = 0; Bitmap segImage = modify(origImage, redRange, greenRange, idMat, ref currId); int[] lookup = new int[currId + 1]; createIdLookup(segImage, idMat, lookup, ref currId); fixIds(idMat, segImage.Width, segImage.Height, lookup); List<AnalyzedObject> objects = new List<AnalyzedObject>(); AnalyzedObject[] tmpObj = new AnalyzedObject[currId + 1]; findObjects(segImage, idMat, tmpObj); int count = 1; for (int i = 1; i <= currId; ++i) { if (tmpObj[i] == null) continue; if (tmpObj[i].size < 40) continue; tmpObj[i].id = count; objects.Add(tmpObj[i]); ++count; } //detectObj(segImage, objects); //sizeFilter(objects, origImage); blackOtherFilter(objects, origImage); //blackBoxFilter(objects, origImage); //decide(result); return objects; }
static Bitmap modify(Bitmap im, ColorRange redRange, ColorRange greenRange, int[,] idMat, ref int currId) { Bitmap res = new Bitmap(im.Width, im.Height); for (int i = 1; i < im.Width-1; ++i) { for (int j = 1; j < im.Height-1; ++j) { if (redRange.inRange(im.GetPixel(i, j))) //if (im.GetPixel(i, j).isRed()) { res.SetPixel(i, j, Color.red); int idToUse = setId(im, idMat, ref currId, i, j); dilate(im, ref res, Color.red, i, j, 10, idMat, idToUse); } else if (greenRange.inRange(im.GetPixel(i, j))) //else if (im.GetPixel(i, j).isGreenLight()) { res.SetPixel(i, j, Color.green); int idToUse = setId(im, idMat, ref currId, i, j); dilate(im, ref res, Color.green, i, j, 10, idMat, idToUse); } } } return res; }
static void dilate(Bitmap orig, ref Bitmap res, Color paint, int x, int y, int w, int[,] idMat, int currId) { Color pixel = orig.GetPixel(x, y); ColorRange range = new ColorRange(); int delta = 30; range.redMin = (int) (Math.Max(pixel.R - delta, 0)); range.redMax = (int)(Math.Min(pixel.R + delta, 255)); range.greenMin = (int)(Math.Max(pixel.G - delta, 0)); range.greenMax = (int)(Math.Min(pixel.G + delta, 255)); range.blueMin = (int)(Math.Max(pixel.B - delta, 0)); range.blueMax = (int)(Math.Min(pixel.B + delta, 255)); int startX = Math.Max(0, x - w); int endX = Math.Min(orig.Width, x + w); int startY = Math.Max(0, y - w); int endY = Math.Min(orig.Height, y + w); for (int i = startX; i < endX; ++i) { for (int j = startY; j < endY; ++j) { if (idMat[i, j] != 0) continue; if (range.inRange(orig.GetPixel(i, j))) { res.SetPixel(i, j, paint); idMat[i, j] = currId; } } } }