/// <summary>
        /// Decomposite given bitmaps into HSL components
        /// </summary>
        /// <param name="sources"></param>
        /// <returns>return a 3d mat [3][nrow][ncol]</returns>
        public My3DMat <double>[] To3DMatrix(Bitmap [] sources)
        {
            int nvar = sources.Length;
            var nrow = sources[0].Height;
            var ncol = sources[0].Width;

            My3DMat <double>[] mats = new My3DMat <double> [3];
            for (int i = 0; i < 3; i++)
            {
                mats[i] = new My3DMat <double>(nvar, nrow, ncol);
            }

            for (int i = 0; i < nvar; i++)
            {
                for (int r = 0; r < nrow; r++)
                {
                    for (int c = 0; c < ncol; c++)
                    {
                        var color = sources[i].GetPixel(c, r);
                        var hsl   = ToFloat(r, c);
                        mats[0].Value[i][r][c] = hsl[0];
                        mats[1].Value[i][r][c] = hsl[1];
                        mats[2].Value[i][r][c] = hsl[2];
                    }
                }
            }
            return(mats);
        }
Beispiel #2
0
        public My3DMat <double> Average(My3DMat <double> source)
        {
            int nvar = source.Size[0];
            int nrow = source.Size[1];
            int ncol = source.Size[2];
            var mat  = new My3DMat <double>(nvar, nrow, ncol);

            int ncol_1 = ncol - 1;
            int nrow_1 = nrow - 1;

            for (int v = 0; v < nvar; v++)
            {
                var mat_source = source.Value[v];
                var vec5       = new double[5];
                // the first and the last columns
                for (int r = 1; r < nrow - 1; r++)
                {
                    vec5[0]            = mat_source[r - 1][0];
                    vec5[1]            = mat_source[r - 1][1];
                    vec5[2]            = mat_source[r][1];
                    vec5[3]            = mat_source[r + 1][1];
                    vec5[4]            = mat_source[r + 1][0];
                    mat.Value[v][r][0] = vec5.Average();

                    vec5[0] = mat_source[r - 1][ncol_1];
                    vec5[1] = mat_source[r - 1][ncol_1 - 1];
                    vec5[2] = mat_source[r][ncol_1 - 1];
                    vec5[3] = mat_source[r + 1][ncol_1 - 1];
                    vec5[4] = mat_source[r + 1][ncol_1];
                    mat.Value[v][r][ncol_1] = vec5.Average();
                }
                // the first and the last rows
                for (int c = 1; c < ncol - 1; c++)
                {
                    vec5[0]            = mat_source[0][c - 1];
                    vec5[1]            = mat_source[1][c - 1];
                    vec5[2]            = mat_source[1][c];
                    vec5[3]            = mat_source[1][c + 1];
                    vec5[4]            = mat_source[0][c + 1];
                    mat.Value[v][0][c] = vec5.Average();

                    vec5[0] = mat_source[nrow_1][c - 1];
                    vec5[1] = mat_source[nrow_1 - 1][c - 1];
                    vec5[2] = mat_source[nrow_1 - 1][c];
                    vec5[3] = mat_source[nrow_1 - 1][c + 1];
                    vec5[4] = mat_source[nrow_1][c + 1];

                    mat.Value[v][nrow_1][c] = vec5.Average();
                }

                double[] vec8 = new double[8];
                for (int r = 1; r < nrow - 1; r++)
                {
                    for (int c = 1; c < ncol - 1; c++)
                    {
                        vec8[0] = mat_source[r - 1][c - 1];
                        vec8[1] = mat_source[r - 1][c];
                        vec8[2] = mat_source[r - 1][c + 1];
                        vec8[3] = mat_source[r][c - 1];
                        vec8[4] = mat_source[r][c + 1];
                        vec8[5] = mat_source[r + 1][c - 1];
                        vec8[6] = mat_source[r + 1][c];
                        vec8[7] = mat_source[r + 1][c + 1];

                        mat.Value[v][r][c] = vec8.Average();
                    }
                }
            }
            return(mat);
        }
Beispiel #3
0
        public My3DMat <float> StandardDeviation(My3DMat <float> source)
        {
            var mat    = new My3DMat <float>(source.Size[0], source.Size[1], source.Size[2]);
            int nrow   = source.Size[1];
            int ncol   = source.Size[2];
            int ncol_1 = ncol - 1;
            int nrow_1 = nrow - 1;

            var mat_source = source.Value[0];
            var vec5       = new float[5];

            // the first and the last columns
            for (int r = 1; r < nrow - 1; r++)
            {
                vec5[0]            = mat_source[r - 1][0];
                vec5[1]            = mat_source[r - 1][1];
                vec5[2]            = mat_source[r][1];
                vec5[3]            = mat_source[r + 1][1];
                vec5[4]            = mat_source[r + 1][0];
                mat.Value[0][r][0] = MyStatisticsMath.StandardDeviation(vec5);

                vec5[0] = mat_source[r - 1][ncol_1];
                vec5[1] = mat_source[r - 1][ncol_1 - 1];
                vec5[2] = mat_source[r][ncol_1 - 1];
                vec5[3] = mat_source[r + 1][ncol_1 - 1];
                vec5[4] = mat_source[r + 1][ncol_1];
                mat.Value[0][r][ncol_1] = MyStatisticsMath.StandardDeviation(vec5);
            }
            // the first and the last rows
            for (int c = 1; c < ncol - 1; c++)
            {
                vec5[0]            = mat_source[0][c - 1];
                vec5[1]            = mat_source[1][c - 1];
                vec5[2]            = mat_source[1][c];
                vec5[3]            = mat_source[1][c + 1];
                vec5[4]            = mat_source[0][c + 1];
                mat.Value[0][0][c] = MyStatisticsMath.StandardDeviation(vec5);

                vec5[0] = mat_source[nrow_1][c - 1];
                vec5[1] = mat_source[nrow_1 - 1][c - 1];
                vec5[2] = mat_source[nrow_1 - 1][c];
                vec5[3] = mat_source[nrow_1 - 1][c + 1];
                vec5[4] = mat_source[nrow_1][c + 1];

                mat.Value[0][nrow_1][c] = MyStatisticsMath.StandardDeviation(vec5);
            }

            float[] vec8 = new float[8];
            for (int r = 1; r < nrow - 1; r++)
            {
                for (int c = 1; c < ncol - 1; c++)
                {
                    vec8[0] = mat_source[r - 1][c - 1];
                    vec8[1] = mat_source[r - 1][c];
                    vec8[2] = mat_source[r - 1][c + 1];
                    vec8[3] = mat_source[r][c - 1];
                    vec8[4] = mat_source[r][c + 1];
                    vec8[5] = mat_source[r + 1][c - 1];
                    vec8[6] = mat_source[r + 1][c];
                    vec8[7] = mat_source[r + 1][c + 1];

                    mat.Value[0][r][c] = MyStatisticsMath.StandardDeviation(vec8);
                }
            }

            return(mat);
        }