/// <summary>
        /// see: http://www.songho.ca/dsp/luminance/luminance.html
        /// </summary>
        public unsafe static void ConvertBgrToGray_Byte(IImage src, IImage dest)
        {
            Bgr8 *srcPtr = (Bgr8 *)src.ImageData;
            byte *dstPtr = (byte *)dest.ImageData;

            int width  = src.Width;
            int height = src.Height;

            int srcShift = src.Stride - width * sizeof(Bgr8); //DO NOT divide with sizeof(Bgr8) as reminder may not be 0!!!
            int dstShift = dest.Stride - width * sizeof(byte);

            for (int row = 0; row < height; row++)
            {
                for (int col = 0; col < width; col++)
                {
                    Bgr8.ConvertBgrToGray(srcPtr, dstPtr);

                    srcPtr++;
                    dstPtr++;
                }

                srcPtr = (Bgr8 *)((byte *)srcPtr + srcShift);
                dstPtr = (byte *)((byte *)dstPtr + dstShift);
            }
        }
        /// <summary>
        /// Evaluates the function using the provided image.
        /// </summary>
        /// <param name="image">Color image.</param>
        /// <returns>Entropy value. Smaller entropy is preferred.</returns>
        public unsafe float Evaluate(Bgr <byte>[,] image)
        {
            var histogram = new int[HISTOGRAM_SIZE];

            using (var uImg = image.Lock())
            {
                Bgr8 *imData = (Bgr8 *)uImg.ImageData;

                for (int r = 0; r < uImg.Height; r++)
                {
                    for (int c = 0; c < uImg.Width; c++)
                    {
                        Bgr8  bgr       = imData[c];
                        float intensity = 0.2126f * bgr.R + 0.7152f * bgr.G + 0.0722f * bgr.B;

                        float gain       = getGainAt(this, c, r, uImg.Width, uImg.Height);
                        int   correction = (int)(gain * intensity);

                        updateHistogram(histogram, correction);
                    }

                    imData = (Bgr8 *)((byte *)imData + uImg.Stride);
                }
            }

            float entropy = calculateEntropy(histogram);

            return(entropy);
        }