private void button3_Click(object sender, EventArgs e) { //událost tlačítka //najdi shluky A - picture 9, listbox3 --- podminka na min. velikost shluků ShlukyA.Clear(); listBox3.Items.Clear(); listBox5.Items.Clear(); tempA = new Bitmap(pictureFiltrA); najdiShlukyA(Convert.ToInt32(textBox5.Text)); //vstupni parametr je velikost if (checkBox1.Checked == true) //vykresleni bounding boxu { pictureOznaceneShlukyA = new Bitmap(pictureLoadA); Graphics g = Graphics.FromImage(pictureOznaceneShlukyA); Pen rPen = new Pen(Color.Red, 3); //listBox1.Items.Add("test: "+ Shluky.Count().ToString()); for (int i = 0; i < ShlukyA.Count(); i++) { int sirka = ShlukyA[i].maxX.X - ShlukyA[i].minX.X; int vyska = ShlukyA[i].maxY.Y - ShlukyA[i].minY.Y; //g.DrawRectangle(rPen, Shluky[i].minX.X, Shluky[i].minY.Y, Shluky[i].maxX.X - Shluky[i].minX.X, -Shluky[i].maxY.Y-Shluky[i].minY.Y); g.DrawRectangle(rPen, ShlukyA[i].minX.X, ShlukyA[i].minY.Y, sirka, vyska); } rPen.Dispose(); g.Dispose(); //pictureBox5.Image = bitmapa; pictureBox9.Image = pictureOznaceneShlukyA; } label13.Text = "Celkem: " +ShlukyA.Count().ToString(); if (ShlukyA.Count() > 0) { int min = ShlukyA[0].plocha; int max = ShlukyA[0].plocha; int celkem = ShlukyA[0].plocha; for (int i = 1; i < ShlukyA.Count(); i++) { if (min > ShlukyA[i].plocha) { min = ShlukyA[i].plocha; } if (max < ShlukyA[i].plocha) { max = ShlukyA[i].plocha; } celkem += ShlukyA[i].plocha; } listBox5.Items.Add("Celkem: " + ShlukyA.Count().ToString()); listBox5.Items.Add("Min. velikost: " + min.ToString()); listBox5.Items.Add("Max. velikost: " + max.ToString()); listBox5.Items.Add("Prům. velikost: " + (celkem / ShlukyA.Count()).ToString()); } } private void najdiShlukyA(int min) { //int pocet = 0; //Point tempPoint; for (int y = 0; y < tempA.Height; y++) { for (int x = 0; x < tempA.Width; x++) { if (tempA.GetPixel(x, y).A > 128) { pixelyVZasobniku.Push(new Point(x, y)); while (pixelyVZasobniku.Count > 0) { Point aktualni = pixelyVZasobniku.Pop(); // Puvodni obsah metody seminko if (aktualni.X >= 0 && aktualni.X < tempA.Width && aktualni.Y >= 0 && aktualni.Y < tempA.Height) { if (tempA.GetPixel(aktualni.X, aktualni.Y).A > 128) { pixelyJednohoShluku.Add(aktualni); tempA.SetPixel(aktualni.X, aktualni.Y, Color.FromArgb(0, Color.Black)); pixelyVZasobniku.Push(new Point(aktualni.X - 1, aktualni.Y)); pixelyVZasobniku.Push(new Point(aktualni.X + 1, aktualni.Y)); pixelyVZasobniku.Push(new Point(aktualni.X, aktualni.Y - 1)); pixelyVZasobniku.Push(new Point(aktualni.X, aktualni.Y + 1)); } } } if (pixelyJednohoShluku.Count() >= min) { ShlukyA.Add(new Shluk(ShlukyA.Count())); ShlukyA[ShlukyA.Count() - 1].AddPixs(pixelyJednohoShluku); //foreach (Point p in pixelyJednohoShluku) //{ // ShlukyA[ShlukyA.Count() - 1].AddPix(p); //} int minRozmer = Convert.ToInt32(textBox9.Text); if (ShlukyA[ShlukyA.Count() - 1].maxX.X - ShlukyA[ShlukyA.Count() - 1].minX.X <= minRozmer || ShlukyA[ShlukyA.Count() - 1].maxY.Y - ShlukyA[ShlukyA.Count() - 1].minY.Y <= minRozmer) { ShlukyA.Remove(ShlukyA[ShlukyA.Count() - 1]); } listBox3.Items.Add("Pocet pix : " + pixelyJednohoShluku.Count().ToString()); } pixelyJednohoShluku.Clear(); // nekde dochazi ke smazani pixelů v ShlukuA[i].pixely ?? } } } pixelyVZasobniku.Clear(); } //trida shluku public class Shluk { public int id; public Point minY; public Point maxY; public Point minX; public Point maxX; public Point stred; public int sirka; public int vyska; public int plocha; public List pixely = new List(); public Shluk() { } public Shluk(int id) { this.id = id; } public void AddPix(int x, int y) { this.pixely.Add(new Point(x, y)); } public void AddPix(Point p) { this.pixely.Add(p); } public void AddPixs(List _pixely) { this.pixely = _pixely; GetMinMax(); SpocitatPlochu(); SpocitatRozmery(); SpocitatStred(); } public void SpocitatPlochu() { plocha = pixely.Count(); } public void SpocitatRozmery() { this.sirka = Math.Abs(maxX.X - minX.X); this.vyska = Math.Abs(maxY.Y - minY.Y); } public void SpocitatStred() { int y = ((minY.Y - maxY.Y) / 2) + maxY.Y; int x = ((maxX.X - minX.X) / 2) + minX.X; this.stred = new Point(x, y); } public void GetMinMax() { if (pixely.Count() > 0) { minX = pixely[0]; maxX = pixely[0]; minY = pixely[0]; maxY = pixely[0]; for (int i = 1; i < pixely.Count(); i++) { if (pixely[i].X < minX.X) { minX = pixely[i]; } if (pixely[i].X > maxX.X) { maxX = pixely[i]; } if (pixely[i].Y < minY.Y) { minY = pixely[i]; } if (pixely[i].Y > maxY.Y) { maxY = pixely[i]; } } } } }