什么是顏色
Wiki是這樣說的:顏色或色彩是通過眼、腦和我們的生活經(jīng)驗(yàn)所產(chǎn)生的一種對光的視覺效應(yīng)。嗯,簡單點(diǎn)說,顏色就是人對光的一種感覺,由大腦產(chǎn)生的一種感覺。感覺是一個很主觀的東西,你怎么確定你看到的紅色和我看到的是一樣的呢?這個視頻解釋的很不錯。我們需要先假設(shè)正常人對于同一種光產(chǎn)生的感覺基本是一致的,討論才能繼續(xù)下去。
人的視網(wǎng)膜上布滿了感光細(xì)胞,當(dāng)有光線傳入人眼時,這些細(xì)胞就會將刺激轉(zhuǎn)化為視神經(jīng)的電信號,最終在大腦得到解釋。視網(wǎng)膜上有兩類感光細(xì)胞:視錐細(xì)胞和視桿細(xì)胞。
視錐細(xì)胞大都集中在視網(wǎng)膜的中央,每個視網(wǎng)膜大概有700萬個左右。每個視錐細(xì)胞包含有一種感光色素,分別對紅、綠、藍(lán)三種光敏感。這類細(xì)胞能在較明亮的環(huán)境中提供辨別顏色和形成精細(xì)視覺的功能。
視桿細(xì)胞分散分布在視網(wǎng)膜上,每個視網(wǎng)膜大概有1億個以上。這類細(xì)胞對光線更為敏感(敏感程度是視錐細(xì)胞的100多倍),一個光子就足以激發(fā)它的活動。視桿細(xì)胞不能感受顏色、分辨精細(xì)的空間,但在較弱的光線下可以提供對環(huán)境的分辨能力(比如夜里看到物體的黑白輪廓)。
當(dāng)一束光線進(jìn)入人眼后,視細(xì)胞會產(chǎn)生4個不同強(qiáng)度的信號:三種視錐細(xì)胞的信號(紅綠藍(lán))和視感細(xì)胞的信號。這其中,只有視錐細(xì)胞產(chǎn)生的信號能轉(zhuǎn)化為顏色的感覺。三種視錐細(xì)胞(S、M和L類型)對波長長度不同的光線會有不同的反應(yīng),每種細(xì)胞對某一段波長的光會更加敏感,如下圖。這些信號的組合就是人眼能分辨的顏色總和。
三種視錐細(xì)胞(S、M和L類型)對單色光譜刺激的反應(yīng)
( 橫坐標(biāo)為光的波長,縱坐標(biāo)為產(chǎn)生信號的強(qiáng)度)
能夠引起視錐細(xì)胞活動的光波長范圍 :312.3nm至745.4mn(可見光)
這里有一個重要的理論:我們可以用3種精心選擇的單色光來刺激視錐細(xì)胞,模擬出人眼所能感知的幾乎所有的顏色(例如紅綠光的混合光,和單色黃光,刺激視錐細(xì)胞產(chǎn)生的視神經(jīng)信號是等效的),這就是三色加法模型。所以說"三原色"的原理是由生理因素造成的。
顏色的數(shù)字化
根據(jù)上面的理論,只需要選定三原色,并且對三原色進(jìn)行量化,那就可以將人的顏色知覺量化為數(shù)字信號了。三色加法模型中,如果某一種顏色(C),和另外一種三色混合色,給人的感覺相同時,這三種顏色的份量就稱為該顏色(C)的三色刺激值。對于如何選定三原色、如何量化、如何確定刺激值等問題,國際上有一套標(biāo)準(zhǔn)——CIE標(biāo)準(zhǔn)色度學(xué)系統(tǒng)。
CIE(國際照明委員會)是位于歐洲的一個國際學(xué)術(shù)研究機(jī)構(gòu),1931年,CIE在會議上根據(jù)之前的實(shí)驗(yàn)成果提出了一個標(biāo)準(zhǔn)——CIE1931-RGB標(biāo)準(zhǔn)色度系統(tǒng)。
CIE1931-RGB系統(tǒng)選擇了700nm(R) 546.1nm(G) 435.8nm(B) 三種波長的單色光作為三原色。之所以選這三種顏色是因?yàn)楸容^容易精確地產(chǎn)生出來(汞弧光譜濾波產(chǎn)生,色度穩(wěn)定準(zhǔn)確)。
CIE1931-RGB 三刺激值曲線,根據(jù)人類視覺實(shí)驗(yàn)結(jié)果繪制。
從上圖可以看到,三個顏色的刺激值R、G、B如何構(gòu)成某一種顏色:例如580nm左右(紅綠線交叉點(diǎn))的黃色光,可以用1:1(經(jīng)過亮度換算..)的紅綠兩種原色混合來模擬。
CIE所做顏色匹配實(shí)驗(yàn)的原理圖
注意上面的曲線坐標(biāo)有一部分是負(fù)值,這是由顏色匹配實(shí)驗(yàn)產(chǎn)生的。如上圖,有些光譜色(左邊)用三原色(右邊)來匹配時,無論怎樣調(diào)節(jié)三原色,都不能使兩個視場達(dá)到匹配,必須在光譜色(左邊)添加適量的原色才行。這就是上面刺激值曲線中,紅色出現(xiàn)一部分負(fù)值的原因。
如果要根據(jù)三個刺激值R、G、B來表現(xiàn)可視顏色,繪制的可視圖形需要是三維的。為了能在二維平面上表現(xiàn)顏色空間,這里需要做一些轉(zhuǎn)換。顏色的概念可以分為兩部分:亮度(光的振幅,即明暗程度)、色度(光的波長組合,即具體某種顏色)。我們將光的亮度(Y)變量分離出來,之后用比例來表示三色刺激值:
這樣就能得出r+g+b=1。由此可見,色度坐標(biāo)r、g、b中只有兩個變量是獨(dú)立的。這樣我們就把刺激值R、G、B轉(zhuǎn)換成r、g、Y(亮度)三個值,把r、g兩個值繪制到二維空間得到的圖就是色域圖。
根據(jù)CIE1931-RGB模型繪制的rg色度圖
上圖中,馬蹄形曲線就表示單色的光譜(即光譜軌跡)。例如540nm的單色光,可以看到由r=0、g=1、b=(1-r-g)=0三個原色的分量組成。再例如380-540nm波段的單色光,由于顏色匹配實(shí)驗(yàn)結(jié)果中紅色存在負(fù)值的原因,該段色域落在了r軸的負(fù)區(qū)間內(nèi)。自然界中,人眼可分辨的顏色,都落在光譜曲線包圍的范圍內(nèi)。
CIE1931-RGB標(biāo)準(zhǔn)是根據(jù)實(shí)驗(yàn)結(jié)果制定的,出現(xiàn)的負(fù)值在計(jì)算和轉(zhuǎn)換時非常不便。CIE假定人對色彩的感知是線性的,因此對上面的r-g色域圖進(jìn)行了線性變換,將可見光色域變換到正數(shù)區(qū)域內(nèi)。CIE在CIE1931-RGB色域中選擇了一個三角形,該三角形覆蓋了所有可見色域,之后將該三角形進(jìn)行如下的線性變換,將可見色域變換到(0,0)(0,1)(1,0)的正數(shù)區(qū)域內(nèi)。即假想出三原色X、Y、Z,它們不存在于自然界中,但更方便計(jì)算。
得到的結(jié)果就是下圖:
CIE1931-XYZ色度圖
注意這里的顏色只是示意,事實(shí)上沒有設(shè)備能完全還上面所有的自然色域
這個圖有些有意思的性質(zhì):
該色度圖所示意的顏色包含了一般人可見的所有顏色,即人類視覺的色域。色域的馬蹄形弧線邊界對應(yīng)自然界中的單色光。色域下方直線的邊界只能由多種單色光混合成。
在該圖中任意選定兩點(diǎn),兩點(diǎn)間直線上的顏色可由這兩點(diǎn)的顏色混合成。給定三個點(diǎn),三點(diǎn)構(gòu)成的三角形內(nèi)顏色可由這三個點(diǎn)顏色混合成。
給定三個真實(shí)光源,混合得出的色域只能是三角形(例如液晶顯示器的評測結(jié)果),絕對不可能完全覆蓋人類視覺色域。
這就是CIE1931-XYZ標(biāo)準(zhǔn)色度學(xué)系統(tǒng)。該系統(tǒng)是國際上色度計(jì)算、顏色測量和顏色表征的統(tǒng)一標(biāo)準(zhǔn),是幾乎所有測色儀器的設(shè)計(jì)與制造依據(jù)。
常見顏色模型
顏色模型就是描述用一組數(shù)值來描述顏色的數(shù)學(xué)模型。例如coding時最常見的RGB模型,就是用RGB三個數(shù)值來描述顏色。通常顏色模型分為兩類:設(shè)備相關(guān)和設(shè)備無關(guān)。
設(shè)備無關(guān)的顏色模型:這類顏色模型是基于人眼對色彩感知的度量建立的數(shù)學(xué)模型,例如上面提到的CIE-RGB、CIE-XYZ顏色模型,再比如由此衍生的CIE-xyY、CIE-L*u*v、CIE-L*a*b等顏色模型。這些顏色模型主要用于計(jì)算和測量。
設(shè)備相關(guān)的顏色模型:以最長見的RGB模型為例,一組確定的RGB數(shù)值,在一個液晶屏上顯示,最終會作用到三色LED的電壓上。這樣一組值在不同設(shè)備上解釋時,得到的顏色可能并不相同。再比如CMYK模型需要依賴打印設(shè)備解釋。常見的設(shè)備相關(guān)模型有:RGB、CMYK、YUV、HSL、HSB(HSV)、YCbCr等。這類顏色模型主要用于設(shè)備顯示、數(shù)據(jù)傳輸?shù)取?/p>
下面就對這些顏色模型一一作出解釋。
CIE-RGB
正如上面寫的,這個模型是由真實(shí)的人眼顏色匹配實(shí)驗(yàn)得出的模型,RGB分別表示那三個固定波長的光的份量。
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?CIE-RGB立體色域
CIE-XYZ
上面也有,就是根據(jù)CIE-RGB進(jìn)行變換得到的顏色模型,XYZ分別表示三個假想色的光的份量。通常簡寫為XYZ顏色模型。
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?CIE-XYZ的立體色域
CIE-Yxy
該模型由CIE-XYZ衍生得來。其中,, Yxy中的Y表示光的亮度。這個模型投影到x-y平面上即上面的CIE1931-XYZ色度圖。其中x、y分量的取值范圍是[0,1]。有時該模型也被稱作CIE-xyY。

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? CIE-xyY立體色域
CIE-L*u*v* 和 CIE-L*a*b*
CIE1931-XYZ的模型沒有給出測量兩個顏色差距(色差)的方法,顏色差距在色度圖上也是不均勻的。因此CIE基于CIE-XYZ進(jìn)行非線性壓縮,設(shè)計(jì)了能在色度圖上直接測量色差的均勻色度圖,叫做CIE UCS色度圖(1960和1976各有一版),旨在將色彩均勻化。
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?CIE1976 UCS(uniform chromaticity scale) 色度圖
根據(jù)CIE UCS色度圖,CIE建立了CIE1976-L*u*v*顏色模型,簡稱CIELUV。其中L*表示亮度,u*、v*是色度坐標(biāo)。L*取值范圍是[0,100],u*和v*取值范圍[0,1]。
CIE-L*u*v*用于自己能發(fā)光的光源,例如顯示器。
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?CIE-Luv立體色域圖
稍后CIE又跟據(jù)CIE UCS色度圖建立了CIE1976-L*a*b*顏色模型,簡稱CIELAB或者Lab。 L*表示亮度,a*、b*是色度坐標(biāo)(a*是紅/綠軸,b*是黃/藍(lán)軸)。L*取值范圍是[0,100],a*和b*取值范圍[0,1]。
CIE-L*a*b*用于表示反射、透射的物體的顏色。
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? CIE-L*a*b立體色域
注意,還有一個顏色模型叫做Hunter1948 L,a,b,是由HunterLab公司制作的。雖然和CIE的Lab模型有些關(guān)聯(lián),但其實(shí)現(xiàn)不一樣。一般情況說Lab顏色模型,都是指CIE-Lab模型。
CIE-L*C*h
CIE LCH采用了和CIE L*a*b*相同的顏色空間,但用貼近人認(rèn)知的方式表達(dá)色彩。其中L*表示明度(Lightness,該值定義和Lab模型一樣),C*表示飽和度(Chroma),h°表示色調(diào)(Hue)。C*和h°即用L*a*b*中的a*b*分量換算得到。
CIE L*C*h°立體色域圖(該圖色域應(yīng)該和L*a*b*是重合的,可以對比一下)
RGB
最常見的顏色模型,設(shè)備相關(guān)。三個數(shù)值代表R、G、B分量,取值均為[0,255]。
RGB顏色模型( 一般設(shè)備的RGB僅能表現(xiàn)CIE-XYZ很少一部分)
通常設(shè)備(例如筆記本的液晶顯示屏)能表現(xiàn)的色域大概是下面這樣。
OSX中ColorCync工具 將普通RGB顯示到Y(jié)xy立體色域中
CMYK、CMY
這個顏色模型常用于印刷出版。CMYK表示青(Cyan)品紅(Magenta)黃(Yellow)黑(BlacK)四種顏料。由于顏料的特性,該模型也是與設(shè)備相關(guān)的。相對于RGB的加色混色模型,CMY是減色混色模型,顏色混在一起,亮度會降低。之所以加入黑色是因?yàn)榇蛴r由品紅、黃、青構(gòu)成的黑色不夠純粹。

通常其能表現(xiàn)的色域很小,如下圖。
OSX中ColorCync工具 將普通CMYK顯示到Y(jié)xy立體色域中
HSL、HSV
HSL和HSV的顏色模型比較相近,它們用來描述顏色相對于RGB等模型顯得更加自然。電腦繪畫時,這兩個模型非常受到歡迎。
HSL和HSV中,H都表示色相(Hue)。通常該值取值范圍是[0°,360°],對應(yīng)紅橙黃綠青藍(lán)紫-紅這樣順序的顏色,構(gòu)成一個首尾相接的色相環(huán)。色相的物理意義就是光的波長,不同波長的光呈現(xiàn)了不同的色相。
HSL和HSV中,S都表示飽和度(Saturation)(有時也稱為色度、彩度)即色彩的純凈程度。例如龍袍的金黃色飽和度就比屎黃色高。對應(yīng)到到物理意義上:即一束光可能由很多種不同波長的單色光構(gòu)成,波長越多越分散,則色彩的純凈程度越低,而單色的光構(gòu)成的色彩純凈度就很高。
兩個顏色模型不同的就是最后一個份量。
HSL中的L表示亮度(Lightness/Luminance/Intensity)。根據(jù)縮寫不同HSL有時也稱作HLS或HSI(就是說HSL、HLS、HSI是一回事)。
HSV中的V表示明度(Value/Brightness)。根據(jù)縮寫不同,HSV有時也被稱作HSB(就是說HSV和HSB是一回事)。
至于亮度和明度的區(qū)別,可以看下面的圖。一種純色的明度是白色的明度,而純色的亮度等于中灰色的亮度。
下面的圖能更好的對比HSL和HSV的區(qū)別:在圓柱體外圍是純色(紅黃綠藍(lán)紫...)HSL中,這圈純色位于亮度(L)等于1/2的部位,而在HSV中是在明度(Value)等于1的部位。

將上面的圓柱體裁掉無用的部分,得到的是如下的錐形,就能更明顯的看出HSL和HSV的區(qū)別了。

YUV、YCbCr(YCC)、YPbPr、YDbDr、YIQ
這些顏色模型大都是用在電視系統(tǒng)、數(shù)位攝影等地方。其中的Y分量都表示的是明亮度(Luminance、Luma)。
YUV顏色模型中,U、V表示的是色度(Chrominance/Chroma)。YUV是歐洲電視系統(tǒng)所采用的顏色模型(屬于PAL制式),顏色被分為一個亮度信號和兩個色差信號進(jìn)行傳輸。
YCbCr(簡稱YCC)中,Cb和Cr藍(lán)色(blue)和紅色(red)的色度。YCbCr是YUV的壓縮和偏移的版本。
YPbPr類似YCbCr,與之不同的是,YPbPr選用的CIE色度坐標(biāo)略有不同。一般SDTV傳輸?shù)纳钚盘柋环Q作Cb、Cr,而HDTV傳輸?shù)纳钚盘柋环Q作Pb、Pr。
YDbDr也類似YCbCr,同樣也是色度坐標(biāo)不同。YDbDr是SECAM制式電視系統(tǒng)所用的顏色模型。
YIQ。。嗯也和上面的類似。。是用在了NTSC制式的的電視系統(tǒng)里。。
全球電視系統(tǒng)制式分布,PAL用YUV、SECAM用YDbDr、NTSC用YIQ
其他顏色模型
除了上面這些比較常見的顏色模型,其他的顏色模型還有LMS、RYB、RAL等等,比較小眾所以懶得查了。。但這其中有一個很有意思的顏色模型:Pantone。
Pantone公司是一家專門開發(fā)和研究色彩而聞名全球的權(quán)威機(jī)構(gòu),為各個行業(yè)提供專業(yè)色彩選擇和精確的交流語言。他們最知名的產(chǎn)品當(dāng)屬PANTONE色卡,提供了一系列的標(biāo)準(zhǔn)色。一套PANTONE色卡可不便宜。。如果感興趣,可以到AppStore上看看PANTONE的作品,There's an App for that...
顏色模型之間的轉(zhuǎn)換
從上面的介紹可以直到,顏色模型通常分為設(shè)備相關(guān)和設(shè)備不相關(guān),轉(zhuǎn)換的時候便有很多不同。
設(shè)備相關(guān)的顏色模型,例如RGB、CMYK,這樣的模型只是規(guī)定了一個取值的范圍,例如RGB每個分量取值是0-255,則該值如何呈現(xiàn)出光來,是需要具體設(shè)備來解釋的。這樣的顏色模型不會關(guān)聯(lián)到人眼的刺激值的具體值,它們之間的轉(zhuǎn)換相對簡單。
設(shè)備不相關(guān)的顏色模型,例如XYZ、Lab,這樣的模型是需要反映真實(shí)的可見顏色的,所以他們與設(shè)備無關(guān),但是轉(zhuǎn)換時相對較麻煩,需要很多條件。
為了在設(shè)備相關(guān)、設(shè)備不相關(guān)的顏色模型間互相轉(zhuǎn)換,一般是以RGB和CIEXYZ作為橋梁進(jìn)行的,如下圖。
為了能將RGB映射到真實(shí)的視覺顏色空間XYZ中,需要預(yù)先定義一些常量。
根據(jù)上面的CIE-XYZ色域圖的介紹,給定三個光源,最終能覆蓋的色域只能是三角形,所以這里需要定義R、G、B在XYZ色域的絕對位置。例如下圖就是sRGB定義的R、G、B在色彩空間中的絕對位置。這樣就建立的RGB到XYZ的線性關(guān)系。
下面是一些常見的RGB色彩空間:
(多說一句,通常Photoshop繪圖時,默認(rèn)選擇的是sRGB,該色域可以在大多數(shù)設(shè)備上完整呈現(xiàn)出來。那些號稱覆蓋100%色域的上流顯示器,指的是覆蓋了AdobeRGB色域。目前沒有設(shè)備能完整呈現(xiàn)上圖完整的色域)
當(dāng)RGB都為最大值時,該點(diǎn)表示白色。在XYZ色域中,白色是如何定義的CIE也有一些標(biāo)準(zhǔn),即標(biāo)準(zhǔn)光源。不同的標(biāo)準(zhǔn)光源有著不同的色溫。詳情取看Wiki吧:Standard illuminate。
如下圖,色溫曲線為下圖中的弧線。
將中間這部分放大,標(biāo)準(zhǔn)光源的定義即位于這條曲線附近。
常見標(biāo)準(zhǔn)光源含義如下:
A (2856K) 白熾燈
B (4874K) 正午直射日光
C (6774K) 北方天空光
D50 (5003K) 地平線日光
D55 (5503K) 午后的日光
D65 (6504K) 中午的日光
D75 (7504K) 北方天空光
E (5454K) 代表標(biāo)準(zhǔn)照光源D以外的其它日光
F1 (6430K) 日光熒光燈
F2 (4230K) 冷白熒光燈
F3 (3450K) 白色熒光燈
F4 (2940K) 暖白熒光燈
F5 (6350K) 日光熒光燈
F6 (4150K) 簡白日光燈
F7 (6500K) D65模擬
F8 (5000K) D50模擬
F9 (4150K) 冷白豪華熒光燈
F10 (5000K) 飛利浦TL85,Ultralume 50
F11 (4000K) 飛利浦TL84,Ultralume 40
F12 (3000K) 飛利浦TL83,Ultralume 30
RGB和XYZ轉(zhuǎn)換時,需要選定一個標(biāo)準(zhǔn)光源。通常的選擇是D50、D65。
RGB是在顯示器設(shè)備上顯示的,以電視為例,其顯像管的電壓和發(fā)出的亮度并不是線性的,例如0.5的Green亮度,顯像管可能只需要0.2的電壓。
這樣的關(guān)系曲線通常是一個乘冪函數(shù):Y=(X+e)γ,即Gamma校正。通常電視系統(tǒng)的Gamma值為2.2。RGB與XYZ轉(zhuǎn)換時,該值也是一個必須的參數(shù)。
所以,根據(jù)上面這些說明,XYZ與RGB之間轉(zhuǎn)換,需要一個預(yù)定義的RGB模型、一個標(biāo)準(zhǔn)光源、一個Gamma值。。等等。。
通常情況下參數(shù)這樣選擇的:Observer:2°, Illuminant:D65, RGBModel:sRGB, Gamma:sRGB.
好了,下面就是各個模型之間的轉(zhuǎn)換方式了。
RGB與HSL之間的轉(zhuǎn)換
(r,g,b)是一個顏色RGB(紅綠藍(lán))坐標(biāo),取值都在[0,1];
(h,s,l)是顏色的HSL(色相、飽和度、亮度)坐標(biāo),h取值范圍是[0,360)度,s和l取值范圍是[0,1]。
由RGB轉(zhuǎn)換為HSL時,設(shè)max為r,g,b中的最大值,min為r,g,b中的最小值。轉(zhuǎn)換公式如下。
注意,實(shí)際情況下,如果r=g=b時,該顏色是非彩色的,這時色相(Hue)應(yīng)該無定義。
下面是RGB to HSL的C代碼,為了方便計(jì)算,傳入傳出的值范圍都是[0,1]。
由RGB轉(zhuǎn)換為HSL時,設(shè)max為r,g,b中的最大值,min為r,g,b中的最小值。轉(zhuǎn)換公式如下。

注意,實(shí)際情況下,如果r=g=b時,該顏色是非彩色的,這時色相(Hue)應(yīng)該無定義。
下面是RGB to HSL的C代碼,為了方便計(jì)算,傳入傳出的值范圍都是[0,1]。

由HSL轉(zhuǎn)換為RGB時,
如果飽和度(s)=0,則顏色是非彩色的。色相(Hue)是無意義的,r=g=b=l(亮度)。
如果飽和度(s)≠0,有如下的計(jì)算方式:


下面是HSL to RGB的C代碼,為了方便計(jì)算,傳入傳出的值范圍都是[0,1]。

更多內(nèi)容,相關(guān)代碼
放到了Github上
參考資料
Wikipedia
http://en.academic.ru/dic.nsf/enwiki/157333
http://www.brucelindbloom.com/
http://www.handprint.com/HP/WCL/
http://www.couleur.org/
http://www.codeproject.com/Articles/19045/Manipulating-colors-in-NET-Part-1
http://www.iclcv.org/index.php?q=node/28
http://www.easyrgb.com/index.php?X=MATH
http://www.techmind.org/colour/
《色彩管理(Real World Color Management)》..這書在當(dāng)當(dāng)京東早已經(jīng)缺貨了。。
























