Ejemplo n.º 1
0
        private byte LocalAverage(PgmImg img, int x, int y, AverageOptions Opt)
        {
            int size    = img.ReduceTo,
                x_aux   = x - size / 2,
                y_aux   = y - size / 2,
                media   = 0,
                size2   = (int)Math.Pow(size, 2),
                divisor = 0;


            var siblings = new int[size2];

            var mat = img.Matrix;

            for (int i = x_aux; i < x_aux + size; i++)
            {
                for (int j = y_aux; j < y_aux + size; j++)
                {
                    if (j < img.Height && j >= 0 && i >= 0 && i < img.Width)
                    {
                        media            += mat[i, j];
                        siblings[divisor] = mat[i, j];
                        divisor++;
                    }
                }
            }

            //decisoes de saida
            byte ret = 0;

            if (Opt == AverageOptions.Normal)
            {
                ret = (byte)Math.Round((double)media / divisor);
            }
            else if (Opt == AverageOptions.Median)
            {
                int meio = (int)(((double)divisor / 2));
                siblings = counting_sort(siblings);

                if (divisor % 2 == 0)
                {
                    ret = (byte)((siblings[meio] + siblings[meio - 1]) / 2);
                }
                else
                {
                    ret = (byte)siblings[meio];
                }
            }


            return(ret);
        }
Ejemplo n.º 2
0
        private PgmImg SiblingScan(AverageOptions opt, PgmImg pgm)
        {
            var ret = new PgmImg(pgm.Width, pgm.Height);

            ret.ReduceTo = pgm.ReduceTo;

            Parallel.For(0, pgm.Width, i => {
                Parallel.For(0, pgm.Height, j => {
                    ret[i, j] = LocalAverage(pgm, i, j, opt);
                });
            });

            return(ret);
        }
Ejemplo n.º 3
0
        private PgmImg SiblingScan(AverageOptions opt, PgmImg pgm)
        {
            var ret = new PgmImg(pgm.Width, pgm.Height);
            ret.ReduceTo = pgm.ReduceTo;

            Parallel.For(0, pgm.Width, i => {
                Parallel.For (0, pgm.Height, j => {
                    ret[i, j] = LocalAverage(pgm, i, j, opt);
                });
            });

            return ret;
        }
Ejemplo n.º 4
0
        private byte LocalAverage(PgmImg img, int x, int y, AverageOptions Opt)
        {
            int size = img.ReduceTo,
                x_aux = x - size / 2,
                y_aux = y - size / 2,
                media = 0,
                size2 = (int)Math.Pow(size, 2),
                divisor = 0;

            var siblings = new int[size2];

            var mat = img.Matrix;
            for (int i = x_aux; i < x_aux + size; i++)
                for (int j = y_aux; j < y_aux + size; j++)
                    if (j < img.Height && j >= 0 && i >= 0 && i < img.Width)
                    {
                        media += mat[i, j];
                        siblings[divisor] = mat[i, j];
                        divisor++;
                    }

            //decisoes de saida
            byte ret = 0;
            if (Opt == AverageOptions.Normal)
                ret = (byte)Math.Round((double)media / divisor);
            else if (Opt == AverageOptions.Median)
            {
                int meio = (int)(((double)divisor / 2));
                siblings = counting_sort(siblings);

                if (divisor%2 == 0)
                    ret = (byte)((siblings[meio]+siblings[meio-1])/2);
                else
                    ret = (byte)siblings[meio];
            }

            return ret;
        }