將彩色圖轉化為灰度圖及其原理介紹

mingupupup發表於2024-04-23

彩色圖介紹

彩色影像是一種包含顏色資訊的影像,通常由紅色、綠色和藍色(RGB)三個顏色通道組成。這三種顏色通道可以疊加在一起來形成各種不同的顏色。

彩色影像中的每個畫素都有三個數值,分別表示紅色、綠色和藍色通道的強度或亮度。這三個數值通常在0到255之間,其中0代表沒有該顏色通道的強度,255代表最高強度。

彩色影像的顏色資訊使得它們能夠更準確地表達真實世界中的顏色和場景,因此在許多應用中被廣泛使用。例如,彩色影像在攝影、電視、電影、計算機遊戲、計算機輔助設計(CAD)、醫學影像等領域都有重要的應用。

除了RGB顏色模型外,還有其他一些彩色影像的表示方式,如CMYK(青、品紅、黃、黑)、HSV(色調、飽和度、亮度)等。這些不同的表示方式適用於不同的應用場景,例如CMYK常用於印刷領域,而HSV常用於影像處理和計算機視覺中。

灰度圖介紹

灰度圖是一種只包含灰度資訊的影像,也稱為單通道影像。與彩色影像不同,灰度影像只有一個顏色通道,其中每個畫素的灰度值表示了該畫素的亮度水平。

在灰度影像中,每個畫素的灰度值通常在0到255之間,其中0代表黑色,255代表白色,其間的數值代表了不同程度的灰度或亮度。較小的灰度值通常表示較暗的顏色,而較大的灰度值表示較亮的顏色。

為什麼要轉化為灰度圖?

  1. 簡化處理:灰度影像只有一個顏色通道,相比於彩色影像的三個通道(紅、綠、藍),更容易處理和分析。這在一些計算機視覺和影像處理任務中是非常有用的,因為可以減少計算的複雜性。
  2. 降低資料量:灰度影像只需要一個位元組來表示一個畫素的亮度值,而彩色影像通常需要三個位元組。這意味著,在儲存和傳輸影像時,灰度影像所需的資料量更小,可以節省儲存空間和傳輸頻寬。
  3. 突出影像結構:有時候,我們更關心影像中的紋理、形狀和結構,而不是顏色資訊。轉換為灰度影像可以突出這些結構,使得一些影像處理任務(如邊緣檢測、特徵提取等)更加有效。
  4. 適應部分場景:在一些應用場景中,彩色資訊並不是必需的。例如,人臉識別中,大多數情況下只需要考慮人臉的形狀和紋理,而顏色資訊對於識別並不是必要的。

轉化為灰度圖的原理

將彩色影像轉換為灰度影像的常見方法之一是透過加權平均法(Weighted Average Method)或者簡單平均法(Simple Average Method)。這兩種方法都是基於RGB顏色模型的。

  1. 加權平均法

    加權平均法是將彩色影像中的每個畫素的RGB值按照一定的權重進行加權平均,然後得到對應的灰度值。通常使用的權重是基於人眼對不同顏色敏感度的調查結果來確定的。由於人眼對於綠色的敏感度最高,對紅色次之,對藍色最低,所以通常的權重設定是:

    • 紅色通道權重:0.299
    • 綠色通道權重:0.587
    • 藍色通道權重:0.114

    然後,對於每個畫素,將其RGB值分別乘以對應通道的權重,然後將三個乘積相加,得到灰度值。

    灰度值 = 0.299 * R + 0.587 * G + 0.114 * B

  2. 簡單平均法

    簡單平均法是將彩色影像中的每個畫素的RGB值的平均值作為灰度值。這種方法沒有考慮到人眼對不同顏色的敏感度,簡單地取了三個通道值的平均值作為灰度值。

    灰度值 = (R + G + B) / 3

使用加權平均法

C#程式碼示例:

 string imagePath = "測試圖片路徑";
 Bitmap original = new Bitmap(imagePath);
 Bitmap grayScale = new Bitmap(original.Width, original.Height);
 for (int y = 0; y < original.Height; y++)
 {
     for (int x = 0; x < original.Width; x++)
     {
         System.Drawing.Color originalColor = original.GetPixel(x, y);
         int grayScaleValue = (int)((originalColor.R * 0.299) + (originalColor.G * 0.587) + (originalColor.B * 0.114));
         System.Drawing.Color grayColor = System.Drawing.Color.FromArgb(grayScaleValue, grayScaleValue, grayScaleValue);
         grayScale.SetPixel(x, y, grayColor);
     }
 }
  grayScale.Save("儲存圖片路徑");

原圖如下所示:

image-20240423151922149

灰度圖如下所示:

image-20240423152112604

簡單平均法

C#程式碼示例:

string imagePath = "測試圖片路徑";
Bitmap original = new Bitmap(imagePath);
Bitmap grayScale = new Bitmap(original.Width, original.Height);
 for (int y = 0; y < original.Height; y++)
 {
     for (int x = 0; x < original.Width; x++)
     {
         System.Drawing.Color originalColor = original.GetPixel(x, y);
         int grayScaleValue = (int)((originalColor.R + originalColor.G + originalColor.B) / 3);
         System.Drawing.Color grayColor = System.Drawing.Color.FromArgb(grayScaleValue, grayScaleValue, grayScaleValue);
         grayScale.SetPixel(x, y, grayColor);
     }
 }
 grayScale.Save("儲存圖片路徑");

使用OpenCV

知道了什麼是灰度圖,為什麼要轉化為灰度圖以及轉化的原理之後,我們以後直接使用OpenCV提供的函式就好了。

  string imagePath = "測試圖片路徑";
  using (Mat src = new Mat(imagePath, ImreadModes.Color))
  {
      Cv2.ImShow("原圖", src);
      Cv2.WaitKey(0);

      using (Mat gray = new Mat())
      {
          Cv2.CvtColor(src, gray, ColorConversionCodes.BGR2GRAY);       
          Cv2.ImShow("灰度圖", gray);
          Cv2.WaitKey(0);

      }
  }                  

OpenCVSharp中將彩色圖轉化為灰度圖的函式:

 Cv2.CvtColor(src, gray, ColorConversionCodes.BGR2GRAY);

實現效果:

image-20240423152933363

總結

本文介紹了彩色圖與灰度圖,為什麼要轉化為灰度圖,及其轉化為灰度圖的原理,包含加權平均法與簡單平均法,在明白了原理之後,直接使用OpenCV中提供的函式進行影像灰度處理,希望對你有所幫助。

相關文章