C#圖像的灰度化處理:提取像素法


為了加快圖像的處理速度,在圖像處理算法中,往往需要把彩色圖像轉換為灰度圖像

24位彩色圖像每個像素用3個字節表示,每個字節對應着R、G、B分量的亮度。當RGB分量值不同時,表現為彩色圖像,當RGB分量值相同時,表現為灰度圖像。

求灰度值的方法:

  1. 平均值法
    將彩色圖像中的三分量亮度求平均得到一個灰度圖。
    f( i,j)=( R( i,j)+ G( i,j)+ B( i,j)) /3
  2. 加權平均法
    根據重要性及其它指標,將三個分量以不同的權值進行加權平均。由於人眼對綠色的敏感最高,對藍色敏感最低,因此,按下式對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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM