原文:
Win8 Metro(C#)数字图像处理--2.60部分彩色保留算法
[函数名称]
部分彩色保留函数 WriteableBitmap PartialcolorProcess(WriteableBitmap src,int rValue,int gValue,int bValue)
[算法说明]
这个算法有多种,可以基于RGB,HSV等多种颜色空间来实现,本文介绍最简单的基于RGB颜色空间的彩色保留算法。
对于我们需要保留的像素P(x,y),它的RGB值分别为R(x,y),G(x,y),B(x,y),各个分量之间的关系有如下几种:
1--R>G>B;2—R>B>G;3—B>R>G;4—B>G>R;5—G>R>B;6—G>B>R;
对于当前像素f(x,y):
如果该像素的RGB分量关系情况与P(x,y)像素的分量关系情况相同,则该像素颜色保留,否则,将该像素做灰度化处理。
这样,就可以保留我们需要的颜色像素了。
[函数代码]
/// <summary> /// Partial color process. /// </summary> /// <param name="src">The source image.</param> /// <param name="rValue">R channel of pixel.</param> /// <param name="gValue">G channel of pixel.</param> /// <param name="bValue">B channel of pixel.</param> /// <returns></returns> public static WriteableBitmap PartialcolorProcess(WriteableBitmap src,int rValue,int gValue,int bValue)////部分彩色 { if (src != null) { int w = src.PixelWidth; int h = src.PixelHeight; WriteableBitmap srcImage = new WriteableBitmap(w, h); byte[] temp = src.PixelBuffer.ToArray(); byte[] tempMask = (byte[])temp.Clone(); int r = 0, g = 0, b = 0; int grayValue=0; for (int j = 0; j < h; j++) { for (int i = 0; i < w; i++) { b = tempMask[i * 4 + j * w * 4]; g = tempMask[i * 4 + 1 + j * w * 4]; r = tempMask[i * 4 + 2 + j * w * 4]; if (((r > b && b > g && rValue > gValue && gValue > bValue) || (r > g && g > b && rValue > gValue && gValue > bValue) || (g > r && r > b && gValue > rValue && rValue > bValue) || (g > b && b > r && gValue > bValue && bValue > rValue) || (b > g && g > r && bValue > gValue && gValue > rValue) || (b > r && r > g && bValue > rValue && rValue > gValue))) { } else { grayValue = (int)((tempMask[i * 4 + j * w * 4] + tempMask[i * 4 + 1 + j * w * 4] + tempMask[i * 4 + 2 + j * w * 4]) / 3); temp[i * 4 + j * w * 4] = temp[i * 4 + 1 + j * w * 4] = temp[i * 4 + 2 + j * w * 4] = (byte)grayValue; } } } Stream sTemp = srcImage.PixelBuffer.AsStream(); sTemp.Seek(0, SeekOrigin.Begin); sTemp.Write(temp, 0, w * 4 * h); return srcImage; } else { return null; } }