2014年6月3日 星期二

RGB轉HSI及膚色偵測

RGB顏色空間轉HSI

全彩呈現的圖片可以以很多種形式表現,像是現在要談的RGB和HSI,另外還有CMY等等…。
那麼,這麼多形式的顏色空間有什麼用呢?



RGB

光的三原色:紅、綠、藍(R, G, B)就是這個顏色空間的命名,當人眼看到電腦螢幕所產生的色彩,其實就是將紅光綠光和藍光以不同比例混合出來的結果;以頻譜的角度去看,就是不同波長的電磁波之混合效果。
所以當螢幕產生色光時,只要用這種顏色空間的呈現方式將不同比例的紅綠藍光混合起來,就可以達到效果了!

HSI

既然光可以用RGB去呈現,又為何要有HSI這種表現方式呢?試想你要取出某一個顏色區段,要將紅光上下調整還是綠光上下調整?又或是想知道比較明亮和昏暗的區域,此時就會需要HSI!

H(Hue)─彩度:簡單來說,就是將RGB三種光以漸層的方式分布在0度(R)、120度(G)、240度(B)而形成一個圓形,從[0, 360)的角度當中隨便取一個角度就是某一個顏色,下面是RGB轉彩度的公式

S(Saturation)─飽和度:可以說是光線的純度,譬如說紅光(255, 0, 0)、黃光(255, 255, 0)沒有參雜白光(三種光RGB都有數值)的光,飽和度就是滿的


I(Intensity)─亮度:顧名思義,就是色彩明亮的程度

根據以上三個公式,就可以實做出RGB轉HSI的程式。

原圖

Hue

Saturation

Intensity

用這張圖片做出來的Hue(彩度)分離圖,乍看之下殘破不堪很像是做錯了,所以我拿了其他圖片測試:

原圖

Hue(彩度)

從這張圖片就可以看得出紅色部分確實是由灰階呈現0度(黑色)到藍色部分240度(偏白色)。

膚色偵測

在膚色偵測的實做當中,我只採取最簡單的方式─取出膚色range。
根據一些統計資料,膚色的彩度值大約從16度到34度,所以我將輸入的圖片轉換成Hue的顏色空間之後,在取這個範圍的圖片像素設成白色,其他設成黑色,最後就會有以下結果。

原圖

膚色偵測

可以大致上看到,照片中的人臉和手臂皮膚的部分都被偵測出來,但是樓梯的扶手也意外被錯誤納入膚色。







沒有留言:

張貼留言