原文:
Win8Metro(C#)数字图像处理--2.34直方图规定化
[函数名称]
WriteableBitmap HistogramSpecificateProcess(WriteableBitmap src, WriteableBitmap dst)
[算法说明]
[函数代码] /// <summary> /// Histogram specification process. /// </summary> /// <param name="src">The source image.</param> /// <param name="dst">The image to get histogram to use.</param> /// <returns></returns> public static WriteableBitmap HistogramSpecificateProcess(WriteableBitmap src, WriteableBitmap dst)////38图像直方图规定化 { if (src != null) { int w = src.PixelWidth; int h = src.PixelHeight; byte[]histMap=HistogramMap(dst); WriteableBitmap histImage = new WriteableBitmap(w, h); byte[] temp = src.PixelBuffer.ToArray(); for (int i = 0; i < temp.Length; i += 4) { temp[i] = (byte)(255 * histMap[temp[i]]); temp[i + 1] = (byte)(255 * histMap[temp[i+1]]); temp[i + 2] = (byte)(255 * histMap[temp[i+2]]); } Stream sTemp = histImage.PixelBuffer.AsStream(); sTemp.Seek(0, SeekOrigin.Begin); sTemp.Write(temp, 0, w * 4 * h); return histImage; } else { return null; } } public static byte[] HistogramMap(WriteableBitmap src) { if (src != null) { byte[] temp = src.PixelBuffer.ToArray(); byte gray; int[] tempArray = new int[256]; int[] countPixel = new int[256]; byte[] pixelMap = new byte[256]; for (int i = 0; i < temp.Length; i += 4) { gray = (byte)(temp[i] * 0.114 + temp[i + 1] * 0.587 + temp[i + 2] * 0.299); countPixel[gray]++; } for (int i = 0; i < 256; i++) { if (i != 0) { tempArray[i] = tempArray[i - 1] + countPixel[i]; } else { tempArray[0] = countPixel[0]; } pixelMap[i] = (byte)(255 * tempArray[i] * 4 / temp.Length + 0.5); } return pixelMap; } else return null; } [图像效果]
<img src="http://img.blog.csdn.net/20150412104816739?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvVHJlbnQxOTg1/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" />