Exemple #1
0
        public PgmImg Equalize(PgmImg pgm)
        {
            var Acumulativo = pgm.CumulativePallete();
            var min         = Acumulativo.Min();
            var max         = Acumulativo[255];
            var ret         = pgm.Clone();



            for (int i = 0; i < pgm.Width; i++)
            {
                for (int j = 0; j < pgm.Height; j++)
                {
                    ret[i, j] = (byte)(
                        (
                            (double)
                            (Acumulativo[pgm[i, j]] - min) /
                            (max - min)
                        )
                        * 255);
                }
            }

            return(ret);
        }
Exemple #2
0
        private double[,] LaplacianaMatrix(PgmImg pgm, Func <double, double> Map = null)
        {
            // Laplaciana
            Func <double, double, double, double, double>
            g = (x, y, r, t) => (-1 / (Math.PI * Math.Pow(t, 4))) * (1 - ((x * x + y * y) / (2 * t * t))) * Math.Exp(-((x * x + y * y) / (2 * t * t)));

            /* Func<double, double, double, double, double>
             *  g = (x, y, r, t) =>
             *  {
             *      var ret = 0.00;
             *
             *      if (x == 0 && y == 0)
             *          ret = 4;
             *
             *      if (x == 1 && y == 0)
             *          ret = -1;
             *
             *      if (x == 0 && y == 1)
             *          ret = -1;
             *
             *      if (x == 1 && y == 1)
             *          ret = 0;
             *
             *      return ret;
             *  };*/

            return(windowFor(pgm, g, Map));
        }
Exemple #3
0
        private double[,] windowFor(PgmImg pgm, Func <double, double, double, double, double> F, Func <double, double> MapF = null)
        {
            var ret = new double[pgm.Width, pgm.Height];

            /*
             * Parallel.For(0, pgm.Width, i =>
             * {
             *  Parallel.For(0, pgm.Height, j =>
             *  {
             *      var newValue = windowProcess(pgm, i, j, F);
             *
             *      if (MapF != null)
             *          newValue = MapF(newValue);
             *
             *      ret[i, j] = newValue;
             *  });
             * });
             */

            for (int i = 0; i < pgm.Width; i++)
            {
                for (int j = 0; j < pgm.Height; j++)
                {
                    var newValue = windowConvolution(pgm, i, j, F);

                    if (MapF != null)
                    {
                        newValue = MapF(newValue);
                    }

                    ret[i, j] = newValue;
                }
            }
            return(ret);
        }
Exemple #4
0
        public PgmImg Laplaciana(PgmImg pgm)
        {
            var lapla = LaplacianaMatrix(pgm, e => e / 8 + (255f / 2));

            //Export(lapla);
            return(Map(lapla));
        }
Exemple #5
0
        public PgmImg Expansion(PgmImg img)
        {
            var ret = img.Clone();
            var EstruturanteNormal = CriaMatrizEstruturante(img);

            // espelha estrutura
            var Estruturante = (double[, ])EstruturanteNormal.Clone();
            var n            = img.ReduceTo;

            for (int i = 0; i < n; i++)
            {
                for (int j = 0; j < n; j++)
                {
                    Estruturante[i, j] = EstruturanteNormal[n - i - 1, n - j - 1];
                }
            }

            for (int i = 0; i < img.Width; i++)
            {
                for (int j = 0; j < img.Height; j++)
                {
                    windowMorpho(1, img, ret, Estruturante, i, j);
                }
            }

            return(ret);
        }
Exemple #6
0
        public PgmImg ReduceColors(PgmImg pgm)
        {
            var temp = pgm.Clone();


            for (int i = 0; i < pgm.Width; i++)
            {
                for (int j = 0; j < pgm.Height; j++)
                {
                    temp[i, j] = Reduce(pgm[i, j], pgm.ReduceTo);
                }
            }


            /*
             * // outra forma - mais lenta
             * var newColorArray = new int[pgm.ReduceTo];
             * for (int i = 0; i < pgm.ReduceTo ; i++)
             * newColorArray[i] = i * (255 / (pgm.ReduceTo-1));
             *
             * for (int i = 0; i < matrix.GetLength(0); i++)
             * for (int j = 0; j < matrix.GetLength(1); j++)
             *     temp[i, j] = (byte)Closest((int)matrix[i, j], newColorArray);
             */


            return(temp);
        }
Exemple #7
0
        public PgmImg Gaussian(PgmImg pgm)
        {
            // Gaussiana
            Func <double, double, double, double, double>
            g = (x, y, r, t) => (1F / (2F * Math.PI * t * t)) * Math.Pow(Math.E, ((-1F * (x * x + y * y)) / (2F * t * t)));

            var betaMatrix = windowFor(pgm, g);

            return(Map(betaMatrix));
        }
        private void btnRedo_Click(object sender, RoutedEventArgs e)
        {
            if (Redo.Count == 0)
            {
                return;
            }

            Undo.Push(bitmap.Clone());
            bitmap = Redo.Pop();
            show();
        }
Exemple #9
0
        public PgmImg Erosion(PgmImg img)
        {
            var ret = img.Clone();
            var Estruturante = CriaMatrizEstruturante(img);

            for (int i = 0; i < img.Width; i++)
                for (int j = 0; j < img.Height; j++)
                    windowMorpho(0, img, ret, Estruturante, i, j);

            return ret;
        }
Exemple #10
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);
        }
Exemple #11
0
        private void windowMorpho(int type, PgmImg img, PgmImg ret, double[,] estruturante, int x, int y)
        {
            int size  = img.ReduceTo,
                x_aux = x - size / 2,
                y_aux = y - size / 2,
                E     = type == 0 ? 255 : 0;


            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)
                    {
                        var val = estruturante[i + (size / 2) - x, j + (size / 2) - y];
                        if (!Double.IsNegativeInfinity(val))
                        {
                            if (type == 0) // erosion
                            {
                                if (E > img[i, j] - val)
                                {
                                    E = (int)(img[i, j] - val);
                                }
                            }

                            if (type == 1) // dilatação
                            {
                                if (E < img[i, j] + val)
                                {
                                    E = (int)(img[i, j] + val);
                                }
                            }
                        }
                    }
                }
            }

            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)
                    {
                        var val = (estruturante[i + (size / 2) - x, j + (size / 2) - y] + E);
                        if (!double.IsNegativeInfinity(val))
                        {
                            ret[i, j] = (byte)Normalize(val);
                        }
                    }
                }
            }
        }
Exemple #12
0
        public static PgmImg ReadPgmImg(string filePath)
        {
            using (FileStream fs = new FileStream(filePath, FileMode.Open))
            {
                using (BinaryReader reader = new BinaryReader(fs, Encoding.ASCII))
                {
                    if (reader.ReadChar() == 'P' && reader.ReadChar() == '5')
                    {
                        reader.ReadChar();
                        int  width  = 0;
                        int  height = 0;
                        int  level  = 0;
                        bool two    = false;


                        width  = ReadNumber(reader);
                        height = ReadNumber(reader);
                        level  = ReadNumber(reader);
                        two    = (level > 255);

                        var mat = new PgmImg(width, height);


                        for (int i = 0; i < height; i++)
                        {
                            for (int j = 0; j < width; j++)
                            {
                                byte v;
                                if (two)
                                {
                                    v = (byte)(((double)((reader.ReadByte() << 8) + reader.ReadByte()) / level) * 255.0);
                                }
                                else
                                {
                                    v = reader.ReadByte();
                                }


                                mat[j, i] = v;
                            }
                        }

                        return(mat);
                    }
                    else
                    {
                        throw new InvalidOperationException("Is not a PGM file");
                    }
                }
            }
        }
Exemple #13
0
        public static PgmImg ReadPgmImg(string filePath)
        {
            using (FileStream fs = new FileStream(filePath, FileMode.Open))
            {
                using (BinaryReader reader = new BinaryReader(fs, Encoding.ASCII))
                {
                    if (reader.ReadChar() == 'P' && reader.ReadChar() == '5')
                    {
                        reader.ReadChar();
                        int width = 0;
                        int height = 0;
                        int level = 0;
                        bool two = false;

                        width = ReadNumber(reader);
                        height = ReadNumber(reader);
                        level = ReadNumber(reader);
                        two = (level > 255);

                        var mat = new PgmImg(width, height);

                        for (int i = 0; i < height; i++)
                        {
                            for (int j = 0; j < width; j++)
                            {
                                byte v;
                                if (two)
                                {
                                    v = (byte)(((double)((reader.ReadByte() << 8) + reader.ReadByte()) / level) * 255.0);
                                }
                                else
                                {
                                    v = reader.ReadByte();
                                }

                                mat[j, i] = v;

                            }
                        }

                        return mat;
                    }
                    else
                    {
                        throw new InvalidOperationException("Is not a PGM file");
                    }

                }
            }
        }
Exemple #14
0
        private PgmImg Map(double[,] mat)
        {
            var pgm = new PgmImg((int)mat.GetLongLength(0), (int)mat.GetLongLength(1));

            Parallel.For(0, pgm.Width, i =>
            {
                Parallel.For(0, pgm.Height, j =>
                {
                    pgm[i, j] = Normalize(Math.Round(mat[i, j]));
                });
            });

            return(pgm);
        }
Exemple #15
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);
        }
Exemple #16
0
        public PgmImg MirrorY(PgmImg pgm)
        {
            var temp = pgm.Clone();

            for (int i = 0; i < pgm.Width; i++)
            {
                for (int j = 0; j < pgm.Height; j++)
                {
                    temp[i, j] = pgm[i, pgm.Height - 1 - j];
                }
            }

            return(temp);
        }
Exemple #17
0
        public PgmImg Highlight(PgmImg pgm)
        {
            var lapla = LaplacianaMatrix(pgm);

            var matCalc = new double[pgm.Width, pgm.Height];

            Parallel.For(0, pgm.Width, i => {
                Parallel.For(0, pgm.Height, j => {
                    matCalc[i, j] = ((double)pgm[i, j]) - lapla[i, j];
                });
            });


            return(Map(matCalc));
        }
Exemple #18
0
        public PgmImg Transpose(PgmImg pgm)
        {
            var temp = new PgmImg(pgm.Height, pgm.Width);

            for (int i = 0; i < pgm.Width; i++)
            {
                for (int j = 0; j < pgm.Height; j++)
                {
                    temp[j, i] = pgm[i, j];
                }
            }


            return(temp);
        }
        public Histograma(PgmImg img)
        {
            InitializeComponent();

            chart1.Legends[0].Alignment         = System.Drawing.StringAlignment.Near;
            chart1.Series["Series1"].ChartType  = SeriesChartType.Column;
            chart1.Series["Series1"].Color      = System.Drawing.Color.Goldenrod;
            chart1.Series["Series1"].YValueType = ChartValueType.Int32;
            chart1.Series["Series1"].Color      = Color.Blue;
            chart1.Titles.Add("Qtd. Colors");
            var chartArea3DStyle = new ChartArea3DStyle();

            chartArea3DStyle.Enable3D        = true;
            chartArea3DStyle.LightStyle      = LightStyle.Realistic;
            chartArea3DStyle.Rotation        = 5;
            chartArea3DStyle.Inclination     = 40;
            chartArea3DStyle.PointDepth      = 50;
            chart1.ChartAreas[0].Area3DStyle = chartArea3DStyle;
            chart1.Series[0].Points.Clear();
            for (int i = 0; i < 256; i++)
            {
                chart1.Series[0].Points.Add(img.Pallete[i]);
            }

            chart2.Legends[0].Alignment         = System.Drawing.StringAlignment.Near;
            chart2.Series["Series1"].ChartType  = SeriesChartType.Column;
            chart2.Series["Series1"].Color      = System.Drawing.Color.Goldenrod;
            chart2.Series["Series1"].YValueType = ChartValueType.Int32;
            chart2.Series["Series1"].Color      = Color.Red;
            chart2.Titles.Add("Qtd. Colors");
            var chartArea3DStyle2 = new ChartArea3DStyle();

            chartArea3DStyle2.Enable3D       = true;
            chartArea3DStyle2.LightStyle     = LightStyle.Realistic;
            chartArea3DStyle2.Rotation       = 5;
            chartArea3DStyle2.Inclination    = 40;
            chartArea3DStyle2.PointDepth     = 50;
            chart2.ChartAreas[0].Area3DStyle = chartArea3DStyle2;
            chart2.Series[0].Points.Clear();
            var cumulate = img.CumulativePallete();

            for (int i = 0; i < 256; i++)
            {
                chart2.Series[0].Points.Add(cumulate[i]);
            }
        }
Exemple #20
0
        public PgmImg Erosion(PgmImg img)
        {
            var ret          = img.Clone();
            var Estruturante = CriaMatrizEstruturante(img);

            for (int i = 0; i < img.Width; i++)
            {
                for (int j = 0; j < img.Height; j++)
                {
                    windowMorpho(0, img, ret, Estruturante, i, j);
                }
            }



            return(ret);
        }
Exemple #21
0
        public PgmImg Expansion(PgmImg img)
        {
            var ret = img.Clone();
            var EstruturanteNormal = CriaMatrizEstruturante(img);

            // espelha estrutura
            var Estruturante = (double[,])EstruturanteNormal.Clone();
            var n = img.ReduceTo;
            for (int i = 0; i < n; i++)
                for (int j = 0; j < n; j++)
                    Estruturante[i, j] = EstruturanteNormal[n-i-1,n-j-1];

            for (int i = 0; i < img.Width; i++)
                for (int j = 0; j < img.Height; j++)
                    windowMorpho(1, img, ret, Estruturante, i, j);

            return ret;
        }
        private void btnLoad_Click(object sender, RoutedEventArgs e)
        {
            OpenFileDialog op = new OpenFileDialog();

            op.Title  = "Selecione uma foto";
            op.Filter = "All supported graphics|*.pgm";

            Redo       = new Stack <PgmImg>();
            Undo       = new Stack <PgmImg>();
            lastEffect = null;

            if (op.ShowDialog() == true)
            {
                bitmap = PGMUtil.ReadPgmImg(op.FileName);
                show();

                this.Title = "PGM Editor - " + op.FileName.Split('\\').Last() + " (" + bitmap.Width + "x" + bitmap.Height + ")";
            }
        }
Exemple #23
0
        public PgmImg Equalize(PgmImg pgm)
        {
            var Acumulativo = pgm.CumulativePallete();
            var min = Acumulativo.Min();
            var max = Acumulativo[255];
            var ret = pgm.Clone();

            for (int i = 0; i < pgm.Width; i++)
                for (int j = 0; j < pgm.Height; j++)
                    ret[i, j] = (byte) (
                                            (
                                                (double)
                                                (Acumulativo[pgm[i, j]] - min) /
                                                (max - min)
                                            )
                                        *255);

            return ret;
        }
Exemple #24
0
        private double[,] CriaMatrizEstruturante(PgmImg img)
        {
            var dim = img.ReduceTo;
            var ret = new Double[dim, dim];


            using (FileStream fs = new FileStream("elements\\" + dim.ToString() + ".txt", FileMode.Open))
            {
                using (BinaryReader reader = new BinaryReader(fs, Encoding.ASCII))
                {
                    for (int i = 0; i < dim; i++)
                    {
                        for (int j = 0; j < dim; j++)
                        {
                            var c = reader.ReadChar();
                            if (c == '\n' || c == '\r')
                            {
                                j--;
                                continue;
                            }

                            double val = 0;

                            if (c == 'X' || c == 'x')
                            {
                                val = Double.NegativeInfinity;
                            }
                            else
                            {
                                val = Double.Parse(c.ToString());
                            }

                            ret[i, j] = val;
                        }
                    }
                }
            }


            return(ret);
        }
Exemple #25
0
        public static void Save(PgmImg imagem, string path)
        {
            using (var fs = new FileStream(path, FileMode.Create))
            {
                using (var bw = new BinaryWriter(fs, Encoding.ASCII))
                {
                    // header
                    bw.Write("P5\n".ToCharArray());

                    // width height grayscale
                    bw.Write(String.Format("{0} {1}\n255\n", imagem.Width, imagem.Height).ToCharArray());

                    for (int i = 0; i < imagem.Height; i++)
                    {
                        for (int j = 0; j < imagem.Width; j++)
                        {
                            bw.Write(imagem.Matrix[j, i]);
                        }
                    }
                }
            }
        }
        public Histograma(PgmImg img)
        {
            InitializeComponent();

            chart1.Legends[0].Alignment = System.Drawing.StringAlignment.Near;
            chart1.Series["Series1"].ChartType = SeriesChartType.Column;
            chart1.Series["Series1"].Color = System.Drawing.Color.Goldenrod;
            chart1.Series["Series1"].YValueType = ChartValueType.Int32;
            chart1.Series["Series1"].Color = Color.Blue;
            chart1.Titles.Add("Qtd. Colors");
            var chartArea3DStyle = new ChartArea3DStyle();
            chartArea3DStyle.Enable3D = true;
            chartArea3DStyle.LightStyle = LightStyle.Realistic;
            chartArea3DStyle.Rotation = 5;
            chartArea3DStyle.Inclination = 40;
            chartArea3DStyle.PointDepth = 50;
            chart1.ChartAreas[0].Area3DStyle = chartArea3DStyle;
            chart1.Series[0].Points.Clear();
            for (int i = 0; i < 256; i++)
                chart1.Series[0].Points.Add(img.Pallete[i]);

            chart2.Legends[0].Alignment = System.Drawing.StringAlignment.Near;
            chart2.Series["Series1"].ChartType = SeriesChartType.Column;
            chart2.Series["Series1"].Color = System.Drawing.Color.Goldenrod;
            chart2.Series["Series1"].YValueType = ChartValueType.Int32;
            chart2.Series["Series1"].Color = Color.Red;
            chart2.Titles.Add("Qtd. Colors");
            var chartArea3DStyle2 = new ChartArea3DStyle();
            chartArea3DStyle2.Enable3D = true;
            chartArea3DStyle2.LightStyle = LightStyle.Realistic;
            chartArea3DStyle2.Rotation = 5;
            chartArea3DStyle2.Inclination = 40;
            chartArea3DStyle2.PointDepth = 50;
            chart2.ChartAreas[0].Area3DStyle = chartArea3DStyle2;
            chart2.Series[0].Points.Clear();
            var cumulate = img.CumulativePallete();
            for (int i = 0; i < 256; i++)
                chart2.Series[0].Points.Add(cumulate[i]);
        }
Exemple #27
0
        public PgmImg FloydSteinberg(PgmImg pgm)
        {
            var temp = pgm.Clone();

            var width  = temp.Width - 1;
            var height = temp.Height - 1;

            for (int i = 0; i < temp.Width; i++)
            {
                for (int j = 0; j < temp.Height; j++)
                {
                    var original = temp[i, j];
                    temp[i, j] = Reduce(temp[i, j], pgm.ReduceTo);
                    var error = (double)original - (double)temp[i, j];

                    if (j < height)
                    {
                        temp[i, j + 1] = Normalize(temp[i + 0, j + 1] + error * MagicNumbers.Right);
                    }

                    if (i < width)
                    {
                        temp[i + 1, j] = Normalize(temp[i + 1, j + 0] + error * MagicNumbers.Down);
                    }

                    if (j < height && i < width)
                    {
                        temp[i + 1, j + 1] = Normalize(temp[i + 1, j + 1] + error * MagicNumbers.DownRight);
                    }

                    if (j > 0 && i < width)
                    {
                        temp[i + 1, j - 1] = Normalize(temp[i + 1, j - 1] + error * MagicNumbers.DownLeft);
                    }
                }
            }

            return(temp);
        }
Exemple #28
0
        public static void Save(PgmImg imagem, string path)
        {
            using (var fs = new FileStream(path, FileMode.Create))
            {
                using (var bw = new BinaryWriter(fs, Encoding.ASCII))
                {
                    // header
                    bw.Write( "P5\n".ToCharArray() );

                    // width height grayscale
                    bw.Write(String.Format("{0} {1}\n255\n", imagem.Width, imagem.Height).ToCharArray());

                    for (int i = 0; i < imagem.Height; i++)
                    {
                        for (int j = 0; j < imagem.Width; j++)
                        {
                             bw.Write( imagem.Matrix[j,i] );
                        }
                    }

                }
            }
        }
Exemple #29
0
        private double windowConvolution(PgmImg img, int x, int y, Func <double, double, double, double, double> F)
        {
            int size  = img.ReduceTo,
                x_aux = x - size / 2,
                y_aux = y - size / 2;

            double ret = 0;


            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)
                    {
                        ret += ((double)img[i, j]) * F(Math.Abs(x - i), Math.Abs(y - j), size, img.Sigma == 0 ? (size / 6F) : img.Sigma);
                    }
                }
            }


            return(ret);
        }
Exemple #30
0
        public static Bitmap ToBitmap(PgmImg pgmImage)
        {
            var          width  = pgmImage.Width;
            var          height = pgmImage.Height;
            ColorPalette grayScale;

            Bitmap bmp = new Bitmap(width, height, PixelFormat.Format8bppIndexed);

            grayScale = bmp.Palette;
            for (int i = 0; i < 256; i++)
            {
                grayScale.Entries[i] = Color.FromArgb(i, i, i);
            }


            bmp.Palette = grayScale;
            BitmapData dt     = bmp.LockBits(new Rectangle(0, 0, width, height), ImageLockMode.WriteOnly, PixelFormat.Format8bppIndexed);
            int        offset = dt.Stride - dt.Width;

            unsafe
            {
                byte *ptr = (byte *)dt.Scan0;

                for (int i = 0; i < height; i++)
                {
                    for (int j = 0; j < width; j++)
                    {
                        *ptr = pgmImage[j, i];
                        ptr++;
                    }
                    ptr += offset;
                }
            }

            bmp.UnlockBits(dt);
            return(bmp);
        }
        private void btnLoad_Click(object sender, RoutedEventArgs e)
        {
            OpenFileDialog op = new OpenFileDialog();
            op.Title = "Selecione uma foto";
            op.Filter = "All supported graphics|*.pgm";

            Redo = new Stack<PgmImg>();
            Undo = new Stack<PgmImg>();
            lastEffect = null;

            if (op.ShowDialog() == true)
            {

                bitmap = PGMUtil.ReadPgmImg(op.FileName);
                show();

                this.Title = "PGM Editor - " + op.FileName.Split('\\').Last() + " (" + bitmap.Width+"x"+bitmap.Height+")";

            }
        }
Exemple #32
0
        public PgmImg MirrorY(PgmImg pgm)
        {
            var temp = pgm.Clone();

            for (int i = 0; i < pgm.Width; i++)
                for (int j = 0; j < pgm.Height; j++)
                    temp[i, j] = pgm[i, pgm.Height - 1 - j];

            return temp;
        }
Exemple #33
0
 public PgmImg Median(PgmImg pgm)
 {
     return SiblingScan(AverageOptions.Median, pgm);
 }
Exemple #34
0
        private void windowMorpho(int type, PgmImg img,  PgmImg ret, double[,] estruturante, int x, int y)
        {
            int size = img.ReduceTo,
               x_aux = x - size / 2,
               y_aux = y - size / 2,
               E = type == 0 ? 255 : 0;

            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)
                    {
                        var val = estruturante[i + (size / 2) - x, j + (size / 2) - y];
                        if (!Double.IsNegativeInfinity(val))
                        {
                            if (type==0) // erosion
                                if (E > img[i, j] - val)
                                    E = (int)(img[i, j] - val);

                            if (type == 1) // dilatação
                                if (E < img[i, j] + val)
                                    E = (int)(img[i, j] + val);
                        }
                    }

            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)
                    {
                       var val  = (estruturante[i + (size / 2) - x, j + (size / 2) - y] + E);
                       if (!double.IsNegativeInfinity(val))
                           ret[i, j] = (byte)Normalize(val);
                    }
        }
Exemple #35
0
        public PgmImg ReduceColors(PgmImg pgm)
        {
            var temp = pgm.Clone();

            for (int i = 0; i < pgm.Width; i++)
                for (int j = 0; j < pgm.Height; j++)
                    temp[i, j] = Reduce(pgm[i, j], pgm.ReduceTo);

            /*
            // outra forma - mais lenta
               var newColorArray = new int[pgm.ReduceTo];
               for (int i = 0; i < pgm.ReduceTo ; i++)
               newColorArray[i] = i * (255 / (pgm.ReduceTo-1));

               for (int i = 0; i < matrix.GetLength(0); i++)
               for (int j = 0; j < matrix.GetLength(1); j++)
                   temp[i, j] = (byte)Closest((int)matrix[i, j], newColorArray);
               */

            return temp;
        }
Exemple #36
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;
        }
 private void apply(Func <PgmImg, PgmImg> transform)
 {
     addHistory();
     bitmap = transform(bitmap);
     show();
 }
Exemple #38
0
        public PgmImg Gaussian(PgmImg pgm)
        {
            // Gaussiana
            Func<double, double, double, double, double>
                g = (x, y, r, t) => (1F / (2F * Math.PI * t * t)) * Math.Pow(Math.E,  ((-1F * (x * x + y * y)) / (2F * t * t)) );

            var betaMatrix = windowFor(pgm, g);
            return Map(betaMatrix);
        }
Exemple #39
0
        public PgmImg RotateL(PgmImg bitmap)
        {
            var ret = MirrorY(Transpose(bitmap));

            return(ret);
        }
Exemple #40
0
        private double[,] CriaMatrizEstruturante(PgmImg img)
        {
            var dim = img.ReduceTo;
            var ret = new Double[dim, dim];

            using (FileStream fs = new FileStream("elements\\" + dim.ToString() + ".txt", FileMode.Open))
            {
                using (BinaryReader reader = new BinaryReader(fs, Encoding.ASCII))
                {
                    for (int i = 0; i < dim; i++)
                        for (int j = 0; j < dim; j++)
                        {
                            var c = reader.ReadChar();
                            if (c == '\n' || c == '\r')
                            {
                                j--;
                                continue;
                            }

                            double val = 0;

                            if (c == 'X' || c == 'x')
                                val = Double.NegativeInfinity;
                            else
                                val = Double.Parse(c.ToString());

                            ret[i, j] = val;
                        }

                }
            }

            return ret;
        }
Exemple #41
0
        public PgmImg Transpose(PgmImg pgm)
        {
            var temp = new PgmImg(pgm.Height, pgm.Width);

            for (int i = 0; i < pgm.Width; i++)
                for (int j = 0; j < pgm.Height; j++)
                    temp[j, i] = pgm[i, j];

            return temp;
        }
Exemple #42
0
        private double[,] LaplacianaMatrix(PgmImg pgm, Func<double, double> Map = null)
        {
            // Laplaciana
            Func<double, double, double, double, double>
               g = (x, y, r, t) => (-1 / (Math.PI * Math.Pow(t,4))) * (1 - ((x * x + y * y) / (2 * t * t))) * Math.Exp( -((x * x + y * y ) / (2 * t * t)) );

            /* Func<double, double, double, double, double>
                g = (x, y, r, t) =>
                {
                    var ret = 0.00;

                    if (x == 0 && y == 0)
                        ret = 4;

                    if (x == 1 && y == 0)
                        ret = -1;

                    if (x == 0 && y == 1)
                        ret = -1;

                    if (x == 1 && y == 1)
                        ret = 0;

                    return ret;
                };*/

            return windowFor(pgm, g, Map);
        }
Exemple #43
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;
        }
Exemple #44
0
        private PgmImg Map(double[,] mat)
        {
            var pgm = new PgmImg((int)mat.GetLongLength(0), (int)mat.GetLongLength(1));

            Parallel.For(0, pgm.Width, i =>
            {
                Parallel.For(0, pgm.Height, j =>
                {
                    pgm[i, j] = Normalize(Math.Round(mat[i, j]));
                });
            });

            return pgm;
        }
Exemple #45
0
 public PgmImg Laplaciana(PgmImg pgm)
 {
     var lapla = LaplacianaMatrix(pgm, e => e / 8 + (255f/2) );
        //Export(lapla);
        return Map(lapla);
 }
Exemple #46
0
        private double windowConvolution(PgmImg img, int x, int y, Func<double, double, double, double, double> F)
        {
            int size = img.ReduceTo,
               x_aux = x - size / 2,
               y_aux = y - size / 2;

            double ret = 0;

            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)
                        ret += ((double)img[i, j]) * F(Math.Abs(x - i), Math.Abs(y - j), size, img.Sigma == 0 ? (size / 6F) : img.Sigma);

            return ret;
        }
Exemple #47
0
        public PgmImg Highlight(PgmImg pgm)
        {
            var lapla = LaplacianaMatrix(pgm);

            var matCalc = new double[pgm.Width, pgm.Height];

              Parallel.For(0, pgm.Width, i => {
                  Parallel.For(0, pgm.Height, j => {
                      matCalc[i, j] =  ((double)pgm[i, j]) - lapla[i, j];
                  });
              });

            return Map(matCalc);
        }
Exemple #48
0
        public PgmImg FloydSteinberg(PgmImg pgm)
        {
            var temp = pgm.Clone();

            var width = temp.Width-1;
            var height = temp.Height-1;

            for (int i = 0; i < temp.Width; i++)
                for (int j = 0; j < temp.Height; j++)
                {
                    var original = temp[i, j];
                    temp[i, j] = Reduce(temp[i, j], pgm.ReduceTo);
                    var error = (double)original - (double)temp[i, j];

                    if (j < height)
                        temp[i, j + 1] = Normalize(temp[i + 0, j + 1] + error * MagicNumbers.Right);

                    if (i < width)
                        temp[i + 1, j ] = Normalize(temp[i + 1, j + 0] + error * MagicNumbers.Down);

                    if (j < height && i < width)
                        temp[i + 1, j + 1] = Normalize(temp[i + 1, j + 1] + error * MagicNumbers.DownRight);

                    if (j > 0 && i < width)
                        temp[i + 1, j - 1] = Normalize(temp[i + 1, j - 1] + error * MagicNumbers.DownLeft);

                }

            return temp;
        }
Exemple #49
0
 public PgmImg RotateR(PgmImg bitmap)
 {
     var ret = MirrorX(Transpose(bitmap));
     return ret;
 }
Exemple #50
0
 public PgmImg Average(PgmImg pgm)
 {
     return(SiblingScan(AverageOptions.Normal, pgm));
 }
Exemple #51
0
        public static Bitmap ToBitmap( PgmImg pgmImage)
        {
            var width = pgmImage.Width;
                var height = pgmImage.Height;
                ColorPalette grayScale;

                Bitmap bmp = new Bitmap(width, height, PixelFormat.Format8bppIndexed);

               grayScale = bmp.Palette;
               for (int i = 0; i < 256; i++)
                   grayScale.Entries[i] = Color.FromArgb(i, i, i);

                bmp.Palette = grayScale;
                BitmapData dt = bmp.LockBits(new Rectangle(0, 0, width, height), ImageLockMode.WriteOnly, PixelFormat.Format8bppIndexed);
                int offset = dt.Stride - dt.Width;

                unsafe
                {
                    byte* ptr = (byte*)dt.Scan0;

                    for (int i = 0; i < height; i++)
                    {
                        for (int j = 0; j < width; j++)
                        {
                            *ptr = pgmImage[j, i];
                            ptr++;
                        }
                        ptr += offset;
                    }
                }

                bmp.UnlockBits(dt);
                return bmp;
        }
Exemple #52
0
 public PgmImg Median(PgmImg pgm)
 {
     return(SiblingScan(AverageOptions.Median, pgm));
 }
        private void btnRedo_Click(object sender, RoutedEventArgs e)
        {
            if (Redo.Count == 0)
                return;

            Undo.Push(bitmap.Clone());
            bitmap = Redo.Pop();
            show();
        }
Exemple #54
0
 public PgmImg Average(PgmImg pgm)
 {
     return SiblingScan(AverageOptions.Normal, pgm);
 }
 private void apply(Func<PgmImg, PgmImg> transform)
 {
     addHistory();
     bitmap = transform(bitmap);
     show();
 }
Exemple #56
0
        private double[,] windowFor(PgmImg pgm, Func<double, double, double, double, double> F, Func<double, double> MapF = null)
        {
            var ret = new double[pgm.Width,pgm.Height];

            /*
            Parallel.For(0, pgm.Width, i =>
            {
                Parallel.For(0, pgm.Height, j =>
                {
                    var newValue = windowProcess(pgm, i, j, F);

                    if (MapF != null)
                        newValue = MapF(newValue);

                    ret[i, j] = newValue;
                });
            });
            */

            for (int i = 0; i < pgm.Width; i++)
            {
                for (int j = 0; j < pgm.Height; j++)
                {
                    var newValue = windowConvolution(pgm, i, j, F);

                    if (MapF != null)
                        newValue = MapF(newValue);

                    ret[i, j] = newValue;
                }
            }
            return ret;
        }