色彩空間轉換(1)
雪中的原九
2014-12-10分享收藏
色彩空間轉換
不同色彩空間之間的轉換。
1,CMY/CMYK色彩空間
青色、品紅色和黃色(CMY)顏色模型是在彩色圖像印刷工業中使用的顏色空間。在色方中,它們是紅、綠、藍的互補色,稱為減色基,而紅、綠、藍稱為加色基。在CMY模型中,顏色是通過從白光中減去某些成分而獲得的。CMY坐標可以從RGB模型中獲得:
c = 1–R
m = 1–G
y = 1–B
因為CMY模型在印刷時不可能產生真正的黑色,所以印刷行業實際使用的是CMYK顏色模型,K是第四種顏色,表示黑色油墨:CMY到CMYK的轉換:
K := min(C,M,Y)
C:= C–K
M:= M–K
Y := Y - K
【cpp】查看plaincopy?
//將//RGB轉換為CMY
void rt RGB 2 cmy(RTS scalar RGB,RtScalar & ampcmy)
{
cmy . val[0]= 255-RGB . val[0];
cmy . val[1]= 255-RGB . val[1];
cmy . val[2]= 255-RGB . val[2];
}
//將//CMY轉換為RGB
void RTC my 2 RGB(RTS scalar cmy,RtScalar & amprgb)
{
RGB . val[0]= 255-cmy . val[0];
RGB . val[1]= 255-cmy . val[1];
RGB . val[2]= 255-cmy . val[2];
}
//轉換//CMY到CMYK
void RTC m2 cmyk(RTS scalar cmy,RtScalar & ampcmyk)
{
無符號字符溫度= 0;
temp = min(min(cmy.val[0],cmy.val[1]),cmy . val[2]);
如果(溫度== 255)
{
cmyk = rtScalar(0,0,0,0);
}
其他
{
cmyk . val[0]= cmy . val[0]-temp;
cmyk . val[1]= cmy . val[1]-temp;
cmyk . val[2]= cmy . val[2]-temp;
}
cmyk . val[3]= temp;
}
//轉換//CMYK到CMY
void rtcmyk 2 cmy(RTS scalar cmyk,RtScalar & ampcmy)
{
cmy . val[0]= cmyk . val[0]+cmyk . val[3];
cmy . val[1]= cmyk . val[1]+cmyk . val[3];
cmy . val[2]= cmyk . val[2]+cmyk . val[3];
}
2、HSI顏色空間
HSI顏色空間基於人類視覺系統,用色調、飽和度或色度、亮度來描述顏色。HSI顏色空間可以用圓錐空間模型來描述。用這個圓錐模型來描述他的色彩空間是相當復雜的,但是卻可以清晰的表現出色調、亮度、色彩飽和度的變化。色調和飽和度壹般稱為色度,用來表示顏色的類別和深淺。由於人類視覺對亮度的敏感程度遠高於對顏色深淺的敏感程度,為了便於顏色處理和識別,人類視覺系統往往采用HSI顏色空間,這種顏色空間比RGB顏色空間更符合人類視覺特性。在圖像處理和計算機視覺中,大量的算法可以方便地用在HSI顏色空間中,它們可以分開獨立處理。因此,在HSI顏色空間中可以大大簡化圖像分析和處理的工作量。HSI顏色空間和RGB顏色空間只是同壹物理量的不同表示,所以兩者之間存在轉換關系。
HSI顏色模型基於人類視覺系統,用H表示色調,S表示飽和度,I表示強度來描述顏色。飽和度與壹種顏色的白光量成反比,可以說是壹種顏色是否明亮的指標。因此,如果我們使用他的模型來處理顯示器上的圖像,我們將獲得更真實的結果。
色相:指物體透射或反射的波長。更常見的是通過顏色來識別,如紅色、橙色或綠色,並通過0至360度的值來測量。
飽和度:也叫色度,是指顏色的強度或純度。飽和度表示灰色與色調的比率,從0%(灰色)到100%(完全飽和)測量。
強度:指顏色的相對明度和暗度,通常用0%(黑色)到100%(白色)之間的百分比來衡量。
【cpp】查看plaincopy?
//轉換//RGB到HSI
void rt RGB 2 HSI(RTS scalar RGB,RtScalar & amphsi)
{
double maxv = 0,米女= 0,角度= 0;
RtScalar溫度;
temp . val[0]= RGB . val[0]/255.0;
temp . val[1]= RGB . val[1]/255.0;
臨時值[2]= RGB . val[2]/255.0;
maxv = max(max(temp.val[0],temp . val[1]);
米女= min(min(臨時值[0],臨時值[1]);
hsi.val[2] =(臨時值[0] +臨時值[1] +臨時值[2])/3.0;
hsi.val[1] = 1.0 -米女/HSI . val[2];
angle =(temp . val[0]+temp . val[0]-temp . val[1]-temp . val[2])/2.0 * sqrt((temp . val[0]-temp . val[1])*(temp . val[0]-temp . val[1])+(temp . val[0]-temp . val[2])*(temp . val[1]-temp . val[2]);
if(temp . val[2]& lt;=臨時值[1])
HSI . val[0]= angle/PI * 180.0;
其他
HSI . val[0]=(2 * PI-angle)/PI * 180.0;
}
//HSI轉換為RGB
void rth si 2r GB(RTS scalar HSI,RtScalar & amprgb)
{
int flag = 0;
double t1 = 0,t2 = 0,tv1 = 0,tv2 = 0,tv3 = 0;
RtScalar溫度;
temp = hsi
temp . val[0]= HSI . val[0]* PI/180.0;
t 1 = 2.0 * PI/3.0;
T2 = 2.0 * t 1;
if(temp . val[0]& gt;= t 1 & amp;& amptemp . val[0]& lt;t2)
{
flag = 1;
temp . val[0]-= t 1;
}
if(temp . val[0]& gt;= t2)
{
flag = 2;
temp . val[0]-= T2;
}
TV 1 =(temp . val[2]*(1-temp . val[1])* 255.0;
tv2 =(temp . val[2]*(1+temp . val[1]* cos(temp . val[0])/cos(PI/3-temp . val[0]))* 255.0;
tv3 =(3.0 * temp . val[2]-TV 1-tv2)* 255.0;
開關(標誌)
{
案例0:
rgb = rtScalar(tv2,tv3,tv1,0);
打破;
案例1:
rgb = rtScalar(tv1,tv2,tv3,0);
打破;
案例二:
rgb = rtScalar(tv3,tv1,tv2,0);
打破;
}
}
3、YUV色彩空間
在現代彩色電視系統中,通常使用三管彩色攝像機或彩色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分別是色差分量。
YUV和RGB相互轉換的公式如下(RGB值的範圍是0-255):
y = 0.299 r+0.587g+0.114B
U = -0.147R - 0.289G + 0.436B
v = 0.615R-0.515G-0.100 b
R = Y + 1.14V
G = Y - 0.39U - 0.58V
B = Y + 2.03U
【cpp】查看plaincopy?
//將RGB轉換為YUV
void rt RGB 2 YUV(RTS scalar RGB,RtScalar & ampyuv)
{
YUV . val[0]= 0.299 * RGB . val[0]+0.587 * RGB . val[1]+0.114 * RGB . val[2];// y
YUV . val[1]=-0.147 * RGB . val[0]-0.289 * RGB . val[1]+0.436 * RGB . val[2];// u
YUV . val[2]= 0.615 * RGB . val[0]-0.515 * RGB . val[1]-0.1 * RGB . val[2];// v
}
// YUV轉換為RGB
void rtyu v2 RGB(RTS scalar YUV,RtScalar & amprgb)
{
RGB . val[0]= YUV . val[0]+1.14 * YUV . val[2];// r
RGB . val[1]= YUV . val[0]-0.39 * YUV . val[1]-0.58 * YUV . val[2];
RGB . val[2]= YUV . val[0]+2.03 * YUV . val[1];
}