天天看點

數字圖像處理(2): 顔色空間/模型—— RGB, CMY/CMYK, HSI, HSV, YUV1 什麼是顔色2 顔色的數字化3 常見的顔色模型4 Python代碼示例參考資料

數字圖像處理(2): 顔色空間/模型—— RGB, CMY/CMYK, HSI, HSV, YUV1 什麼是顔色2 顔色的數字化3 常見的顔色模型4 Python代碼示例參考資料

目錄

1 什麼是顔色

2 顔色的數字化

3 常見的顔色模型

3.1 RGB 模型

3.2 CMY/CMYK 模型

3.3 HSI 模型

3.4 HSV 模型

3.5 HSB 模型

3.6 Lab 模型

3.7 YUV 模型

3.8 模型分類

4 Python代碼示例

參考資料

1 什麼是顔色

 顔色是通過眼、腦和我們的生活經驗所産生的對光的視覺感受,我們肉眼所見到的光線,是由波長範圍很窄的電磁波産生的,不同波長的電磁波表現為不同的顔色,對色彩的辨認是肉眼受到電磁波輻射能刺激後所引起的視覺神經感覺。

1666年,牛頓發現,當一束太陽光通過一個玻璃棱鏡時,顯示的光束不再是白光,而是由一端為紫色而另一端為紅色的連續色譜組成。如下圖所示,為白光通過棱鏡看到的色譜。

數字圖像處理(2): 顔色空間/模型—— RGB, CMY/CMYK, HSI, HSV, YUV1 什麼是顔色2 顔色的數字化3 常見的顔色模型4 Python代碼示例參考資料
數字圖像處理(2): 顔色空間/模型—— RGB, CMY/CMYK, HSI, HSV, YUV1 什麼是顔色2 顔色的數字化3 常見的顔色模型4 Python代碼示例參考資料

下圖是可見光電磁波譜的波長組成部分,我們能感受到的可見光的光譜範圍隻占電磁波的一小部分。

數字圖像處理(2): 顔色空間/模型—— RGB, CMY/CMYK, HSI, HSV, YUV1 什麼是顔色2 顔色的數字化3 常見的顔色模型4 Python代碼示例參考資料

2 顔色的數字化

隻需要標明三原色,并且對三原色進行量化,那就可以将人的顔色知覺量化為數字信号了。三色加法模型中,如果某一種顔色(C),和另外一種三色混合色,給人的感覺相同時,這三種顔色的份量就稱為該顔色(C)的三色刺激值。對于如何標明三原色、如何量化、如何确定刺激值等問題,國際上有一套标準——CIE标準色度學系統。

CIE(國際照明委員會)是位于歐洲的一個國際學術研究機構,1931年,CIE(Commission International Eclairage)在會議上根據之前的實驗成果提出了一個标準——CIE1931-RGB标準色度系統。

CIE1931-RGB系統選擇了700nm(R) 546.1nm(G) 435.8nm(B) 三種波長的單色光作為三原色。之是以選這三種顔色是因為比較容易精确地産生出來(汞弧光譜濾波産生,色度穩定準确)。

數字圖像處理(2): 顔色空間/模型—— RGB, CMY/CMYK, HSI, HSV, YUV1 什麼是顔色2 顔色的數字化3 常見的顔色模型4 Python代碼示例參考資料

從上圖可以看到,三個顔色的刺激值R、G、B如何構成某一種顔色:例如580nm左右(紅綠線交叉點)的黃色光,可以用1:1(經過亮度換算..)的紅綠兩種原色混合來模拟。

如果要根據三個刺激值R、G、B來表現可視顔色,繪制的可視圖形需要是三維的。為了能在二維平面上表現顔色空間,這裡需要做一些轉換。顔色的概念可以分為兩部分:亮度(光的振幅,即明暗程度)、色度(光的波長組合,即具體某種顔色)。我們将光的亮度(Y)變量分離出來,之後用比例來表示三色刺激值:這樣就能得出r+g+b=1。由此可見,色度坐标r、g、b中隻有兩個變量是獨立的。這樣我們就把刺激值R、G、B轉換成r、g、Y(亮度)三個值,把r、g兩個值繪制到二維空間得到的圖就是色域圖。

數字圖像處理(2): 顔色空間/模型—— RGB, CMY/CMYK, HSI, HSV, YUV1 什麼是顔色2 顔色的數字化3 常見的顔色模型4 Python代碼示例參考資料

上圖中,馬蹄形曲線就表示單色的光譜(即光譜軌迹)。例如540nm的單色光,可以看到由r=0、g=1、b=(1-r-g)=0三個原色的分量組成。再例如380-540nm波段的單色光,由于顔色比對實驗結果中紅色存在負值的原因,該段色域落在了r軸的負區間内。自然界中,人眼可分辨的顔色,都落在光譜曲線包圍的範圍内。

CIE1931-RGB标準是根據實驗結果制定的,出現的負值在計算和轉換時非常不便。CIE假定人對色彩的感覺是線性的,是以對上面的r-g色域圖進行了線性變換,将可見光色域變換到正數區域内。CIE在CIE1931-RGB色域中選擇了一個三角形,該三角形覆寫了所有可見色域,之後将該三角形進行如下的線性變換,将可見色域變換到(0,0)(0,1)(1,0)的正數區域内。即假想出三原色X、Y、Z,它們不存在于自然界中,但更友善計算。

數字圖像處理(2): 顔色空間/模型—— RGB, CMY/CMYK, HSI, HSV, YUV1 什麼是顔色2 顔色的數字化3 常見的顔色模型4 Python代碼示例參考資料

該色度圖所示意的顔色包含了一般人可見的所有顔色,即人類視覺的色域。色域的馬蹄形弧線邊界對應自然界中的單色光。色域下方直線的邊界隻能由多種單色光混合成。

在該圖中任意標明兩點,兩點間直線上的顔色可由這兩點的顔色混合成。給定三個點,三點構成的三角形内顔色可由這三個點顔色混合成。

給定三個真實光源,混合得出的色域隻能是三角形(例如液晶顯示器的評測結果),絕對不可能完全覆寫人類視覺色域。

這就是CIE1931-XYZ标準色度學系統。該系統是國際上色度計算、顔色測量和顔色表征的統一标準,是幾乎所有測色儀器的設計與制造依據。

3 常見的顔色模型

顔色模型就是描述用一組數值來描述顔色的數學模型。例如coding時最常見的RGB模型,就是用RGB三個數值來描述顔色。通常顔色模型分為兩類:裝置相關和裝置無關。

裝置無關的顔色模型:這類顔色模型是基于人眼對色彩感覺的度量建立的數學模型,例如上面提到的CIE-RGB、CIE-XYZ顔色模型,再比如由此衍生的CIE-xyY、CIE-Luv、CIE-Lab等顔色模型。這些顔色模型主要用于計算和測量。

裝置相關的顔色模型:以最長見的RGB模型為例,一組确定的RGB數值,在一個液晶屏上顯示,最終會作用到三色LED的電壓上。這樣一組值在不同裝置上解釋時,得到的顔色可能并不相同。再比如CMYK模型需要依賴列印裝置解釋。常見的裝置相關模型有:RGB、CMYK、YUV、HSL、HSB(HSV)、YCbCr等。這類顔色模型主要用于裝置顯示、資料傳輸等。

3.1 RGB 模型

RGB(Red, Green, Blue)顔色空間最常用的用途就是顯示器系統,彩色陰極射線管,彩色光栅圖形的顯示器 都使用R、G、B數值來驅動R、G、B 電子槍發射電子,并分别激發熒光屏上的R、G、B三種顔色的熒光粉 發出不同亮度的光線,并通過相加混合産生各種顔色;掃描器也是通過吸收原稿經反射或透射而發送來 的光線中的R、G、B成分,并用它來表示原稿的顔色。RGB色彩空間稱為與裝置相關的色彩空間,因為不同 的掃描器掃描同一幅圖像,會得到不同色彩的圖像資料;不同型号的顯示器顯示同一幅圖像,也會有不同 的色彩顯示結果。顯示器和掃描器使用的RGB空間與CIE 1931 RGB真實三原色表色系統空間是不同的,後者 是與裝置無關的顔色空間。btw:Photoshop的色彩選取器(Color Picker)。可以顯示HSB、RGB、LAB和CMYK 色彩空間的每一種顔色的色彩值。

RGB模型表示的圖像由3個分量圖像組成,每種原色一幅分量圖像。當送入RGB螢幕時,這3幅圖像在螢幕上混合生成一幅合成的彩色圖像。考慮一幅RGB圖像,其中每一幅圖紅綠藍圖像都是一幅8比特圖像。在這種情況下,可以說每個RGB彩色像素有24比特的深度。在24比特RGB圖像中,顔色總數是

數字圖像處理(2): 顔色空間/模型—— RGB, CMY/CMYK, HSI, HSV, YUV1 什麼是顔色2 顔色的數字化3 常見的顔色模型4 Python代碼示例參考資料

。下圖為分别為RGB彩色立方體示意圖 和 對應的RGB24比特彩色立方體。

數字圖像處理(2): 顔色空間/模型—— RGB, CMY/CMYK, HSI, HSV, YUV1 什麼是顔色2 顔色的數字化3 常見的顔色模型4 Python代碼示例參考資料
數字圖像處理(2): 顔色空間/模型—— RGB, CMY/CMYK, HSI, HSV, YUV1 什麼是顔色2 顔色的數字化3 常見的顔色模型4 Python代碼示例參考資料

3.2 CMY/CMYK 模型

大多數在紙上沉積彩色顔料的裝置,如彩色列印機和影印機,要求輸入CMY(Cyan, Magenta,Yellow)資料或在内部進行RGB到CMY的轉換。這一轉換是使用下面的式子進行的:

數字圖像處理(2): 顔色空間/模型—— RGB, CMY/CMYK, HSI, HSV, YUV1 什麼是顔色2 顔色的數字化3 常見的顔色模型4 Python代碼示例參考資料

注意:上式表明塗有青色顔料的表面所反射的光中不包含紅色(C-1-R)。類似的,純深紅色不反射綠色,純黃色不反射藍色。其實,RGB值可以很容易通過1減去CMY值得到。在實際圖像進行中,這種彩色模型主要用于産生硬拷貝輸出,依次從CMY到RGB的反向操作通常沒有實際意義。在實際應用中,黑色可以直接擷取,不需要從三原色合成,并且合成的黑色也不純。是以為了生成真正的黑色,加入了黑色——CMYK模型。畢竟黑白列印較多,直接使用黑色原料不僅成本少,而且顔色比較純。

CMYK(Cyan, Magenta,Yellow, blacK)顔色空間應用于印刷工業,印刷業通過青(C)、品(M)、黃(Y)三原色油墨的不同 網點面積率的疊印來表現豐富多彩的顔色和階調,這便是三原色的CMY顔色空間。實際印刷中,一般采用青 (C)、品(M)、黃(Y)、黑(BK)四色印刷,在印刷的中間調至暗調增加黑版。當紅綠藍三原色被混合時,會産生 白色,但是當混合藍綠色、紫紅色和黃色三原色時會産生黑色。既然實際用的墨水并不會産生純正的顔色, 黑色是包括在分開的顔色,而這模型稱之為CMYK。CMYK顔色空間是和裝置或者是印刷過程相關的,則工藝方法、 油墨的特性、紙張的特性等,不同的條件有不同的印刷結果。是以CMYK顔色空間稱為與裝置有關的表色空間。 而且,CMYK具有多值性,也就是說對同一種具有相同絕對色度的顔色,在相同的印刷過程前提下,可以用分種 CMYK數字組合來表示和印刷出來。這種特性給顔色管理帶來了很多麻煩,同樣也給控制帶來了很多的靈活性。 在印刷過程中,必然要經過一個分色的過程,所謂分色就是将計算機中使 用的RGB顔色轉換成印刷使用的CMYK 顔色。在轉換過程中存在着兩個複雜的問題,其一是這兩個顔色空間在表現顔色的範圍上不完全一樣,RGB的 色域較大而CMYK則較小,是以就要進行色域壓縮;其二是這兩個顔色都是和具體的裝置相關的,顔色本身沒有 絕對性。是以就需要通過一個與裝置無關的顔色空間來進行轉換,即可以通過以上介紹的XYZ或LAB色空間來 進行轉換。

3.3 HSI 模型

RGB系統與人眼強烈感覺紅綠藍三原色的事實能很好地比對。但RGB模型和CMY/CMYK模型不能很好地适應實際上人解釋的顔色。所有引出HIS模型。

HSI (Hue, Saturation, Intensity )模型是從人的視覺系統出發,用色調(Hue)、色飽和度(Saturation)和亮度 (Intensity)來描述色彩。色調是描述純色(純黃色、純橙色或純紅色)的顔色屬性。飽和度是一種純色被白光稀釋的程度的度量。亮度是一個主觀描述子,展現無色的強度概念。HIS模型開發基于彩色描述的圖像處理算法的理想工具,這種描述對人來說是自然且直覺的,畢竟人才是這些算法的開發者和使用中者,怎麼舒服怎麼來。

HSI色彩空間可以用一個圓錐空間模型來描述,如下圖所示。色彩空間的圓錐模型相當複雜,但确能把色調、亮度和色飽和度的變化情形表現得很清楚。在HSI色彩空間可以大大簡化圖像分析 和處理的工作量。HSI色彩空間和RGB色彩空間隻是同一實體量的不同表示法,因而它們之間存在着轉換關系。

數字圖像處理(2): 顔色空間/模型—— RGB, CMY/CMYK, HSI, HSV, YUV1 什麼是顔色2 顔色的數字化3 常見的顔色模型4 Python代碼示例參考資料

從RGB到HSI的彩色轉換

給定一幅RGB彩色圖像,每個RGB像素的H分量,S分量和I分量計算方式如下:

數字圖像處理(2): 顔色空間/模型—— RGB, CMY/CMYK, HSI, HSV, YUV1 什麼是顔色2 顔色的數字化3 常見的顔色模型4 Python代碼示例參考資料

3.4 HSV 模型

HSV(Hue, Saturation, Value)模型比HSI模型更與人類對顔色的感覺接近。H代表色調,S代表飽和度,V代表亮度值。HSV模型的坐标系統可以是圓柱坐标系統,但一般用六棱錐來表示,如下圖所示,與HSI模型比較相似。可以通過比較HSI、HSV與RGB空間的轉換公式,來比較HSI與HSV的差別。

數字圖像處理(2): 顔色空間/模型—— RGB, CMY/CMYK, HSI, HSV, YUV1 什麼是顔色2 顔色的數字化3 常見的顔色模型4 Python代碼示例參考資料

RGB空間轉換HSV空間

數字圖像處理(2): 顔色空間/模型—— RGB, CMY/CMYK, HSI, HSV, YUV1 什麼是顔色2 顔色的數字化3 常見的顔色模型4 Python代碼示例參考資料

3.5 HSB 模型

HSB(Hue, Saturation, Brightness)模型的基礎是對立色理論,對立色理論源于人們對對立色調(紅和綠、黃和藍)的觀察事實(對立色調的顔色疊加,它們會互相抵消)。HSB模型是普及型設計軟體中常見的色彩模式,其中H代表色相;S代表飽和度;B代表亮度。HSB模型的如下圖所示:

數字圖像處理(2): 顔色空間/模型—— RGB, CMY/CMYK, HSI, HSV, YUV1 什麼是顔色2 顔色的數字化3 常見的顔色模型4 Python代碼示例參考資料

色調H(Hue):在0~360°的标準色環上,按照角度值辨別。比如紅是0°、橙色是30°等。

飽和度S( Saturation ):是指顔色的強度或純度。飽和度表示色相中彩色成分所占的比例,用從0%(灰色)~100%(完全飽和)的百分比來度量。在色立面上飽和度是從左向右逐漸增加的,左邊線為0%,右邊線為100%。

亮度B( Brightness ):是顔色的明暗程度,通常是從0(黑)~100%(白)的百分比來度量的,在色立面中從上至下逐漸遞減,上邊線為100%,下邊線為0% 。

3.6 Lab 模型

同RGB顔色空間相比,Lab(Commission International EclairageLab)是一種不常用的色彩空間。它是在1931年國際照明委員會(Commission International Eclairage, CIE)制定的顔色度量國際标準的基礎上建立起來的。1976年,經修改後被正式命名為CIELab。它是一種裝置無關的顔色系統,也是一種基于生理特征的顔色系統。這也就意味着,它是用數字化的方法來描述人的視覺感應。Lab顔色空間中的L分量用于表示像素的亮度,取值範圍是[0,100],表示從純黑到純白;a表示從紅色到綠色的範圍,取值範圍是[127,-128];b表示從黃色到藍色的範圍,取值範圍是[127,-128]。下圖所示為Lab顔色空間的圖示:

數字圖像處理(2): 顔色空間/模型—— RGB, CMY/CMYK, HSI, HSV, YUV1 什麼是顔色2 顔色的數字化3 常見的顔色模型4 Python代碼示例參考資料

Lab顔色空間比計算機顯示器、列印機甚至比人類視覺的色域都要大,表示為 Lab 的位圖比 RGB 或 CMYK 位圖獲得同樣的精度要求更多的每像素資料。雖然我們在生活中使用RGB顔色空間更多一些,但也并非Lab顔色空間真的一無所有。例如,在 Adobe Photoshop圖像處理軟體中,TIFF格式檔案中,PDF文檔中,都可以見到Lab顔色空間的身影。而在計算機視覺中,尤其是顔色識别相關的算法設計中,rgb,hsv,lab顔色空間混用更是常用的方法。

3.7 YUV 模型

YUV,是一種顔色編碼方法。常使用在各個視訊處理元件中。 YUV在對照片或視訊編碼時,考慮到人類的感覺能力,允許降低色度的帶寬。YUV是編譯true-color顔色空間(color space)的種類,Y'UV, YUV, YCbCr,YPbPr等專有名詞都可以稱為YUV,彼此有重疊。“Y”表示明亮度(Luminance、Luma),“U”和“V”則是色度、濃度(Chrominance、Chroma)。

在現代彩色電視系統中,通常采用三管彩色錄影機或彩色CCD(點耦合器件)錄影機,它把攝得的彩色圖像 信号,經分色、分别放大校正得到RGB,再經過矩陣變換電路得到亮度信号Y和兩個色差信号R-Y、B-Y, 最後發送端将亮度和色差三個信号分别進行編碼,用同一信道發送出去。這就是我們常用的YUV色彩空間。 采用YUV色彩空間的重要性是它的亮度信号Y和色度信号U、V是分離的。如果隻有Y信号分量而沒有U、V分量, 那麼這樣表示的圖就是黑白灰階圖。彩色電視采用YUV空間正是為了用亮度信号Y解決彩色電視機與黑白電視機 的相容問題,使黑白電視機也能接收彩色信号。根據美國國家電視制式委員會,NTSC制式的标準,當白光的 亮度用Y來表示時,它和紅、綠、藍三色光的關系可用如下式的方程描述:Y=0.3R+0.59G+0.11B 這就是常用 的亮度公式。色差U、V是由B-Y、R-Y按不同比例壓縮而成的。如果要由YUV空間轉化成RGB空間,隻要進行 相反的逆運算即可。與YUV色彩空間類似的還有Lab色彩空間,它也是用亮度和色差來描述色彩分量,其中L為 亮度、a和b分别為各色差分量。

RGB空間轉換YUV空間

數字圖像處理(2): 顔色空間/模型—— RGB, CMY/CMYK, HSI, HSV, YUV1 什麼是顔色2 顔色的數字化3 常見的顔色模型4 Python代碼示例參考資料

3.8 模型分類

為了使用顔色空間,首先應該了解各種顔色空間的特性。顔色空間的分類有多種方法。

(1)按使用類别分類

彩色色度學模型:CIE-RGB、CIE-XYZ、均勻色差彩色模型(CIE 1976Luv和CIE Lab)

工業彩色模型:RGB彩色顯示模型、CMYK彩色印制模型、彩色傳輸模型YUV(PAL)、YIQ(NTSC)、YCrCb(數字高清晰度電視)

視覺彩色模型:HVC(孟賽爾)、HSB(Photoshop)、HLS(Windows畫圖和Apple Color Picker)、HSI(圖像分割)、HSY(電視)、Ohta(圖像分割)等。

(2)按顔色感覺分類

混合顔色模型:按3種基色的比例混合而成的顔色。RGB、CMYK、XYZ等

非線形亮度/色度顔色模型:用一個分量表示非色彩的感覺,用兩個分量表示色彩的感覺,這兩個分量都是色差屬性。Lab、Luv、YUV、YIQ等。

強度/飽和度/色調模型:用強度描述亮度或灰階等光強的感覺,用飽和度和色調描述色彩的感覺,這兩個分量接近人眼對顔色的感覺。如HIS、HSL、HSV、LCH等

4 Python代碼示例

在日常生活中,我們看到的大多數彩色圖像都是RGB類型,但是在圖像處理過程中,常常需要用到灰階圖像、二值圖像、HSV、HSI等顔色,OpenCV提供了 cvtColor() 函數實作這些功能。

OpenCV中 cvtColor() 函數形式如下所示:

dst = cv2.cvtColor(src, code[, dst[, dstCn]])

其中,參數:

src 表示輸入圖像,需要進行顔色空間變換的原圖像;

dst 表示輸出圖像,其大小和深度與src一緻;

code 表示轉換的代碼或辨別;

dstCn 表示目标圖像通道數,其值為0時,則有src和code決定。

cvtColor() 函數的作用是将一個圖像從一個顔色空間轉換到另一個顔色空間,其中,RGB是指Red、Green和Blue,一幅圖像由這三個通道(channel)構成;Gray表示隻有灰階值一個通道;HSV包含Hue(色調)、Saturation(飽和度)和Value(亮度)三個通道。在OpenCV中,常見的顔色空間轉換辨別包括CV_BGR2BGRA、CV_RGB2GRAY、CV_GRAY2RGB、CV_BGR2HSV、CV_BGR2XYZ、CV_BGR2HLS等。

下面是調用 cvtColor() 函數将圖像顔色空間轉換(BGR、RGB、GRAY、HSV、YCrCb、HLS、XYZ、LAB 和 YUV)

Python代碼如下所示:

#encoding:utf-8
import cv2
import numpy as np
import matplotlib.pyplot as plt

#讀取原始圖像
img_BGR = cv2.imread('zxp.jpg')

#BGR轉換為RGB
img_RGB = cv2.cvtColor(img_BGR, cv2.COLOR_BGR2RGB)

#灰階化處理
img_GRAY = cv2.cvtColor(img_BGR, cv2.COLOR_BGR2GRAY)

#BGR轉HSV
img_HSV = cv2.cvtColor(img_BGR, cv2.COLOR_BGR2HSV)

#BGR轉YCrCb
img_YCrCb = cv2.cvtColor(img_BGR, cv2.COLOR_BGR2YCrCb)

#BGR轉HLS
img_HLS = cv2.cvtColor(img_BGR, cv2.COLOR_BGR2HLS)

#BGR轉XYZ
img_XYZ = cv2.cvtColor(img_BGR, cv2.COLOR_BGR2XYZ)

#BGR轉LAB
img_LAB = cv2.cvtColor(img_BGR, cv2.COLOR_BGR2LAB)

#BGR轉YUV
img_YUV = cv2.cvtColor(img_BGR, cv2.COLOR_BGR2YUV)

#調用matplotlib顯示處理結果
titles = ['BGR', 'RGB', 'GRAY', 'HSV', 'YCrCb', 'HLS', 'XYZ', 'LAB', 'YUV']
images = [img_BGR, img_RGB, img_GRAY, img_HSV, img_YCrCb,
          img_HLS, img_XYZ, img_LAB, img_YUV]
for i in range(9):
   plt.subplot(3, 3, i+1), plt.imshow(images[i], 'gray')
   plt.title(titles[i])
   plt.xticks([]),plt.yticks([])
plt.show()

cv2.waitKey(0)
cv2.destroyAllWindows()
           

運作結果如下圖所示:

數字圖像處理(2): 顔色空間/模型—— RGB, CMY/CMYK, HSI, HSV, YUV1 什麼是顔色2 顔色的數字化3 常見的顔色模型4 Python代碼示例參考資料

參考資料

[1] https://blog.csdn.net/qq_34106574/article/details/80733067

[2] https://blog.csdn.net/skyereeee/article/details/7265415

[3] https://blog.csdn.net/u012507022/article/details/51523385

[4] 岡薩雷斯. 數字圖像處理(第三版) 

繼續閱讀