1. 程式人生 > >影象的顏色空間——RGB、CMY與CMYK、HSI

影象的顏色空間——RGB、CMY與CMYK、HSI

人眼中負責彩色感知的細胞中約有65%對紅色敏感,33%對綠色敏感,而只有2%對藍色敏感。正是人眼的這些吸收特性決定了被看到的彩色是通常所謂的三原色(紅、綠、藍)的組合。國際照明委員會(CIE)規定以藍(波長=435.8nm)、綠(波長=546.1nm)、紅(波長=700nm)作為主原色,紅、綠、藍也因此被稱為3原色。

在計算機中,顯示器的任何顏色(色彩全域)都可以由3種顏色紅、綠、藍組成,成為三基色。每種基色的取值範圍是0~255。

  • 計算機中任何顏色都可以由3種顏色按不同比例混合而成;而每種顏色都可以分解成三種基本顏色。
  • 三原色之間是相互獨立的,任何一種顏色都不能由其餘兩種顏色來組成。
  • 混合的的飽和度由3種顏色的比例來決定。混合色的亮度是3種顏色的亮度之和。

如今使用的大部分彩色模型都是面向應用的或是面向硬體的,比如針對彩色監視器的RGB(紅、綠、藍)模型、面向彩色印表機的CMY(青、深紅或品紅、黃)和CMYK(情、深紅或品紅、黃、黑)模型。HSI(色調、飽和度、亮度)模型非常符合人眼描述和解釋顏色的方式,除此之外,目前廣泛使用的彩色模型還有:HSV模型、YUV模型、YIQ模型、Lab模型等。

一、RGB

  • 青=藍+綠;
  • 黃=綠+紅;
  • 深紅(品紅)=藍+紅;
  • 黑=0;
  • 白=紅+綠+藍;

如圖所示:(圖中已歸一化至[0,1])

 RGB模型除了應用於顯示器外,掃描器也是通過吸收原稿反射或透射而傳送出來的光線中的R、G、B成分,並用它來表示原稿的顏色。

顯示器和掃描器使用的RGB模型與CIE標準中的RGB真是三原色彩色系統空間是不同的,後者是與裝置無關的彩色空間。

二、CMY與CMYK

CMY模型以青、品紅、黃三種顏色作為基本原色表示其他顏色。由於彩色的顯示不是直接來自於光線的色彩,而是光線照射物體後被物體吸收掉一部分之後反射來的剩餘光線產生的,因此CMY又稱為減色法混色模型。當光線都被吸收(沒有反射光)時是黑色,當光線都被反射(都沒有被吸收)時是白色。

對於像彩色印表機這類需要在紙上沉澱彩色顏料的裝置,顏料不是如顯示器一樣主動發出光線,而是反射光線,因此當白光照射到紙上,顏料吸收相應顏色(如青色顏料會吸收紅色兒反射青色),反射白光中剩餘的光。

理論上,等量的青、品紅、黃混合可以產生黑色。實際上,這種混合產生的黑色是不純的。因此,為了產生真正的黑色,專門在CMY模型中加入了第4種顏色——黑色,從而得到了CMYK模型。

RGB -> CMY轉換

 根據CMY模型的原理易知:

\begin{bmatrix} C\\ M\\ Y \end{bmatrix}=\begin{bmatrix} 1\\ 1\\ 1 \end{bmatrix}-\begin{bmatrix} R\\ G\\ B \end{bmatrix}

其中,假設RGB空間已歸一化至[0,1],若沒有歸一化,只要將1改成255即可。

三、HSI

HSI模型是從人的視覺系統出發,直接使用顏色三要素的——色調(Hue)、飽和度(saturation)、亮度(Intensity)來描述顏色的。

  • 亮度是指人眼感覺光的明暗程度。光的能量越大,亮度越大
  • 色調是彩色最重要的屬性,決定顏色的本質,由物體反射光線中佔優勢的波長來決定,不同的波長產生不同的顏色感覺。
  • 飽和度是指顏色的深淺和濃淡程度,飽和度越高,顏色越深。飽和度的深淺和白色的比例有關,白色的比例越多,飽和度越低。

HSI模型可以用一個圓錐空間模型來描述,如圖所示,通常把色調和飽和度統稱為色度,途中圓錐空間中間的橫截面就是色度圓(詳細地可以理解為:由圓心向圓周方向延申表示飽和度,以圓心角[0,2\pi]區分色調,0為紅色,2\pi /3為綠色,4\pi /3為藍色),而圓錐向上或向下延申的是亮度分量。

RGB -> HSI

H=\left\{\begin{matrix} \theta ,(B\leq G)\\ 2\pi -\theta,(B>G) \end{matrix}\right.,其中 \theta =arccos\begin{Bmatrix} \frac{\frac{1}{2}[(R-G)+(R-B)]}{[(R-G)^{2}+(R-G)(G-B)]^{1/2}} \end{Bmatrix}

S=1-\frac{3}{R+G+B}[min(R,G,B)]

I=\frac{1}{3}(R+G+B)

MATLB可以使用rgb2hsi()函式直接將RGB影象轉換至HSI影象。

HSI -> RGB

B=I(I-S)

R=I[1+\frac{ScosH}{cos(\pi /3-H)}]

G=3I-(R+B) MATLAB可以使用hsi2rgb()函式直接將HSI影象轉換至RGB影象。