public override void Run() { EtichettaturaComponentiConnesse e1 = new EtichettaturaComponentiConnesse(InputImage, fg, metrica); e1.Execute(); InformazioniComponentiConnesse i1 = new InformazioniComponentiConnesse(); i1.InputImage = InputImage; i1.fg = fg; i1.metrica = metrica; i1.Run(); int[] aree = i1.getAree(); Result = new Image <byte>(InputImage.Width, InputImage.Height, 0); //controllo quali aree sono maggiori ImageCursor cursor = new ImageCursor(InputImage); do { //controllo le etichette, se il pixel fa parte di una componente connessa //con area > areaMinima allora lo mette bianco, altrimenti lo lascia nero if (e1.Result[cursor] != -1) { if (aree[e1.Result[cursor]] > AreaMinima) { Result[cursor] = fg; } } }while(cursor.MoveNext()); }
public override void Run() { EtichettaturaComponentiConnesse e1 = new EtichettaturaComponentiConnesse(InputImage, fg, metrica); e1.Execute(); //numero totale compponenti connesse numComponentiConnesse = e1.Result.ComponentCount; //trovo l'area delle componenti connesse aree = new int[numComponentiConnesse]; //vettore di aree delle componenti connesse //inizializzo elementi a 0 for (int i = 0; i < numComponentiConnesse; i++) { aree[i] = 0; } //calcolo le aree di tutte le componenti connesse ImageCursor cursor = new ImageCursor(e1.Result); do { if (e1.Result[cursor] != -1) { //incremento l'area di quella componente connessa che è l'indice del //vettore, quindi è molto semplice aree[e1.Result[cursor]]++; } }while(cursor.MoveNext()); //trovo area minima, area massima e area media areaMin = int.MaxValue; areaMax = 0; areaMedia = 0; for (int i = 0; i < numComponentiConnesse; i++) { if (aree[i] < areaMin) //minimo { areaMin = aree[i]; } if (aree[i] > areaMax) //massimo { areaMax = aree[i]; } } //calcolo area media areaMedia = Media(aree); //trovo lunghezza media dei perimetri int[] perimetri = new int[numComponentiConnesse]; for (int i = 0; i < numComponentiConnesse; i++) { perimetri[i] = 0; } //stesso cursore di prima, escludo il pixel di bordo per gli indici cursor = new ImageCursor(e1.Result, 1); do { if (e1.Result[cursor] != -1) { //controllo se è un pixel di contorno, cioè se ha almeno un pixel di background //come vicino. In base alla metrice scelta controllo le direzioni if (e1.Result[cursor.East] == -1 || e1.Result[cursor.West] == -1 || e1.Result[cursor.South] == -1 || e1.Result[cursor.North] == -1) { perimetri[e1.Result[cursor]]++; continue; } //se la metrica è chessboard controllo anche le direzioni diagonali, //per non aumentare 2 volte il perimetro con lo stesso pixel entra qui //se non è entrato nel primo if if (metrica == MetricType.Chessboard) { if (e1.Result[cursor.Northeast] == -1 || e1.Result[cursor.Northwest] == -1 || e1.Result[cursor.Southeast] == -1 || e1.Result[cursor.Southwest] == -1) { perimetri[e1.Result[cursor]]++; } } } }while(cursor.MoveNext()); //calcolo media dei perimetri perimetroMedio = Media(perimetri); }