原文:
Win8Metro(C#)数字图像处理--2.29图像除法运算
[函数名称]
图像除法函数DivisionProcess(WriteableBitmap src, WriteableBitmap divSrc)
[函数代码]
/// <summary> /// Division of two images. /// </summary> /// <param name="src">The frist source image.</param> /// <param name="divSrc">The second source image.</param> /// <returns></returns> public static WriteableBitmap DivisionProcess(WriteableBitmap src,WriteableBitmap divSrc)////29图像除法 { if (src != null) { int w = src.PixelWidth; int h = src.PixelHeight; WriteableBitmap divImage = new WriteableBitmap(w, h); byte[] temp = src.PixelBuffer.ToArray(); byte[] divTemp = divSrc.PixelBuffer.ToArray(); byte[] dst = new byte[w * h * 4]; int r = 0, g = 0, b = 0, graySrc = 0, grayDiv = 0; for (int i = 0; i < w; i++) { for (int j = 0; j < h; j++) { graySrc = temp[i * 4 + (h - 1 - j) * w * 4] + temp[i * 4 + 1 + (h - 1 - j) * w * 4] + temp[i * 4 + 2 + (h - 1 - j) * w * 4]; grayDiv = divTemp[i * 4 + (h - 1 - j) * w * 4] + divTemp[i * 4 + 1 + (h - 1 - j) * w * 4] + divTemp[i * 4 + 2 + (h - 1 - j) * w * 4]; if (grayDiv + graySrc != 0) { b = temp[i * 4 + (h - 1 - j) * w * 4] * (temp[i * 4 + (h - 1 - j) * w * 4] - divTemp[i * 4 + (h - 1 - j) * w * 4]) / (temp[i * 4 + (h - 1 - j) * w * 4] + divTemp[i * 4 + (h - 1 - j) * w * 4]); g = temp[i * 4 + 1 + (h - 1 - j) * w * 4] * (temp[i * 4 + 1 + (h - 1 - j) * w * 4] - divTemp[i * 4 + 1 + (h - 1 - j) * w * 4]) / (temp[i * 4 + 1 + (h - 1 - j) * w * 4] + divTemp[i * 4 + 1 + (h - 1 - j) * w * 4]); r = temp[i * 4 + 2 + (h - 1 - j) * w * 4] * (temp[i * 4 + 2 + (h - 1 - j) * w * 4] - divTemp[i * 4 + 2 + (h - 1 - j) * w * 4]) / (temp[i * 4 + 2 + (h - 1 - j) * w * 4] + divTemp[i * 4 + 2 + (h - 1 - j) * w * 4]); dst[i * 4 + j * w * 4] = (byte)(b > 0 ? (b < 255 ? b : 255) : 0); dst[i * 4 + 1 + j * w * 4] = (byte)(g > 0 ? (g < 255 ? g : 255) : 0); dst[i * 4 + 2 + j * w * 4] = (byte)(r > 0 ? (r < 255 ? r : 255) : 0); dst[i * 4 + 3 + j * w * 4] = 0; b = 0; g = 0; r = 0; } } } Stream sTemp = divImage.PixelBuffer.AsStream(); sTemp.Seek(0, SeekOrigin.Begin); sTemp.Write(dst, 0, w * 4 * h); return divImage; } else { return null; } }