為了加快圖像的處理速度,在圖像處理算法中,往往需要把彩色圖像轉換為灰度圖像
24位彩色圖像每個像素用3個字節表示,每個字節對應着R、G、B分量的亮度。當RGB分量值不同時,表現為彩色圖像,當RGB分量值相同時,表現為灰度圖像。
求灰度值的方法:
-
平均值法將彩色圖像中的三分量亮度求平均得到一個灰度圖。f( i,j)=( R( i,j)+ G( i,j)+ B( i,j)) /3
-
加權平均法根據重要性及其它指標,將三個分量以不同的權值進行加權平均。由於人眼對綠色的敏感最高,對藍色敏感最低,因此,按下式對RGB三分量進行加權平均能得到較合理的灰度圖像。f( i,j)=0.30 R( i,j)+0.59 G( i,j)+0.11 B( i,j))
灰度前后對比效果圖:
實例:
1 using System; 2 using System.Collections.Generic; 3 using System.ComponentModel; 4 using System.Data; 5 using System.Drawing; 6 using System.Drawing.Imaging; 7 using System.Text; 8 using System.Windows.Forms; 9 namespace gray 10 { 11 public partial class Form1 : Form 12 { 13 public Form1() 14 { 15 InitializeComponent(); 16 myTimer = new HiPerfTimer(); 17 } 18 //打開圖像 19 private void open_Click(object sender, EventArgs e) 20 { 21 OpenFileDialog opnDlg = new OpenFileDialog();//創建OpenFileDialog對象 22 //為圖像選擇一個篩選器 23 opnDlg.Filter = "所有圖像文件 | *.bmp; *.pcx; *.png; *.jpg; *.gif;"+ 24 "*.tif; *.ico; *.dxf; *.cgm; *.cdr; *.wmf; *.eps; *.emf|" + 25 "位圖( *.bmp; *.jpg; *.png;...) | *.bmp; *.pcx; *.png; *.jpg; *.gif; *.tif; *.ico|" + 26 "矢量圖( *.wmf; *.eps; *.emf;...) | *.dxf; *.cgm; *.cdr; *.wmf; *.eps; *.emf"; 27 opnDlg.Title = "打開圖像文件"; 28 opnDlg.ShowHelp = true;//啟動幫助按鈕 29 if (opnDlg.ShowDialog() == DialogResult.OK) 30 { 31 curFileName = opnDlg.FileName; 32 try 33 { 34 curBitmap = (Bitmap)Image.FromFile(curFileName);//使用Image.FromFile創建圖像對象 35 } 36 catch (Exception exp) 37 { 38 MessageBox.Show(exp.Message); 39 } 40 } 41 //使控件的整個圖面無效並導致重繪控件 42 Invalidate();//對窗體進行重新繪制,這將強制執行Paint事件處理程序 43 } 44 45 private void save_Click(object sender, EventArgs e) 46 { 47 if(curBitmap == null) 48 { 49 return; 50 } 51 SaveFileDialog saveDlg = new SaveFileDialog(); 52 saveDlg.Title = "保存為"; 53 saveDlg.OverwritePrompt = true; 54 saveDlg.Filter = 55 "BMP文件 (*.bmp) | *.bmp|" + 56 "Gif文件 (*.gif) | *.gif|" + 57 "JPEG文件 (*.jpg) | *.jpg|" + 58 "PNG文件 (*.png) | *.png"; 59 saveDlg.ShowHelp = true; 60 if(saveDlg.ShowDialog() == DialogResult.OK) 61 { 62 string fileName = saveDlg.FileName; 63 string strFilExtn = fileName.Remove(0, fileName.Length - 3); 64 switch (strFilExtn) 65 { 66 case "bmp": 67 curBitmap.Save(fileName, System.Drawing.Imaging.ImageFormat.Bmp); 68 break; 69 case "jpg": 70 curBitmap.Save(fileName, System.Drawing.Imaging.ImageFormat.Jpeg); 71 break; 72 case "gif": 73 curBitmap.Save(fileName, System.Drawing.Imaging.ImageFormat.Gif); 74 break; 75 case "tif": 76 curBitmap.Save(fileName, System.Drawing.Imaging.ImageFormat.Tiff); 77 break; 78 case "png": 79 curBitmap.Save(fileName, System.Drawing.Imaging.ImageFormat.Png); 80 break; 81 default: 82 break; 83 } 84 } 85 } 86 87 private void close_Click(object sender, EventArgs e) 88 { 89 this.Close(); 90 } 91 /// <summary> 92 /// 當一個應用程序需要進行繪制時,他必須通過Graphics對象來執行繪制操作 93 /// 獲取Graphics對象的方法有好幾種,這里我們使用窗體Paint事件的PaintEventArgs屬性來獲取一個與窗體相關聯的Graphics對象 94 /// </summary> 95 /// <param name="sender"></param> 96 /// <param name="e"></param> 97 private void Form1_Paint(object sender, PaintEventArgs e) 98 { 99 Graphics g = e.Graphics;//獲取Graphics對象 100 if(curBitmap != null) 101 { 102 g.DrawImage(curBitmap, 160, 20, curBitmap.Width, curBitmap.Height);//使用DrawImage方法繪制圖像 103 } 104 } 105 /// <summary> 106 /// 提取灰度法 107 /// 為了將位圖的顏色設置為灰度或其他顏色,需要使用GetPixel來讀取當前像素的顏色--->計算灰度值--->使用SetPixel應用新的顏色 108 /// </summary> 109 private void pixel_Click(object sender, EventArgs e) 110 { 111 if(curBitmap != null) 112 { 113 myTimer.ClearTimer(); 114 myTimer.Start(); 115 Color curColor; 116 int ret; 117 //二維圖像數組循環 118 for (int i = 0; i < curBitmap.Width; i++) 119 { 120 for (int j = 0; j < curBitmap.Height ; j++) 121 { 122 //讀取當前像素的RGB顏色值 123 curColor = curBitmap.GetPixel(i,j); 124 //利用公式計算灰度值(加權平均法) 125 ret = (int)(curColor.R * 0.299 + curColor.G * 0.587 + curColor.B * 0.114); 126 //設置該點像素的灰度值,R=G=B=ret 127 curBitmap.SetPixel(i, j, Color.FromArgb(ret, ret, ret)); 128 } 129 } 130 myTimer.Stop(); 131 timeBox.Text = myTimer.Duration.ToString("####.##") + " 毫秒"; 132 //使控件的整個圖面無效並導致重繪控件 133 Invalidate();//對窗體進行重新繪制,這將強制執行Paint事件處理程序 134 } 135 } 136 } 137 }
參考文獻:C#數字圖像處理算法典型實例(網上有PDF版)
轉載請注明出處:http://www.cnblogs.com/hongfei/archive/2013/01/13/2858403.html