Esempio n. 1
0
        /// <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);
        }