private void button1_Click(object sender, EventArgs e) { if (comboBox1.SelectedIndex == 0) { textBox1.Text = ""; ConnectedComponentsLabeling filterCCL = new ConnectedComponentsLabeling(); Bitmap resultCCL = filterCCL.Apply(imageCCL); pictureBox2.Image = resultCCL; int count = filterCCL.ObjectCount; String info = "Mode \t\t : CCL \r\n Jumlah Object \t : " + count; textBox1.Text = info; } if (comboBox1.SelectedIndex == 1) { textBox1.Text = ""; convexHullBlov(imageCCL); } if (comboBox1.SelectedIndex == 2) { textBox1.Text = ""; houghTranformLine666(imageHough); } if (comboBox1.SelectedIndex == 3) { textBox1.Text = ""; houghCircle(imageHough); } }
private void connectedCompenetAnalysToolStripMenuItem_Click(object sender, EventArgs e) { // create filter ConnectedComponentsLabeling filter = new ConnectedComponentsLabeling(); // apply the filter ApplyFilter(filter); }
public mFigureUnique() { BitmapType = BitmapTypes.Rgb24bpp; Effect = new ConnectedComponentsLabeling(); filter = Effect; }
private void colorize_Click(object sender, EventArgs e) { //filtre oluşturuldu ConnectedComponentsLabeling filtre = new ConnectedComponentsLabeling(); Bitmap boyaliResim = filtre.Apply((Bitmap)pictureBox1.Image); pictureBox1.Image = boyaliResim; }
private void button2_Click(object sender, EventArgs e) { gbr = (Bitmap)pictureBox1.Image; ConnectedComponentsLabeling filter = new ConnectedComponentsLabeling(); Bitmap final = filter.Apply(gbr); pictureBox2.Image = final; MessageBox.Show(filter.ObjectCount.ToString() + " Buah Objek", "Connected Component Labeling"); }
public mAnalyzeBlobs() { BitmapType = 0; Effect = new ConnectedComponentsLabeling(); Sequence.Clear(); Sequence.Add(Effect); }
private void connectedComponentsLabeling() // Connected components labelling { // Declare variables Bitmap bitmap = new Bitmap(pictureBox1.Image); // create filter ConnectedComponentsLabeling filter = new ConnectedComponentsLabeling(); // apply the filter Bitmap ccLImage = filter.Apply(bitmap); // check objects count int objectCount = filter.ObjectCount; pictureBox1.Image = ccLImage; }
public List <Bitmap> PreHandle2(Bitmap original) { var preOcr = new FiltersSequence( Grayscale.CommonAlgorithms.RMY, new BradleyLocalThresholding()); var grayscale = preOcr.Apply(original); GrayImg.Source = Bitmap2BitmapImageSource(grayscale); var filter = new BlobsFiltering { CoupledSizeFiltering = true, MinHeight = 6, MinWidth = 6 }; var filterImage = filter.Apply(new Invert().Apply(grayscale)); ThresholdImg.Source = Bitmap2BitmapImageSource(filterImage); var invertImg = new Invert().Apply(filterImage); DoneImg.Source = Bitmap2BitmapImageSource(invertImg); var labels = new ConnectedComponentsLabeling(); labels.BlobCounter.ObjectsOrder = ObjectsOrder.XY; labels.Apply(filterImage); var bitmaps = new List <Bitmap>(); for (int i = 0; i < labels.ObjectCount; i++) { var candidate = labels.BlobCounter.GetObjectsInformation()[i]; var edgePoint = labels.BlobCounter.GetBlobsEdgePoints(candidate); labels.BlobCounter.ExtractBlobsImage(filterImage, candidate, false); if (candidate.Image != null) { var charcter = new Invert().Apply(candidate.Image.ToManagedImage()); var resizer = new ResizeBilinear(10, 10); var finalImage = resizer.Apply(charcter); bitmaps.Add(finalImage); TesseractEngine a = new TesseractEngine(@"./tessdata", "eng", EngineMode.TesseractAndCube); Page p = a.Process(finalImage); TBlock.Text += p.GetText(); } } return(bitmaps); }
public mFigureUnique(wDomain WidthRange, wDomain HeightRange) { Width = WidthRange; Height = HeightRange; BitmapType = BitmapTypes.Rgb24bpp; Effect = new ConnectedComponentsLabeling(); Effect.MinWidth = (int)Width.T0; Effect.MaxWidth = (int)Width.T1; Effect.MinHeight = (int)Height.T0; Effect.MaxHeight = (int)Height.T1; filter = Effect; }
public mAnalyzeBlobs(Bitmap BaseBitmap, wDomain WidthRange, wDomain HeightRange) { Width = WidthRange; Height = HeightRange; BitmapType = 0; Effect = new ConnectedComponentsLabeling(); Effect.MinWidth = (int)Width.T0; Effect.MaxWidth = (int)Width.T1; Effect.MinHeight = (int)Height.T0; Effect.MaxHeight = (int)Height.T1; Effect.Apply(BaseBitmap); Effect.BlobCounter.ProcessImage(BaseBitmap); Sequence.Clear(); Sequence.Add(Effect); }
static void Main(string[] args) { using (Bitmap bitmap = new Bitmap("./Images/check1.jpg")) { using (Bitmap clone = bitmap.Clone() as Bitmap) { Console.WriteLine("width = " + clone.Width + ", height = " + clone.Height); FiltersSequence seq = new FiltersSequence(); //添加灰度滤镜 seq.Add(Grayscale.CommonAlgorithms.BT709); Median median = new Median(5); seq.Add(median); seq.Add(new AdaptiveSmoothing()); //添加二值化过滤器 seq.Add(new OtsuThreshold()); Bitmap result = seq.Apply(bitmap); ConnectedComponentsLabeling connectedFilter = new ConnectedComponentsLabeling(); connectedFilter.MinWidth = 50; connectedFilter.MinHeight = 50; result = connectedFilter.Apply(result); result.Save("1.jpg"); Blob[] blobs2 = connectedFilter.BlobCounter.GetObjectsInformation().Where(r => r.Area > 1000).ToArray(); Console.WriteLine(blobs2.Length); BlobCounter extractor = new BlobCounter(); extractor.FilterBlobs = true; extractor.MinWidth = 50; extractor.MinHeight = 50; extractor.ProcessImage(result); Blob[] blobs = extractor.GetObjectsInformation(); Console.WriteLine(blobs.Length); } } }
public mFigureUnique(wDomain WidthRange, wDomain HeightRange, bool coupled, bool blob) { Width = WidthRange; Height = HeightRange; Coupled = coupled; Blob = blob; BitmapType = BitmapTypes.Rgb24bpp; Effect = new ConnectedComponentsLabeling(); Effect.MinWidth = (int)Width.T0; Effect.MaxWidth = (int)Width.T1; Effect.MinHeight = (int)Height.T0; Effect.MaxHeight = (int)Height.T1; Effect.CoupledSizeFiltering = Coupled; Effect.FilterBlobs = Blob; filter = Effect; }
public string GetCode(Bitmap bitmap, Bitmap rbitmap) { var bnew = new Bitmap(bitmap.Width, bitmap.Height, PixelFormat.Format24bppRgb); Graphics g = Graphics.FromImage(bnew); g.DrawImage(bitmap, 0, 0); g.Dispose(); //灰度化 bnew = Grayscale.CommonAlgorithms.RMY.Apply(bnew); //二值化 bnew = new Threshold(50).Apply(bnew); //反色 bnew = new Invert().Apply(bnew); //去噪点 //bnew = new BlobsFiltering(3, 3, bnew.Width, bnew.Height).Apply(bnew); //连接区匹配 ConnectedComponentsLabeling f = new ConnectedComponentsLabeling(); f.Apply(bnew); //滤噪点 Rectangle[] regs = f.BlobCounter.GetObjectsRectangles(); Rectangle[] regs2 = regs.OrderByDescending(m => m.Size.Height).Take(4).ToArray(); _cmap = new List <Bitmap>(); foreach (Rectangle reg in regs2) { Bitmap rb = bitmap.Clone(reg, PixelFormat.Format24bppRgb); _code += Match(rb); _cmap.Add(rb); } // Graphics g2 = Graphics.FromImage(rbitmap); g2.DrawImage(bnew, 0, 0); g2.DrawRectangles(new Pen(Color.Red), regs2); g2.Dispose(); return(_code); }
private void coToolStripMenuItem_Click(object sender, EventArgs e) { ConnectedComponentsLabeling filter = new ConnectedComponentsLabeling(); pictureBox2.Image = filter.Apply((Bitmap)pictureBox2.Image); }
private void button2_Click(object sender, EventArgs e) { Bitmap bmp = new Bitmap(pictureBox1.Image); Bitmap bmpsobe; Bitmap bmpmedian; Bitmap otsu; if (pictureBox1.Image == null) { MessageBox.Show("Lütfen önce bir resim Seçin"); } else { progressBar1.Visible = true; int i, j; Color ort;//Color sınıfından bir renk nesne tanımlıyoruz. //int r,g,b; progressBar1.Maximum = bmp.Width * bmp.Height; //İşlem çubuğunun maksimim olduğu yer for döngüsünün sonundaki piksel değerine erişmemiz durumundadır. for (i = 0; i <= bmp.Width - 1; i++) //dikey olarak görüntümüzü tarıyoruz. { for (j = 0; j <= bmp.Height - 1; j++) //yatay olarak görüntümüzü tarıyoruz. { ort = bmp.GetPixel(i, j); ort = Color.FromArgb((byte)((ort.R + ort.G + ort.B) / 3), (byte)((ort.R + ort.G + ort.B) / 3), (byte)((ort.R + ort.G + ort.B) / 3)); bmp.SetPixel(i, j, ort); if ((i % 10) == 0)//her on satırda bir göstergeyi güncelle { progressBar1.Value = i * bmp.Height + j; Application.DoEvents(); } } } } //////////////////////// Median ////////////// bmpmedian = ExtBitmap.MedianFilter(bmp, 3); /////////////////////// SOBEL /////////////// bmpsobe = ExtBitmap.Sobel3x3Filter(bmpmedian, true); Bitmap bmpsobe1 = (Bitmap)bmpsobe.Clone(); /////////// otsu int x, y; int genislik = bmpsobe1.Width; int yukseklik = bmpsobe1.Height; byte[] pixeller = new byte[(int)genislik * yukseklik]; Bitmap resim = (Bitmap)bmpsobe1.Clone(); for (y = 0; y < yukseklik; y++) { for (x = 0; x < genislik; x++) { // Pixelleri kütüphanenin işleyebileceği tek boyutlu bir diziye atıyoruz. // Gri seviyede tüm ana renkler eşit olduğu için sadece kırmızıyı okumak gri seviye için yeterli. pixeller[y * genislik + x] = resim.GetPixel(x, y).R; } } byte esikDeger = 0; OtsuEsikleme(ref pixeller[0], ref esikDeger, genislik, yukseklik); int renkk; for (y = 0; y < yukseklik; y++) { for (x = 0; x < genislik; x++) { renkk = pixeller[y * genislik + x]; // gri resim.SetPixel(x, y, Color.FromArgb(renkk, renkk, renkk)); // Gri seviyeyi argb moduna dönüştürüp resme aktarıyoruz. } } otsu = (Bitmap)resim.Clone(); Bitmap bmperosion; Bitmap bmpdilation; Bitmap bmpclosing; bmperosion = ExtBitmap.DilateAndErodeFilter(otsu, 3, akıllıgecissistemleri.ExtBitmap.MorphologyType.Erosion, true, true, true); Bitmap bmperosionn = (Bitmap)bmperosion.Clone(); bmpdilation = ExtBitmap.DilateAndErodeFilter(bmperosionn, 7, akıllıgecissistemleri.ExtBitmap.MorphologyType.Dilation, true, true, true); Bitmap bmpdilationn = (Bitmap)bmpdilation.Clone(); Bitmap one = (Bitmap)bmpdilationn.Clone(); BlobsFiltering filter0 = new BlobsFiltering(); // filtre ayarlaması filter0.CoupledSizeFiltering = true; filter0.MinWidth = 70; filter0.MinHeight = 40; // filtre uygula filter0.ApplyInPlace(one); Bitmap one2 = (Bitmap)one.Clone(); bmpclosing = ExtBitmap.CloseMorphologyFilter(one2, 15, true, true, true); Bitmap bmperosio = (Bitmap)bmpclosing.Clone(); Bitmap bmperosionson = ExtBitmap.DilateAndErodeFilter(bmperosio, 9, akıllıgecissistemleri.ExtBitmap.MorphologyType.Erosion, true, true, true); Bitmap blobson = (Bitmap)bmperosionson.Clone(); BlobsFiltering filterson = new BlobsFiltering(); // filtre ayarla filterson.CoupledSizeFiltering = true; filterson.MinWidth = 50; filterson.MinHeight = 200; // filtre uygula filterson.ApplyInPlace(blobson); Bitmap rect = (Bitmap)blobson.Clone(); Bitmap one1 = (Bitmap)rect.Clone(); ConnectedComponentsLabeling filter = new ConnectedComponentsLabeling(); // filtre uygula Bitmap newImage = filter.Apply(one1); Bitmap newImage1 = (Bitmap)newImage.Clone(); // obje sayısını kontrol et int objectCount = filter.ObjectCount; BlobCounter blobCounter = new BlobCounter(); blobCounter.ProcessImage(rect); Blob[] blobs = blobCounter.GetObjectsInformation(); // Görüntüye çizmek için Graphic nesnesi ve bir kalem oluştur Graphics g = Graphics.FromImage(rect); Pen bluePen = new Pen(Color.Blue, 2); // her nesne kpntrol edilir ve etrafında daire çizilir. for (int i = 0, n = blobs.Length; i < n; i++) { /* * x1=0 * x2=1 * y1=2 * y2=3 */ List <IntPoint> edgePoints = blobCounter.GetBlobsEdgePoints(blobs[i]); List <IntPoint> corners = PointsCloud.FindQuadrilateralCorners(edgePoints); int[] sinirlar = sinir(corners); sinirlar[0] = sinirlar[0] - 2; sinirlar[1] = sinirlar[1] + 2; sinirlar[2] = sinirlar[2] - 2; sinirlar[3] = sinirlar[3] + 2; int en = sinirlar[1] - sinirlar[0]; int boy = sinirlar[3] - sinirlar[2]; float ort = (float)en / (float)boy; List <IntPoint> ucnoktalar = new List <IntPoint>(); ucnoktalar.Add(new IntPoint(sinirlar[0], sinirlar[2])); ucnoktalar.Add(new IntPoint(sinirlar[1], sinirlar[2])); ucnoktalar.Add(new IntPoint(sinirlar[1], sinirlar[3])); ucnoktalar.Add(new IntPoint(sinirlar[0], sinirlar[3])); g.DrawPolygon(bluePen, ToPointsArray(ucnoktalar)); g.DrawString("Plaka kordinatlari : (x,y): (" + sinirlar[0].ToString() + "," + sinirlar[2].ToString() + ")\n en, boy,ort: " + (sinirlar[1] - sinirlar[0]).ToString() + ", " + (sinirlar[3] - sinirlar[2]).ToString() + "," + ort.ToString() + " blob sayisi:" + blobs.Length.ToString(), new Font("Arial", 8), Brushes.White, new System.Drawing.Point(sinirlar[0], sinirlar[3] + 4)); } bluePen.Dispose(); g.Dispose(); Bitmap rect1 = (Bitmap)pictureBox1.Image.Clone(); Graphics g1 = Graphics.FromImage(rect1); Pen bluePen2 = new Pen(Color.Red, 2); // her nesne kpntrol edilir ve etrafında daire çizilir. List <Blob> bloplar = new List <Blob>(); for (int i = 0, n = blobs.Length; i < n; i++) { /* x1,y1--------x2,y1 * x1=0 | | * x2=1 | | * y1=2 x1,y2--------x2,y2 * y2=3 */ List <IntPoint> edgePoints = blobCounter.GetBlobsEdgePoints(blobs[i]); List <IntPoint> corners = PointsCloud.FindQuadrilateralCorners(edgePoints); int[] sinirlar = sinir(corners); sinirlar[0] = sinirlar[0] - 5; sinirlar[1] = sinirlar[1]; sinirlar[2] = sinirlar[2] - 5; sinirlar[3] = sinirlar[3] + 5; int en = sinirlar[1] - sinirlar[0]; int boy = sinirlar[3] - sinirlar[2]; float ort = (float)en / (float)boy; if (ort >= 3 && ort <= 5.7) { g1.DrawLines(bluePen2, new System.Drawing.Point[] { new System.Drawing.Point(sinirlar[0], sinirlar[2]), new System.Drawing.Point(sinirlar[1], sinirlar[2]), new System.Drawing.Point(sinirlar[1], sinirlar[3]), new System.Drawing.Point(sinirlar[0], sinirlar[3]), new System.Drawing.Point(sinirlar[0], sinirlar[2]) }); g1.DrawString("Plaka kordinatlari : (x,y): (" + sinirlar[0].ToString() + "," + sinirlar[2].ToString() + ")\n en, boy,ort: " + (sinirlar[1] - sinirlar[0]).ToString() + ", " + (sinirlar[3] - sinirlar[2]).ToString() + "," + ort.ToString() + " blob sayisi:" + blobs.Length.ToString(), new Font("Arial", 8), Brushes.White, new System.Drawing.Point(sinirlar[0], sinirlar[3] + 4)); } } bluePen2.Dispose(); g1.Dispose(); Bitmap bn = null; Bitmap kes1 = (Bitmap)rect1.Clone(); Graphics g2 = Graphics.FromImage(kes1); Pen bluePen3 = new Pen(Color.Red, 2); // her nesne kpntrol edilir ve etrafında daire çizilir. for (int i = 0, n = blobs.Length; i < n; i++) { /* x1,y1--------x2,y1 * x1=0 | | * x2=1 | | * y1=2 x1,y2--------x2,y2 * y2=3 */ List <IntPoint> edgePoints = blobCounter.GetBlobsEdgePoints(blobs[i]); List <IntPoint> corners = PointsCloud.FindQuadrilateralCorners(edgePoints); int[] sinirlar = sinir(corners); sinirlar[0] = sinirlar[0] - 5; sinirlar[1] = sinirlar[1]; sinirlar[2] = sinirlar[2] - 5; sinirlar[3] = sinirlar[3] + 5; int en = sinirlar[1] - sinirlar[0]; int boy = sinirlar[3] - sinirlar[2]; float ort = en / boy; if (ort >= 3 && ort <= 5.7) { g2.DrawLines(bluePen3, new System.Drawing.Point[] { new System.Drawing.Point(sinirlar[0], sinirlar[2]), new System.Drawing.Point(sinirlar[1], sinirlar[2]), new System.Drawing.Point(sinirlar[1], sinirlar[3]), new System.Drawing.Point(sinirlar[0], sinirlar[3]), new System.Drawing.Point(sinirlar[0], sinirlar[2]) }); for (int ii = 0; ii < kes1.Width; ii++) { for (int ji = 0; ji < kes1.Height; ji++) { if ((ii >= sinirlar[0] && ii <= sinirlar[1]) && (ji >= sinirlar[2]) && ji <= sinirlar[3]) { continue; } else { kes1.SetPixel(ii, ji, Color.Black); } } } bn = new Bitmap(en, boy); Graphics g3 = Graphics.FromImage(bn); g3.DrawImage(kes1, -sinirlar[0], -sinirlar[2]); pictureBox2.Image = bn; } } bluePen3.Dispose(); g2.Dispose(); //form(bmp, "Grayscala"); //form(bmpmedian, "Median"); //form(bmpsobe, "sobel"); //form(otsu, "otsu"); //form(bmperosion, "erosion"); //form(bmpdilationn, "dilation"); //form(one, "one"); //form(bmpclosing, "closing"); //form(bmperosionson, "son"); //form(blobson, "blobson"); //form(newImage, "one1"); //form(rect, "rect"); //form(rect1, "rect1"); //form(kes1, "kes1"); //form(bn, "bn"); }
static void Main(string[] args) { Threshold thresh = new Threshold(10); Median median = new Median(9); Erosion3x3 erode = new Erosion3x3(); Dilatation3x3 dilate = new Dilatation3x3(); GrahamConvexHull hullFinder = new GrahamConvexHull(); ConnectedComponentsLabeling ccLabeler = new ConnectedComponentsLabeling(); BorderFollowing contourFinder = new BorderFollowing(); GrayscaleToRGB rgb = new GrayscaleToRGB(); ConvexHullDefects defectFinder = new ConvexHullDefects(10); Bitmap img = (Bitmap)Bitmap.FromFile("hand3.jpg"); Bitmap image = Grayscale.CommonAlgorithms.BT709.Apply(img); thresh.ApplyInPlace(image); //median.ApplyInPlace(image); erode.ApplyInPlace(image); dilate.ApplyInPlace(image); BlobCounter counter = new BlobCounter(image); counter.ObjectsOrder = ObjectsOrder.Area; Blob[] blobs = counter.GetObjectsInformation(); if (blobs.Length > 0) { counter.ExtractBlobsImage(image, blobs[0], true); UnmanagedImage hand = blobs[0].Image; var contour = contourFinder.FindContour(hand); if (contour.Count() > 0) { var initialHull = hullFinder.FindHull(contour); var defects = defectFinder.FindDefects(contour, initialHull); var filteredHull = initialHull.ClusterHullPoints().FilterLinearHullPoints(); var palmCenter = defects.Centroid(contour); var wristPoints = filteredHull.SelectWristPoints(defects, contour); Bitmap color = rgb.Apply(hand).ToManagedImage(); //BitmapData data = color.LockBits(new Rectangle(0, 0, color.Width, color.Height), ImageLockMode.ReadWrite, color.PixelFormat); //Drawing.Polyline(data, contour, Color.Blue); //Drawing.Polygon(data, filteredHull, Color.Red); //color.UnlockBits(data); Graphics gr = Graphics.FromImage(color); gr.DrawPolygon(new Pen(Brushes.Red, 3), filteredHull.ToPtArray()); gr.DrawLines(new Pen(Brushes.Blue, 3), contour.ToPtArray()); gr.DrawEllipse(new Pen(Brushes.Red, 3), palmCenter.X - 10, palmCenter.Y - 10, 20, 20); foreach (ConvexityDefect defect in defects) { gr.DrawEllipse(new Pen(Brushes.Green, 6), contour[defect.Point].X - 10, contour[defect.Point].Y - 10, 20, 20); } foreach (AForge.IntPoint pt in filteredHull) { gr.DrawEllipse(new Pen(Brushes.Yellow, 6), pt.X - 10, pt.Y - 10, 20, 20); } foreach (AForge.IntPoint pt in wristPoints) { gr.DrawEllipse(new Pen(Brushes.PowderBlue, 6), pt.X - 10, pt.Y - 10, 20, 20); } ImageBox.Show(color); } } }
public static Tuple <Bitmap, Bitmap, Bitmap, Bitmap, List <Bitmap> > blob(Bitmap img, Interval w, Interval h, Boolean couple) { Bitmap sourceImage = (Bitmap)(img); //////////////////////////////////////////////////// BlobCounter blobCounter = new BlobCounter(); blobCounter.FilterBlobs = true; blobCounter.MinHeight = (int)h.Min; blobCounter.MaxHeight = (int)h.Max; blobCounter.MinWidth = (int)w.Min; blobCounter.MaxWidth = (int)w.Max; blobCounter.CoupledSizeFiltering = couple; //blobCounter.BackgroundThreshold. blobCounter.ProcessImage(sourceImage); Blob[] blobs = blobCounter.GetObjectsInformation(); //bitmap.UnlockBits(sourceImage); //////////////////////////////////////////////////// Bitmap newBlobImg = (Bitmap)(sourceImage).Clone(); // create filter BlobsFiltering filterBlob = new BlobsFiltering(); // configure filter filterBlob.CoupledSizeFiltering = couple; filterBlob.MinHeight = (int)h.Min; filterBlob.MaxHeight = (int)h.Max; filterBlob.MinWidth = (int)w.Min; filterBlob.MaxWidth = (int)w.Max; // apply the filter newBlobImg = filterBlob.Apply(newBlobImg); //////////////////////////////////////////////////// Bitmap rectImage = (Bitmap)(newBlobImg).Clone(); GrayscaleToRGB convertToColor = new GrayscaleToRGB(); if (rectImage.PixelFormat == System.Drawing.Imaging.PixelFormat.Format8bppIndexed) { rectImage = convertToColor.Apply(newBlobImg); } Graphics g = Graphics.FromImage(rectImage); Pen myPen = new Pen(Color.Red, 1); List <Bitmap> blobIMGs = new List <Bitmap>(); for (int i = 0; i < blobs.Length; i++) { blobIMGs.Add((Bitmap)(newBlobImg).Clone(blobs[i].Rectangle, PixelFormat.Format32bppArgb)); g.DrawRectangle(myPen, blobs[i].Rectangle); } //////////////////////////////////////////////////// Bitmap colorImage = (Bitmap)(newBlobImg).Clone(); ConnectedComponentsLabeling filter = new ConnectedComponentsLabeling(); // apply the filter colorImage = filter.Apply(colorImage); ////////////////////////////////////////////////// SimpleShapeChecker shapeChecker = new SimpleShapeChecker(); Bitmap shapeImage = (Bitmap)(newBlobImg).Clone(); Graphics gg = Graphics.FromImage(shapeImage); Pen yellowPen = new Pen(Color.Yellow, 2); // circles Pen redPen = new Pen(Color.Red, 2); // quadrilateral Pen brownPen = new Pen(Color.Brown, 2); // quadrilateral with known sub-type Pen greenPen = new Pen(Color.Green, 2); // known triangle Pen bluePen = new Pen(Color.Blue, 2); // triangle for (int i = 0, n = blobs.Length; i < n; i++) { List <IntPoint> edgePoints = blobCounter.GetBlobsEdgePoints(blobs[i]); AForge.Point center; float radius; // is circle ? if (shapeChecker.IsCircle(edgePoints, out center, out radius)) { gg.DrawEllipse(yellowPen, (float)(center.X - radius), (float)(center.Y - radius), (float)(radius * 2), (float)(radius * 2)); } else { List <IntPoint> corners; // is triangle or quadrilateral if (shapeChecker.IsConvexPolygon(edgePoints, out corners)) { // get sub-type PolygonSubType subType = shapeChecker.CheckPolygonSubType(corners); Pen pen; if (subType == PolygonSubType.Unknown) { pen = (corners.Count == 4) ? redPen : bluePen; } else { pen = (corners.Count == 4) ? brownPen : greenPen; } gg.DrawPolygon(pen, ToPointsArray(corners)); } } } return(new Tuple <Bitmap, Bitmap, Bitmap, Bitmap, List <Bitmap> >(newBlobImg, colorImage, rectImage, shapeImage, blobIMGs)); }