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); }
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)); }
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); }
public PgmImg Laplaciana(PgmImg pgm) { var lapla = LaplacianaMatrix(pgm, e => e / 8 + (255f / 2)); //Export(lapla); return(Map(lapla)); }
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); }
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); }
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(); }
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; }
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); }
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); } } } } }
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"); } } } }
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"); } } } }
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); }
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); }
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); }
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)); }
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]); } }
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); }
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 + ")"; } }
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; }
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); }
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]); }
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); }
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] ); } } } } }
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); }
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+")"; } }
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; }
public PgmImg Median(PgmImg pgm) { return SiblingScan(AverageOptions.Median, pgm); }
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); } }
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; }
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(); }
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); }
public PgmImg RotateL(PgmImg bitmap) { var ret = MirrorY(Transpose(bitmap)); return(ret); }
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; }
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; }
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); }
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; }
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; }
public PgmImg Laplaciana(PgmImg pgm) { var lapla = LaplacianaMatrix(pgm, e => e / 8 + (255f/2) ); //Export(lapla); return Map(lapla); }
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; }
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); }
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; }
public PgmImg RotateR(PgmImg bitmap) { var ret = MirrorX(Transpose(bitmap)); return ret; }
public PgmImg Average(PgmImg pgm) { return(SiblingScan(AverageOptions.Normal, pgm)); }
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; }
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(); }
public PgmImg Average(PgmImg pgm) { return SiblingScan(AverageOptions.Normal, pgm); }
private void apply(Func<PgmImg, PgmImg> transform) { addHistory(); bitmap = transform(bitmap); show(); }
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; }