Пример #1
0
        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());
        }
Пример #2
0
        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);
        }