国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

RGB轉XYZ色彩空間開發及matlab實驗筆記整理

2019-11-06 06:42:17
字體:
來源:轉載
供稿:網友

photoshop中經常使用有RGB(紅色、綠色、藍色)、CMYK(青色、洋紅、黃 色、黑色)、HSB(色相、飽和度、亮度)和Lab4中色彩空間。本文將介紹其具體的算法,并通過VC編程實現,本系列程序均在Win7+VS2008測試通過,并且和PS3的結果一致。

由于公式比較繁瑣,代碼比較復雜,所以關于VC編程實現色彩空間的轉換將分成多篇文章介紹。RGB色彩空間與LAB色彩空間之間的轉換通常需要XYZ色彩空間過渡完成,本文主要介紹RGB與XYZ色彩空間之間的相互轉換原理和具體實現,首先介紹rgb色彩空間轉換成XYZ色彩空間的理論計算公式和VC源代碼,然后介紹XYZ轉換成rgb色彩空間的計算公式和源代碼。

1.色彩空間rgb轉XYZ(r:0-255,g:0-255,b:0-255)

1.1. 理論公式

首先將rgb轉換成RGB:

RGB轉XYZ轉換公式

其中,gamma函數是r、g、b的gamma變換,gamma 2.2函數如下:

RGB轉XYZ使用的gamma變換函數

RGB轉XYZ的變換矩陣

其中:

RGB轉XYZ的變換矩陣

1.2. VC實例代碼:

示例:

1234567891011121314151617181920212223242526272829staticdoubleM[]={    0.436052025,    0.385081593,    0.143087414,                    0.222491598,    0.716886060,    0.060621486,                    0.013929122,    0.097097002,    0.714185470};staticCMatrix matrixM(3,3,M);// M矩陣的逆矩陣staticCMatrix inv_matrixM=matrixM.inv();// gamma 2.2// Gamma校正函數doubleCColorUtility::gamma(doublex){    if(x>0.04045)        x=pow((x+0.055)/1.055,2.4);    else        x=x/12.92;    returnx;}// CIE RGB轉XYZboolCColorUtility::_cie_rgb2xyz(constintrgb[3],double(&xyz)[3]){    doubleRGB[]={rgb[0]/255.0,rgb[1]/255.0,rgb[2]/255.0};     RGB[0]=gamma(RGB[0]);    RGB[1]=gamma(RGB[1]);    RGB[2]=gamma(RGB[2]);     xyz[0]=100.0*(matrixM[1][1]*RGB[0]+matrixM[1][2]*RGB[1]+matrixM[1][3]*RGB[2]);    xyz[1]=100.0*(matrixM[2][1]*RGB[0]+matrixM[2][2]*RGB[1]+matrixM[2][3]*RGB[2]);    xyz[2]=100.0*(matrixM[3][1]*RGB[0]+matrixM[3][2]*RGB[1]+matrixM[3][3]*RGB[2]);     returntrue;}
到此,便使用VC編程實現了色彩空間RGB到XYZ的轉換,下面我們來看看其逆變換,即XYZ轉RGB的具體理論和實現:

2.色彩空間XYZ轉rgb(r:0-255,g:0-255,b:0-255)

2.1. 理論公式

XYZ轉rgb公式

XYZ轉rgb公式

RGB轉rgb公式

其中r_gamma為R、G、B的gamma逆變換,gamma 2.2的逆變換函數如下:

RGB轉rgb的gamma 2.2逆變換

2.2. VC實例源碼

示例:

123456789101112131415161718192021222324252627// gamma 2.2// Gamma校正函數的反函數doubleCColorUtility::r_gamma(doublex){    if(x>pow((0.04045+0.055)/1.055,2.4))        x=1.055*pow(x,1.0/2.4)-0.055;    else        x=12.92*x;        returnx;}//XYZ轉labboolCColorUtility::_cie_xyz2rgb(constdoublexyz[3],int(&rgb)[3]){    doubleXYZ[]={0.0,0.0,0.0};     XYZ[0]=(inv_matrixM[1][1]*xyz[0]+inv_matrixM[1][2]*xyz[1]+inv_matrixM[1][3]*xyz[2])/100.0;    XYZ[1]=(inv_matrixM[2][1]*xyz[0]+inv_matrixM[2][2]*xyz[1]+inv_matrixM[2][3]*xyz[2])/100.0;    XYZ[2]=(inv_matrixM[3][1]*xyz[0]+inv_matrixM[3][2]*xyz[1]+inv_matrixM[3][3]*xyz[2])/100.0;     XYZ[0]=r_gamma(XYZ[0])>0?r_gamma(XYZ[0])*255:0;    XYZ[1]=r_gamma(XYZ[1])>0?r_gamma(XYZ[1])*255:0;    XYZ[2]=r_gamma(XYZ[2])>0?r_gamma(XYZ[2])*255:0;     rgb[0]=XYZ[0]<255?int(XYZ[0]+0.5):255;    rgb[1]=XYZ[1]<255?int(XYZ[1]+0.5):255;    rgb[2]=XYZ[2]<255?int(XYZ[2]+0.5):255;     returntrue;}

其中,inv_matrixM為M矩陣的逆矩陣。到此,便使用VC編程實現了色彩空間XYZ到rgb的轉換,本文介紹了XYZ色彩空間與rgb色彩空間的正變換和逆變換,為方便讀者理解,給出了具體的計算公式和實際源碼。VC圖形圖像處理編程博大精深,有任何建議歡迎留言討論,后續文章我們將繼續介紹VC編程實現其它色彩空間之間的相互轉換。

RGB彩色工業標準到CIEXYZ空間轉換示例:

[html] view plain copyclc;  close all;  clear all;  rgb = imread('lena.bmp');  subplot(2,3,1),imshow(rgb,'InitialMagnification','fit');title('原圖像');  rgb =double(rgb);%雙精度化(0-255)  x = 0.607*rgb(:,:,1)+0.174*rgb(:,:,2)+0.201*rgb(:,:,3);  x = mat2gray(x);%把矩陣轉化為灰度圖像  y = 0.299*rgb(:,:,1)+0.587*rgb(:,:,2)+0.114*rgb(:,:,3);  y = mat2gray(y);  z = 0.066*rgb(:,:,2)+0.117*rgb(:,:,3);  z = mat2gray(z);  xyz = cat(3,x,y,z);%把x,y,z連在一起  subplot(2,3,3),imshow(xyz);title('XYZ圖像');  subplot(2,3,4),imshow(x);title('X圖像');  subplot(2,3,5),imshow(y);title('Y圖像');  subplot(2,3,6),imshow(z);title('Z圖像');  運行結果:

注:Matlab中沒有lena.bmp文件,可以從網上下載,此外imshow(rgb,'notruesize')在Matlab2012中不在支持應改為 imshow(rgb,'InitialMagnification','fit')。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 沙湾县| 富锦市| 富裕县| 海兴县| 墨玉县| 宜君县| 连江县| 泽普县| 邵武市| 邹平县| 新竹县| 台东市| 平湖市| 虎林市| 南召县| 肇源县| 都江堰市| 鹤壁市| 龙井市| 交城县| 班戈县| 安溪县| 宜黄县| 高台县| 交口县| 开鲁县| 含山县| 通城县| 读书| 金乡县| 社旗县| 左权县| 峨边| 自贡市| 星座| 平度市| 郴州市| 博白县| 岗巴县| 乡城县| 万宁市|