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 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 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 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; }