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