2015年6月9日 星期二

色彩檢測

色彩檢測

色彩檢測

本文是學習筆記,記錄及延伸學習 Halcon 影像處理軟體之色彩辨識範例相關知識

前言

在計算機中,彩色數位影像有兩種類型,RGB 及 CMYK [1]。 RGB 彩色圖像是由 R (Red), G (Green), B (Blue) 三種顏色所組成。 CMYK 則是由 C (Cyan), M (Magenta), Y(Yellow), K (Black)。

這裡要講的是 RGB。

在 Halcon 中,將 RGB 彩色影像的每一個顏色分為 1 個 Channel, 你可以利用 Halcon 提供的運算子 decompose3,將一張彩色影像分為 R, G, B 三張獨立的影像。

好的,我們知道在彩色影像中,紅色,其 R, G, B 三個分別的數值表示為 255, 0, 0,我們記為 RGB (255, 0, 0), 綠色則是 RGB (0,255,0), 藍色則是 RGB(0,0,255)。

其中,每一個頻道的數值範圍為 0-255,數值越大,則表示該顏色越強。

說到這,那要如何作色彩辨識呢?

Halcon 範例提供的方式我分為兩大類,

  1. 將顏色作模型訓練,以此訓練模型來分辨顏色
  2. 將 RGB 色彩模型轉換為 HSV 模型[2],利用 Hue 的色度來分辨顏色

顏色模型訓練

Halcon 範例檔

  1. classify _ fuses _ gmm _ based _ lut.hdev
  2. color _ pieces.hdev
  3. color _ pieces _ euclid.hdev

其中,classify _ fuses _ gmm _ based _ lut.hdev 應用了 GMM classifier 來做色彩分類訓練,GMM 是 Gaussian Mixture Model 的縮寫,是單一高斯機率密函數的延伸,常應用在數位訊號的處理上。

處理流程就是

  1. 建立訓練模型
  2. 訓練模型進行訓練
  3. 建立顏色對照表
  4. 開始辨識

其餘 2 個訓練模型,color _ pieces.hdev 範例, 是應用 MLP (Multilayer Perceptron) 作為訓練模型。 ** color _ pieces _ euclid.hdev** 則是應用 Euclid 作為訓練模型

以我的電腦設備 (Intel Core i7-3667U) 執行範例檔,可以發現,classify _ fuses _ gmm _ based _ lut.hdev 範例 辨識一張 1024 * 768 的影像需要花費 2-4 ms。

RGB to HSV 色彩辨識

HSV (Hue, Saturation, Value; 色相,飽和度,明度亦即為亮度)。

色相就是基本的顏色,如紅色,黃色,綠色等, 0-360 [3]

飽和度是指色彩的純度,數值高則越純,0-100%

明度就是亮度,數值高則越亮,0-100%

Halcon 範例檔

  1. color _ fuse.hdev
  2. color _ simple.hdev

兩個範例都是先將 RGB 色彩模型轉換為 HSV 色彩模型,再以 Hue 色相進行色彩辨識

結論

兩種色彩辨識的效果都不錯,訓練模型的方式稍嫌麻煩,因為要先訓練; 而 Hue 辨識不用訓練模型,但要決定色相的區間,雖然有標準數據可參照 [3],但實際的影像受到光線,角度等因素影響,反應出來的色相值可能偏高或偏低,特別是顏色相近時,容易判別錯誤。

2015-06-10 補充

在色相中並無標示黑色及白色,那要如何識別呢? 此時,就要看明度了 [4] 的範例中,給定了一個黑與白的參考數值。

範例程式碼- 使用 C#

public string Classify(Color c)
{
    float hue = c.GetHue();
    float sat = c.GetSaturation();
    float lgt = c.GetLightness();

    if (lgt < 0.2)  return "Blacks";
    if (lgt > 0.8)  return "Whites";

    if (sat < 0.25) return "Grays";

    if (hue < 30)   return "Reds";
    if (hue < 90)   return "Yellows";
    if (hue < 150)  return "Greens";
    if (hue < 210)  return "Cyans";
    if (hue < 270)  return "Blues";
    if (hue < 330)  return "Magentas";
    return "Reds";
}

參考資料

[1] 數字圖像 - 維基百科

[2] HSV/HSL 色彩空間 - 維基百科

[3] 色相 - 維基百科

[4] How can I Classify Some Color To Color Ranges - Statckoverflow.com

沒有留言:

張貼留言