程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> 基於C#的顏色空間轉換

基於C#的顏色空間轉換

編輯:C#入門知識

 當前用於數字圖像處理編程的主要是C++(例如Visual C++),原因是其具有靈活性,並運行能力快速高效。但另一方面也給開發帶來了難度和降低了效率。C#是微軟開發的一種面向對象的新型編程語言,是從C/C++中派生而來,保留了C/C++強大功能和靈活性,同時又具有Visual Basic的簡單語法結構和高效開發能力。對於重點關注算法的數字圖像處理研究,C#比較適合用來實現、驗證和開發某種算法。本文介紹了基於C#的圖像處理基本方法,並介紹了在彩色圖像處理中常用的顏色空間及其轉換的C#實現。
  1 彩色圖像處理顏色空間
  顏色空間是彩色圖像處理的基礎,顏色空間的選取直接影響處理的方法和效果。在彩色圖像處理中最常用的顏色空間包括RGB顏色空間和HSI(HSV) 顏色空間。前者常用於計算機輸入輸出設備(包括掃描儀和數碼相機等)中,後者則更符合人類描述和解釋顏色的方式。
  在RGB顏色空間中,每種顏色出現在紅(Red)、綠(Green)、藍(Blue)的原色光譜分量中,其模型基於笛卡兒坐標系統。在此顏色空間,所表示的圖像由三個圖像分量(RGB)組成。
  HSI顏色空間通過色度(Hue)、飽和度(Saturation)和亮度(Intensity)來表示物體的顏色。色度H定義了顏色的波長,反映了顏色最接近哪種光譜波長,既光的不同顏色。飽和度S表示顏色的深淺程度,S越高,顏色越深。I表示強度或亮度,I與顏色信息無關,而H和S包含了顏色信息。
  由於HSI顏色空間中I分量與顏色信息無關,而H和S分量與人眼獲得顏色的方式密切相關,因此比較適合於彩色圖像處理。彩色數字圖像的存儲和顯示一般采用RGB形式,所以常常需要進行RGB顏色空間和HSI顏色空間的相互轉換。關於RGB和HSI的相互轉換公式有不同的形式,但基本思想是相同的。從彩色圖像處理的角度,只要色度是一個角度,飽和度和亮度獨立,轉換是可逆的,不會影響處理的結果。這裡省略了這些公式的描述。
  2 C#圖像處理的基本方法
  C#處理圖像有三種方法:像素法、內存法和指針法。像素法應用GDI+中的方法,易於理解,方法簡單,但運行速度慢;內存法把圖像復制到內存中,直接對內存中的數據進行處理,運行速度比像素法快得多,程序難度也不大;指針法直接利用指針來對圖像進行處理,速度最快。但C#建議不使用指針,因為使用指針,代碼不僅難以編寫和調試,而且無法利用CRL的內存類型安全檢查,不能發揮C#的特長。下面介紹用內存法對圖像處理的基本方法。
  首先在處理圖像的窗體類中定義一個字符串(圖像文件名)和一個Bitmap類型的數據成員(圖像對象),然後可以利用OpenFileDialog選擇圖像文件並讀取文件名,再使用Image.FromFile創建圖形對象。比如:
  在窗體類中定義字符串(圖像文件名)和Bitmap類型的數據成員(圖像對象):
  private string curFileName;
  private System.Drawing.Bitmap curBitmap;
  使用Image.FromFile創建圖形對象:
  curBitmap = (Bitmap)Image.FromFile(curFileName);
  把圖像復制到內存中:
  Rectangle rect = new Rectangle(0, 0, curBitmap.Width, curBitmap.Height); //位圖矩形
  //以可讀寫的方式鎖定全部位圖像素
  System.Drawing.Imaging.Bitmap DatabmpData =
  curBitmap.LockBits(rect, System.Drawing.Imaging.ImageLockMode.ReadWrite, curBitmap.PixelFormat);
  IntPtr ptr = bmpData.Scan0; //得到首地址
  int bytes = curBitmap.Width * curBitmap.Height; //24位BMP位圖字節數
  byte[] rgbValues = new byte[bytes * 3]; //定義位圖數組
  System.Runtime.InteropServices.Marshal.Copy(ptr, rgbValues, 0, bytes * 3); //復制被鎖定的位圖像素到位圖數組
  3 基於C#的顏色空間轉換
  RGB和HSI的相互轉換公式有不同的形式,但基本思想是相同的,以下是由RGB到HSI轉換的一種形式。給定一幅RGB彩色圖像,色度分量H依據B和G的關系而定,當B≤G時,H=arccos{0.5×[ (R-G)+(R-B) ]÷[(R-G)2+ (R-B)2+ (G-B)2]0.5},當B>G時,H=2π- arccos{0.5×[ (R-G)+(R-B) ]÷[(R-G)2+ (R-B)2+ (G-B)2]0.5};飽和度分量S=1-[3÷(R+G+B)]×[min(R,G,B)];亮度分量I=(R+G+B)÷3。
  在這一轉換過程中,H是R、G和B經非線性變換而得到的。如果RGB的值是歸一化到[0,1]范圍內,則HSI的S和I兩個分量的值也在[0,1]范圍內,H可以根據上面公式得到的值除以2π歸一化到[0,1]范圍內。以下是C#實現。
  double[] hue = new double[bytes];//色度分量
  double[] sat = new double[bytes];//飽和度分量
  byte[] inten = new byte[bytes];//亮度分量
  double r, g, b;
  for (int i = 0; i < bytes; i++)
  {r = rgbValues[i * 3 + 2];
   g = rgbValues[i * 3 + 1];
   b = rgbValues[i * 3];
   double theta = Math.Acos(0.5 * ((r - g) + (r - b)) / Math.Sqrt((r - g) * (r - g) + (r - b) * (g - b) + 1)) / (2 * Math.PI);
   hue[i] = ((b <= g) ? theta : (1 - theta));
   sat[i] = 1.0 - 3.0 * Math.Min(Math.Min(r, g), b) / (r + g + b + 1);
   inten[i] = (byte)((r + g + b) / 3);}
  由HIS到RGB的轉換類似,這裡省略了這些公式和C#實現的描述。
  4 小結
  數字圖像處理研究和軟件開發的重點在於算法,為了降低難度和提高效率,C#比較適合用來實現、驗證和開發這些算法。正如上面介紹的內存方法,把圖像復制到內存,直接對內存中的數據進行處理,運行速度也快,開發效率也高;通過驗證,算法正確而有效,也可以將其轉化為指針方法來滿足更高速度的要求(比如實時處理的要求)。
  參考文獻:
  [1] 龔聲蓉.數字圖像處理與分析[M].北京:清華大學出版社,2006.
  [2] 岡薩雷斯.數字圖像處理[M].北京:電子工業出版社,2009.

    

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved