[OpenCV] 產生色彩空間 (Create Color Space)
為了做研究,我必須製作整個色彩空間,想以RGB「立體」的方式來產生,然而只能以「平面」的方式顯示在螢幕上,於是我寫了三維映射到二維的程式來實現~
程式將會產生4096×4096的PNG(無損壓縮格式)檔案(8.07MB),不過為了節省我寶貴的部落格空間,我將影像縮小並轉存為1024×1024的JPG(有損壓縮格式)檔案(120KB)。有興趣的人就去跑我的程式來取得整個色彩空間圖吧:)~
為了做研究,我必須製作整個色彩空間,想以RGB「立體」的方式來產生,然而只能以「平面」的方式顯示在螢幕上,於是我寫了三維映射到二維的程式來實現~
程式將會產生4096×4096的PNG(無損壓縮格式)檔案(8.07MB),不過為了節省我寶貴的部落格空間,我將影像縮小並轉存為1024×1024的JPG(有損壓縮格式)檔案(120KB)。有興趣的人就去跑我的程式來取得整個色彩空間圖吧:)~
還記得從國小開始,一接觸影像檔案,其格式不是GIF就是JPEG,然而使用至今,一直都沒有特別去注意它的原理,實在可惜,既然因為研究接觸到影像壓縮格式,那我就簡潔地來瞭解JPEG的特色~所以什麼是JPEG?
我以為透過OpenCV轉換色彩空間,可以很輕易地來回轉換,而且不會有失真的問題。然而後來我知道,轉換色彩空間會有計算上精準度的問題(小問題),除此之外我又發現一個更容易失真的問題(大問題),其實對程式設計師而言相當容易發現才是,也就是:轉換色彩空間一個函式、儲存影像一個函式,後者失真程度遠大於前者!怎麼會這樣子呢?來看一下實驗結果……
在OpenCV使用函式就能很簡單地轉換色彩空間,然而我在這過程中發現一些差異性的問題,理論跟實際是有些許落差,這將影響我做研究的結果呢!
先前已寫過轉換色彩空間 (Transform Color Space),但那時沒有測試到Lab色彩空間。當前研究需要使用CIE L*a*b*色彩空間,於是再次實驗該程式碼,並有深入瞭解各色彩空間相互轉換的數學關係。
之前有研究CIE L*a*b*色彩空間,現在想更進一步探討RGB色彩空間轉換至CIE L*a*b*色彩空間。
一般影像在儲存像素的色彩時,使用RGB色彩空間來表示一個像素的顏色,這種表示方法可用來傳達一個像素的色彩在紅、綠、藍三個頻道(channel)中的相關性;但是,從RGB表示法無法得知像素的明亮度(luminance)、飽和度(saturation)及色相(hue)為何,因此,我們將像素的色彩由RGB色彩空間轉換至CIELAB(或CIE L*a*b*)。
一般我們螢幕是以RGB來衡量,而印刷是以CMYK來調整,然我們的眼睛可以用更精確的L*a*b* 色彩空間 (L*a*b* Color Space)來描述,但因為過於複雜而鮮少使用於日常生活。
一般日常所見的影像都是RGB色彩,然而想要分析影像有時需要轉換色彩空間,如HSV和YUV,原來OpenCV可以幫我做到!
從前有空沒事就在用影像處理軟體,很方便且輕易地按了「灰階」這個功能,軟體馬上就將影像轉換為灰階,因此會直覺以為轉換過程很簡單,直至今日,自己用OpenCV來實驗,才發覺有些細節,跟我們人的眼睛有關係。
剛好也可以來練習如何取得影像中像素RGB的值,知道這一點之後,即可拿RGB的值來做更進一步的運算,像是調整亮度、對比、r值、色相、彩度、明亮度,甚至透過統計來風格化。
很直覺地猜想,彩色轉灰接的過程應該是灰階=(紅+綠+藍)/3,其實不然。實際上人眼對綠色的亮度感最大,而對藍色最小,於是Gray = 0.299 * Red + 0.587 * Green + 0.114 * Blue才能得到比較適合人類眼睛的灰階影像,久而久之已成為影像處理界所用來彩色轉灰階的標準。
HappyMan・迴響