public Bitmap ApplyMethod(Bitmap srcImage) { var width = srcImage.Width; var height = srcImage.Height; var lhcImage = LCH.RGBToLch(srcImage); var W = MakeMatrixes(lhcImage); var matrixDif = new double[width * height, width *height]; for (var i = 0; i < width * height; ++i) { for (var j = 0; j < width * height; ++j) { matrixDif[i, j] = W[i, j] - diagonal[i, j]; } } Matrix <double> matrix = DenseMatrix.OfArray(matrixDif); Evd <double> eigen = matrix.Evd(); Vector <Complex> eigenvector = eigen.EigenValues; var resultBitmap = new Bitmap(width, height); var firstRSum = 0.0; var secondRSum = 0.0; var firstGSum = 0.0; var secondGSum = 0.0; var firstBSum = 0.0; var secondBSum = 0.0; var firstGeneralSum = 0; var secondGeneralSum = 0; for (var i = 0; i < width; ++i) { for (var j = 0; j < height; ++j) { if (eigenvector[i].Real < 0) { firstRSum += srcImage.GetPixel(i, j).R; firstGSum += srcImage.GetPixel(i, j).G; firstBSum += srcImage.GetPixel(i, j).B; firstGeneralSum++; } else { secondRSum += srcImage.GetPixel(i, j).R; secondGSum += srcImage.GetPixel(i, j).G; secondBSum += srcImage.GetPixel(i, j).B; secondGeneralSum++; } } } for (var i = 0; i < width; ++i) { for (var j = 0; j < height; ++j) { if (eigenvector[i].Real < 0) { resultBitmap.SetPixel(i, j, Color.FromArgb((int)firstRSum / firstGeneralSum, (int)firstGSum / firstGeneralSum, (int)firstBSum / firstGeneralSum)); } else { resultBitmap.SetPixel(i, j, Color.FromArgb((int)secondRSum / secondGeneralSum, (int)secondGSum / secondGeneralSum, (int)secondBSum / secondGeneralSum)); } } } return(resultBitmap); }