public void ProcessImage(PictureHandler sourceImage, PictureHandler targetImage)
        {
            float pixelCount = sourceImage.PixelHeight * sourceImage.PixelWidth;

            float[] cdfR = new float[256];
            float[] cdfG = new float[256];
            float[] cdfB = new float[256];

            float r, g, b;

            sourceImage.GetHistogramDataFor(0, out r, out g, out b);
            cdfR[0] = r;
            cdfG[0] = g;
            cdfB[0] = b;

            for (int i = 1; i < 256; i++)
            {
                sourceImage.GetHistogramDataFor(i, out r, out g, out b);
                cdfR[i] = cdfR[i - 1] + r;
                cdfG[i] = cdfG[i - 1] + g;
                cdfB[i] = cdfB[i - 1] + b;
            }

            float denominatorR = pixelCount - cdfR[0];
            float denominatorG = pixelCount - cdfG[0];
            float denominatorB = pixelCount - cdfB[0];

            for (int x = 0; x < sourceImage.PixelWidth; x++)
            {
                for (int y = 0; y < sourceImage.PixelHeight; y++)
                {
                    Color c  = sourceImage[x, y];
                    int   rr = (int)((cdfR[c.R] - cdfR[0]) / denominatorR * 255);
                    int   gg = (int)((cdfG[c.G] - cdfR[0]) / denominatorG * 255);
                    int   bb = (int)((cdfB[c.B] - cdfR[0]) / denominatorB * 255);
                    targetImage[x, y] = Color.FromRgb((byte)MathHelper.Limit(rr), (byte)MathHelper.Limit(gg), (byte)MathHelper.Limit(bb));
                }
            }
        }