예제 #1
0
        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);
        }