/// <summary> /// Return double between 0 and 100. /// </summary> public static double GetBackgroundRercentage(double[,] img, int windowSize, double weight) { int badRegions = 0; //int mediumRegions = 0; int goodRegions = 0; double numberOfRegions; int[,] xGradients = OrientationFieldGenerator.GenerateXGradients(img.Select2D(a => (int)a)); int[,] yGradients = OrientationFieldGenerator.GenerateYGradients(img.Select2D(a => (int)a)); double[,] magnitudes = xGradients.Select2D( (value, x, y) => Math.Sqrt(xGradients[x, y] * xGradients[x, y] + yGradients[x, y] * yGradients[x, y])); double averege = KernelHelper.Average(magnitudes); double[,] window = new double[windowSize, windowSize]; N = (int)Math.Ceiling(((double)img.GetLength(0)) / windowSize); M = (int)Math.Ceiling(((double)img.GetLength(1)) / windowSize); numberOfRegions = N * M; for (int i = 0; i < N; i++) { for (int j = 0; j < M; j++) { ///////////////////////////////////////////// window = window.Select2D((value, x, y) => { if (i * windowSize + x >= magnitudes.GetLength(0) || j * windowSize + y >= magnitudes.GetLength(1)) { return(0); } return(magnitudes[(int)(i * windowSize + x), (int)(j * windowSize + y)]); }); ////////////////////////////////////////// if (KernelHelper.Average(window) < averege * weight) { badRegions++; } else { goodRegions++; } } } return(((badRegions) / numberOfRegions) * 100); }
//public static bool[,] GetMask(int[] mask1D, int maskY, int imgX, int imgY, int windowSize) //{ // bool[,] bigMask = new bool[imgX, imgY]; // bigMask = bigMask.Select2D((value, x, y) => // { // int xBlock = (int)(((double)x) / windowSize); // int yBlock = (int)(((double)y) / windowSize); // return mask1D[xBlock + yBlock * maskY] == 1; // }); // return bigMask; //} public static int[,] Segmetator(double[,] img, int windowSize, double weight, int threshold) { int[,] xGradients = OrientationFieldGenerator.GenerateXGradients(img.Select2D(a => (int)a)); int[,] yGradients = OrientationFieldGenerator.GenerateYGradients(img.Select2D(a => (int)a)); double[,] magnitudes = xGradients.Select2D( (value, x, y) => Math.Sqrt(xGradients[x, y] * xGradients[x, y] + yGradients[x, y] * yGradients[x, y])); double averege = KernelHelper.Average(magnitudes); double[,] window = new double[windowSize, windowSize]; N = (int)Math.Ceiling(((double)img.GetLength(0)) / windowSize); M = (int)Math.Ceiling(((double)img.GetLength(1)) / windowSize); int[,] mask = new int[N, M]; for (int i = 0; i < N; i++) { for (int j = 0; j < M; j++) { window = window.Select2D((value, x, y) => { if (i * windowSize + x >= magnitudes.GetLength(0) || j * windowSize + y >= magnitudes.GetLength(1)) { return(0); } return(magnitudes[(int)(i * windowSize + x), (int)(j * windowSize + y)]); }); if (KernelHelper.Average(window) < averege * weight) { mask[i, j] = 0; } else { mask[i, j] = 1; } } } PostProcessing(mask, threshold); return(mask); // GetBigMask(mask, img.GetLength(0), img.GetLength(1), windowSize); //return ColorImage(img, mask, windowSize); }