標籤:style class blog code http tar
轉自:影像處理:黑白效果(灰階處理)
1.:
2.實現原理:
映像灰階化就是使色彩的三種顏色分量R、G、B的值相同,由於顏色值的取值範圍是[0,255],所以灰階的
層級只有256種,即灰階圖象僅能表現256種灰階顏色,常用有3種處理方法:
*最大值法(Maximum):R=G=B=Max(R,G,B),這種方法處理後灰階圖象的亮度會偏高。
*平均值法(Average):R=G=B=(R+G+B)/3,這種方法處理後灰階圖象的亮度較柔和。
*加權平均值法(Weighted Average):
R=G=B=wr*R+wg*G+wb*B,wr、wg、wb分別為R、G、B的權值。
當其權值取不同的值時,能夠形成不同灰階的灰階圖象,由於人眼對綠色的敏感度最高,紅色次之,
藍色最低,因此當wg > wr > wb時,所產生的灰階映像更符合人眼的視覺感受。
通常wr=30%,wg=59%,wb=11%,映像的灰階最合理。
以下的程式使用的是wr=70%,wg=20%,wb=10%覺得效果更好。
3.實現代碼:
1public enum AlgorithmsType
2 {
3 MaxValue, //最大值法
4 AverageValue, //平均值法
5 WeightAverage //加權平均值法
6 }
public static Image Gray(Image img, AlgorithmsType algo)
{
int width = img.Width;
int height = img.Height;
Bitmap bmp = new Bitmap(img);
//設定執行個體BitmapData相關資訊
Rectangle rect = new Rectangle(0, 0, width, height);
ImageLockMode mode = ImageLockMode.ReadWrite;
PixelFormat format = PixelFormat.Format32bppArgb;
//鎖定bmp到系統記憶體中
BitmapData data = bmp.LockBits(rect, mode, format);
//擷取位元影像中第一個像素資料的地址
IntPtr ptr = data.Scan0;
int numBytes = width * height * 4;
byte[] rgbValues = new byte[numBytes];
//將bmp資料Copy到申明的數組中
Marshal.Copy(ptr, rgbValues, 0, numBytes);
for (int i = 0; i < rgbValues.Length; i += 4)
{
int value = 0;
switch (algo)
{
//最大值法
case AlgorithmsType.MaxValue:
value = rgbValues[i] > rgbValues[i + 1] ? rgbValues[i] : rgbValues[i + 1];
value = value > rgbValues[i + 2] ? value : rgbValues[i + 2];
break;
//平均值法
case AlgorithmsType.AverageValue:
value = (int)((rgbValues[i] + rgbValues[i + 1] + rgbValues[i + 2]) / 3);
break;
//加權平均值法
case AlgorithmsType.WeightAverage:
value = (int)(rgbValues[i] * 0.1 + rgbValues[i + 1] * 0.2
+ rgbValues[i + 2] * 0.7);
break;
}
//將數組中存放R、G、B的值修改為計算後的值
for (int j = 0; j < 3; j++)
{
rgbValues[i + j] = (byte)value;
}
}
//將資料Copy到記憶體指標
Marshal.Copy(rgbValues, 0, ptr, numBytes);
//從系統記憶體解鎖bmp
bmp.UnlockBits(data);
return (Image)bmp;
}
4.說明:
使用GetPixel方法和SetPixel方法的實現參考柔化(平滑)處理;
使用不安全模式參考椒鹽雜訊(雜點) 方法一;
本例實現方法與椒鹽雜訊(雜點)方法二相同。