什麼是彩色
彩色是物體的一種屬性,就像紋理、形狀、重量同樣. 一般, 它依賴於3個方面的因素: 算法
其中,光特性是顏色科學的核心。假如光沒有顏色(捎色的,如觀察者看到的黑白電視的光),那麼它的屬性僅僅是亮度或者數值。能夠用灰度值來描述亮度, 光的範圍從黑到灰.最後到白。
而對於彩色光,咱們一般用3個基本量來描述其光源的質量: 輻射率、光強和亮度。
(1)輻射率是從光源流出能量的總量, 一般用瓦特(W)度量;
(2)光強用流明度量,它給出了觀察者從光源接收的能量總和的度量:
(3)亮度是彩色強度概念的具體化。它其實是一個難以度量的主關描繪子.
一樣做爲能量的度盤,輻射率與光強卻每每沒有必然的聯繫.例如,在進行X光檢查時,光從X射線源中發出,它是具備實際意義上的能量的。但因爲其處於可見光範圍之外,觀察者很難感受到。所以對咱們來講,它的光強幾乎爲o. 數組
咱們眼中的彩色
人類可以感覺到的物體的顏色是由物體反射光的性質決定的,. 如圖7.2所示,可見光是由電磁波譜中較窄的液段組成。若是物體反射的光在全部可見光披長範圍內是平衡的, 則站在觀察者的角度它就是白色的:若是物體僅對有限的可見光譜範圍反射,則物體表現爲某種特定顏色。例如,反射披長範圍在450~500nm 之間的物體呈現藍色, 它吸取了其餘被長光的多數能量: 而若是物體吸取了全部的入射光,則將呈現爲黑色。 markdown
三原色
據詳細的實驗結果可知,人眼中負責彩色感知的細胞中約有65%對紅光敏感, 33%對綠光敏感,而只有2%對藍光敏感。正是人眼的這些極收特性決定了被看到的彩色是一般所謂的原色紅(R )、綠(G )、藍(B)的各類組合。國際照明委員會(CIE )規定以藍=435.8nm、綠=546.lnm、紅=700nm 做爲主原色, 紅CR )、綠(G )、藍( B )也所以被稱爲3 原色。
在圖7.3所示的CIE色度圖中,最外圍的輪廓對應全部的可見光譜色,在其邊緣上標出了對應的波長值(以m爲單位〉,該輪廓以內的區域包含了全部的可見顏色.若是將色度圈中的三色點兩兩鏈接成一個三角形, 則該三角形內的任何顏色均可以自這3種原色的不一樣混合產生。
咱們看到, 圖7.3中由R、G、B三種標準原色所連成的三角形並不能涵蓋整個可見顏色區域, 這說明僅使用三原色並不能獲得全部的可見顏色。事實上, 圖7.3中的三角形區域對應着典型的RGB監視器所可以產生的顏色範圍, 稱爲彩色全域:而在三角形內不規則的區域表示高質量的彩色打印設備的彩色域. ui
計算機中的顏色表示
在計算機中,顯示器的任何顏色〈色彩全域〉均可以自紅、綠、藍3種顏色組成,稱爲三基色.每種基色的取值範圍是0~255.任何顏色均可以用這3種顏色按不一樣的比例混合而成, 這就是三原色原理. 在計算機中, 三原色的原理能夠這樣解釋: spa
彩色模型也稱彩色空間或彩色系統, 是用來精確標定和生成各類顏色的一套規則和定義, 它的用途是在某些標準下用一般可接受的方式簡化彩色規範. 彩色模型一般能夠採用座標系統來描述, 而位於系統中的每種顏色都由座標空間中的單個點來表示。
現在使用的大部分彩色模型都是面向應用或是面向硬件, 好比衆所周知的針對彩色電視器的RGB( 紅、綠、藍〉模型, 以及面向彩色打印機的CMY(青、深紅、黃〉和CMYK(青、深紅、黃、黑〉模型。而HSI(色調、飽和度、亮度〉模型很是符合人眼描述和解釋顏色的
方式。此外, 目前普遍使用的彩色模型還有如:HSV模型、YUV 模型、YIQ模型、Lab模型等。下面將分別介紹這些彩色模型並給出它們與最爲經常使用的RGB模型之間的轉換方式。 翻譯
RGB模型是工業界的一種顏色標準. 是經過對紅(Red)、綠(Green)、藍(Blue)3種顏色亮度的變化以及它們相互之間的疊加來獲得各類各樣的顏色的。該標準兒乎包括了人類視覺所能感知的全部顏色,是目前運用最廣的顏色模型之一。
理論基礎
RGB彩色空間對應的座標系統是如圖7.4所示的立方體. 紅、綠和藍位手立方體的3個頂點上:青、深紅和黃位於另外3個頂點上:黑色在原點處, 而白色位於距離原點最遠的頂點處, 灰度等級就沿這兩點連線分佈: 不一樣的顏色處於立方體外部和內部, 所以能夠用一個3維向量來表示。例如,在全部顏色均己歸一化到(O, 1)的狀況下,藍色可表示爲(O, 0, 1),而灰色可由向量(0.5, 0.5, 0.5)來表示。
在RGB模型中,3個圖像份量組成了所要表示的圖像,而每個份量圖像都是其原色圖像,如圖7.5所示。當送入RGB監視器時,這3個份量圖像便在屏上混合產生一幅合成彩色圖像:
在RGB空間中,用以表示每一像素的比特數叫作像素深度。RGB圖像的3個紅、綠、 藍份量圖像都是一幅8比特圖像,每個彩色像素有24比特深度。所以,全綵色圖像經常使用來定義24比特的彩色圖像,顏色總數是
matlab實現
code
CMY模型(Cyan、Magenta、Yellow)是採用青、品紅、黃色3種基本原色按必定比例合成顏色的方法。因爲色彩的顯示不是直接來自於光線的色彩,而是由光線被物體吸取掉一部分以後反射回來的剩餘光線產生,所以CMY模型又稱爲減色法混色模型。當光線都被吸取時成爲黑色,都被反射時成爲白色.xml
像CMY 模型這樣的減色混合模型正好適用於彩色打印機和複印機這類須要在紙上沉積彩色顏料的設備, 由於顏料不是像顯示器那樣發出顏色, 而是反射顏色。例如,當青色顏料塗覆的表面用。白光照射時, 從該表面反射的不是紅光, 而是從反射的白光中減去紅色獲得的青色(白光自己是等量的紅、綠、藍光的組合). CMY模型的顏料混合效果如圖7.6所示, 注意這裏的混合是原色的相減, 與
RGB模型的混合正好相反。 blog
CMYK模型
由圖7.6可見, 等量的顏料原色(青、品紅和黃)能夠混合產生黑色。然而在實際運用
中, 經過這些顏色混合產生的黑色是不純的。所以, 爲產生真正的黑色〈黑色在打印中起主
要做用〉, 專門在CMY模型中加入了第4種顏色一一黑色, 從而獲得CMYK影色模型. 這
樣當出版商說到「 四色打印」 時, 即指CMY彩色模型的3種原色再加上黑色。
HSI模型是從人的視覺系統出發,直接使用顏色三要素色調(Hue)、飽和度(Saturation) 和亮度(intensity,有時也翻譯做密度或灰度〉來描述顏色.
HSI彩色空間能夠用一個圓錐空間模型來描述, 如圖7.8所示。咱們一般把色調和飽和度統稱爲色度, 用來表示顏色的類別與深淺程度。在圖中
四錐中間的橫截面圓就是色度圓, 而圓錐向上或向下延伸的即是亮度份量的表示.
因爲人的視覺對亮度的敏感程度遠強於對顏色濃淡的敏感程度, 爲了便於顏色處理和識別, 人的視覺系統常常採用HSI彩色空間, 它比RGB彩色空間更符合人的視覺特性。此外, 因爲HSl空間中亮度和色度具備可分離特性, 使得圖像處理和機器視覺中大量灰度處理算法均可在
HSI彩色空間中方便地使用。
HSI彩色空間和RGB 彩色空間只是同一物理量的不一樣表示法, 它們之間存在着轉換關係. 下面將介紹RGB到到HSI的彩色轉換和HSI到RGB的彩色轉換
從RGB到HSI的彩色轉換及其實現
給定一幅RGB格式的圖像, 每個RGB像素和H份量可用下面的公式獲得:
matlab實現
function hsi = rgb2hsi(rgb)
% hsi = rgb2hsi(rgb)把一幅RGB圖像轉換爲HSI圖像,
% 輸入圖像是一個彩色像素的M×N×3的數組,
% 其中每個彩色像素都在特定空間位置的彩色圖像中對應紅、綠、藍三個份量。
% 假如全部的RGB份量是均衡的,那麼HSI轉換就是未定義的。
% 輸入圖像多是double(取值範圍是[0, 1]),uint8或 uint16。
%
% 輸出HSI圖像是double,
% 其中hsi(:, :, 1)是色度份量,它的範圍是除以2*pi後的[0, 1];
% hsi(:, :, 2)是飽和度份量,範圍是[0, 1];
% hsi(:, :, 3)是亮度份量,範圍是[0, 1]。
% 抽取圖像份量
rgb = im2double(rgb);
r = rgb(:, :, 1);
g = rgb(:, :, 2);
b = rgb(:, :, 3);
% 執行轉換方程
num = 0.5*((r - g) + (r - b));
den = sqrt((r - g).^2 + (r - b).*(g - b));
theta = acos(num./(den + eps)); %防止除數爲0
H = theta;
H(b > g) = 2*pi - H(b > g);
H = H/(2*pi);
num = min(min(r, g), b);
den = r + g + b;
den(den == 0) = eps; %防止除數爲0
S = 1 - 3.* num./den;
H(S == 0) = 0;
I = (r + g + b)/3;
% 將3個份量聯合成爲一個HSI圖像
hsi = cat(3, H, S, I);
從HSI到RGB的彩色轉換及其實現
在[O, 1]內給出HSI值, 如今要在相同的值域找到RGB值, 可利用H值公式。在原始色分割中有3個相隔120· 的扇形, 如圖7.10所示。從H乘以360" 開始, 這時色調值返回原來的[0,360]的範圍.
matlab實現
function rgb = hsi2rgb(hsi)
% rgb = hsi2rgb(hsi)把一幅HSI圖像轉換爲RGB圖像,
% 其中hsi(:, :, 1)是色度份量,它的範圍是除以2*pi後的[0, 1];
% hsi(:, :, 2)是飽和度份量,範圍是[0, 1];
% hsi(:, :, 3)是亮度份量,範圍是[0, 1]。
%
% 輸出圖像份量:
% rgb(:, :, 1)爲紅;
% rgb(:, :, 2)爲綠;
% rgb(:, :, 3)爲藍。
% 抽取圖像份量
hsi = im2double(hsi);
H = hsi(:, :, 1) * 2 * pi;
S = hsi(:, :, 2);
I = hsi(:, :, 3);
% 執行轉換方程
R = zeros(size(hsi, 1), size(hsi, 2));
G = zeros(size(hsi, 1), size(hsi, 2));
B = zeros(size(hsi, 1), size(hsi, 2));
% RG扇形(0 <= H < 2*pi/3)
idx = find( (0 <= H) & (H < 2*pi/3));
B(idx) = I(idx) .* (1 - S(idx));
R(idx) = I(idx) .* (1 + S(idx) .* cos(H(idx)) ./ ...
cos(pi/3 - H(idx)));
G(idx) = 3*I(idx) - (R(idx) + B(idx));
% BG扇形(2*pi/3 <= H < 4*pi/3)
idx = find( (2*pi/3 <= H) & (H < 4*pi/3) );
R(idx) = I(idx) .* (1 - S(idx));
G(idx) = I(idx) .* (1 + S(idx) .* cos(H(idx) - 2*pi/3) ./ ...
cos(pi - H(idx)));
B(idx) = 3*I(idx) - (R(idx) + G(idx));
% BR扇形
idx = find( (4*pi/3 <= H) & (H <= 2*pi));
G(idx) = I(idx) .* (1 - S(idx));
B(idx) = I(idx) .* (1 + S(idx) .* cos(H(idx) - 4*pi/3) ./ ...
cos(5*pi/3 - H(idx)));
R(idx) = 3*I(idx) - (G(idx) + B(idx));
% 將3個份量聯合成爲一個RGB圖像
rgb = cat(3, R, G, B);
rgb = max(min(rgb, 1), 0);
本節主要介紹全綵色圖像處理技術,以及面對不一樣的圖像處理任務怎樣處理全綵色圖像.一般,全綵色圖像處理技術總的能夠分爲如下兩大類。
(1)對3個平面份量單獨處理,而後將分別處理過的3個份量合成彩色圖像。對每一個份量的處理技術能夠應用到對灰度圖像處理的技術上。可是這種通道式的獨立處理技術忽略了通道間的相互影響。
(2)直接對彩色像素進行處理。由於全綵色圖像至少有3個份量,彩色像素其實是一個向量。直接處理就是同時對全部份量進行無差異的處理.這時彩色圖像的 3個份量用向量形式表示,即對彩色圖像上任一點的像素 c(x,y),有:
c(x,y)= [R(x,y);G(x,y);B(x,y)]
那麼對像素點(x,y)處理的操做其實是同時對 R、G、 B這3個份量操做.不過一般大多數圖像處理技術都是指對每一個份量的單獨處理。接下來將講述全綵色圖像處理的兩個經常使用技術:彩色補償和彩色平衡。
有些圖像處理任務的目標是根據顏色分離出不一樣類型的物體。但因爲經常使用的彩色成像設備具備較寬且相互覆蓋的光譜敏感區,加之待拍攝圖像的染色是變化的,因此很難在3 個份量圖中將物體分離出來,這種現象稱爲顏色擴散。彩色補償的做用就是經過不一樣的顏色通道提取不一樣的目標物。
matlab實現
% compensate.m % 彩色補償 im=double(imread('plane.bmp')); subplot(1,2,1); imshow(uint8(im)); title('原始圖'); [m,n,p]=size(im); [h1,k1]=min(255-im(:,:,1)+im(:,:,2)+im(:,:,3)); [j1,minx]=min(h1); i1=k1(j1);%提取圖像中最接近紅色的點,其在im中的座標爲i1,j1 r1=im(i1,j1,1); g1=im(i1,j1,2); b1=im(i1,j1,3); R=0.30*r1+0.59*g1+0.11*b1; [h2,k2]=min(255-im(:,:,2)+im(:,:,1)+im(:,:,3)); [j2,minx]=min(h2); i2=k2(j2);%提取圖像中最接近綠色的點,其在im中的座標爲i2,j2 r2=im(i2,j2,1); g2=im(i2,j2,2); b2=im(i2,j2,3); G=0.30*r2+0.59*g2+0.11*b2; [h3,k3]=min(255-im(:,:,3)+im(:,:,1)+im(:,:,2)); [j3,minx]=min(h3); i3=k3(j3);%提取圖像中最接近藍色的點,其在im中的座標爲i3,j3 r3=im(i3,j3,1); g3=im(i3,j3,2); b3=im(i3,j3,3); B=0.30*r3+0.59*g3+0.11*b3; A1=[r1 r2 r3 g1 g2 g3 b1 b2 b3]; A2=[R 0 0 0 G 0 0 0 B]; C=A1*inv(A2); for i=1:m for j=1:n imR=im(i,j,1); imG=im(i,j,2); imB=im(i,j,3); temp=inv(C)*[imR;imG;imB]; S(i,j,1)=temp(1); S(i,j,2)=temp(2); S(i,j,3)=temp(3); end end S=uint8(S); subplot(1,2,2); imshow(S); title('補償後');
一幅彩色圖像數字化後, 在顯示時顏色常常看起來有些不正常。 這是色通道的不一樣敏感度、增光因子和偏移量等緣由致使的,稱其爲三基色不平衡。將之校訂的過程就是彩色平衡
matlab實現
% balance.m
% 彩色平衡
im=double(imread('plane.bmp'));
[m,n,p]=size(im);
F1=im(1,1,:);
F2=im(1,2,:);
F1_(1,1,1)=F1(:,:,2);
F1_(1,1,2)=F1(:,:,2);
F1_(1,1,3)=F1(:,:,2);
F2_(1,1,1)=F2(:,:,2);
F2_(1,1,2)=F2(:,:,2);
F2_(1,1,3)=F2(:,:,2);
K1=(F1_(1,1,1)-F2_(1,1,1))/(F1(1,1,1)-F2(1,1,1));
K2=F1_(1,1,1)-K1*F1(1,1,1);
L1=(F1_(1,1,3)-F2_(1,1,3))/(F1(1,1,3)-F2(1,1,3));
L2=F1_(1,1,3)-L1*F1(1,1,3);
for i=1:m
for j=1:n
new(i,j,1)=K1*im(i,j,1)+K2;
new(i,j,2)=im(i,j,2);
new(i,j,3)=L1*im(i,j,3)+L2;
end
end
im=uint8(im);
new=uint8(new);
subplot(1,2,1);
imshow(im);
title('原始圖');
subplot(1,2,2);
imshow(new);
title('平衡後');