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