[問題]計算10bits色溫

看板MATLAB作者 (Eden)時間8年前 (2016/08/04 01:25), 編輯推噓2(2029)
留言31則, 3人參與, 最新討論串1/4 (看更多)
我要算每一個顏色與對應灰階的色溫值 但是記憶體不足(要24G以上才算的完 有可能更多) 無法算完 請問有其他寫法嗎? 1.只算我想要的色溫的x,y範圍 (可以給定一個誤差是可以接受的) 但我不知道怎從色溫反推x,y 因為目標光的RGB有可能是不同灰階相加而得 所以R G B的灰階數不一定相等 R的x,y,Y G的x,y,Y B的x,y,Y 轉換成各自的XYZ後 RX+GX+BX=WX RY+GY+BY=WY RZ+GZ+BZ=WZ 再得到新的x,y,Y才有辦法算出色溫 所以用某個色溫反推 我推不回去... 2.能夠把值算完但不會撐爆記憶體 全部算完再取出我要的色溫 看用哪幾組RGB(xyY) (我目前只會這個 但是記憶體爆了 而且算超久 所以不能用) 希望能有改進的發法 data是我量測的資料 W0_x=data(:,2); W0_y=data(:,3); W0_Y=data(:,4); R0_x=data(:,10); R0_y=data(:,11); G0_x=data(:,13); G0_y=data(:,14); B0_x=data(:,16); B0_y=data(:,17); _ for i=1:256 a1(i)=(R0_x(i)-W0_x(i))/(R0_y(i)); b1(i)=(G0_x(i)-W0_x(i))/(G0_y(i)); c1(i)=(B0_x(i)-W0_x(i))/(B0_y(i)); a2(i)=(R0_y(i)-W0_y(i))/(R0_y(i)); b2(i)=(G0_y(i)-W0_y(i))/(G0_y(i)); c2(i)=(B0_y(i)-W0_y(i))/(B0_y(i)); end RY=b1.*c2-c1.*b2; GY=c1.*a2-c2.*a1; BY=a1.*b2-b1.*a2; for i=1:256 RY01(i)=RY(i)/(RY(i)+GY(i)+BY(i))*W0_Y(i); GY01(i)=GY(i)/(RY(i)+GY(i)+BY(i))*W0_Y(i); BY01(i)=BY(i)/(RY(i)+GY(i)+BY(i))*W0_Y(i); end new_R=RY01; new_G=GY01; new_B=BY01; new_W=new_R+new_G+new_B; %calculate xyY to XYZ 1 %Red R_x=data(:,10); R_y=data(:,11); R_Y=new_R; t1=0:4:1020; t1 = t1'; t=0:1:1020; t=t'; R_x=pchip(t1,R_x,t); R_y=pchip(t1,R_y,t); R_Y=pchip(t1,R_Y,t); for i=1:1021 R_X(i)=(R_x(i)*R_Y(i))/(R_y(i)); R_Z(i)=(1-R_x(i)-R_y(i))*(R_Y(i))/(R_y(i)); end %Green G_x=data(:,13); G_y=data(:,14); G_Y=new_G; G_x=pchip(t1,G_x,t); G_y=pchip(t1,G_y,t); G_Y=pchip(t1,G_Y,t); for i=1:1021 G_X(i)=(G_x(i)*G_Y(i))/(G_y(i)); G_Z(i)=(1-G_x(i)-G_y(i))*(G_Y(i))/(G_y(i)); end %Blue B_x=data(:,16); B_y=data(:,17); B_Y=new_B; B_x=pchip(t1,B_x,t); B_y=pchip(t1,B_y,t); B_Y=pchip(t1,B_Y,t); for i=1:1021 B_X(i)=(B_x(i)*B_Y(i))/(B_y(i)); B_Z(i)=(1-B_x(i)-B_y(i))*(B_Y(i))/(B_y(i)); end %calculate xyY to XYZ 2 new_X=R_X+G_X+B_X; new_Y=R_Y+G_Y+B_Y; new_Z=R_Z+G_Z+B_Z; %calculate XYZ to new xyz (for CCT) for i=1:1021 for j=1:1021 for k=1:1021 new0_x(i,j,k)=(new_X(i))/(new_X(i)+new_Y(j)+new_Z(k)); new0_y(i,j,k)=(new_Y(j))/(new_X(i)+new_Y(j)+new_Z(k)); end end end %color temperature xe=0.3366; ye=0.1735; A0=-949.86315; A1=6253.80338; t1=0.92159; A2=28.70599; t2=0.20039; A3=0.00004; t3=0.07125; cct0001=zeros(1021,1021,1021,4); for i = 1 : 1021 for j = 1 : 1021 for k = 1 : 1021 n = (new0_x(i,j,k)-xe)/(new0_y(i,j,k)-ye); ccolor_temperature(i,j,k,4)= A0+A1*exp(-n/t1)+A2*exp(-n/t2)+A3*exp(-n/t3); end end end 這我想來想去想不出所以然... -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 122.146.82.231 ※ 文章網址: https://www.ptt.cc/bbs/MATLAB/M.1470245140.A.165.html

08/04 02:44, , 1F
cct0001 沒用到啊?
08/04 02:44, 1F

08/04 06:26, , 2F
那本來是我要用來存color_temperature的 但後來沒
08/04 06:26, 2F

08/04 06:26, , 3F
用到
08/04 06:26, 3F

08/04 16:05, , 4F
能不能先把你的問題描述清楚? 第一個部分就好.
08/04 16:05, 4F

08/04 16:06, , 5F
rgb的關係是什麼? 能解釋清楚些嗎?
08/04 16:06, 5F

08/04 16:08, , 6F
還有,x,y範圍是指什麼?是指某顏色所對應溫度的上下界嗎
08/04 16:08, 6F

08/04 16:56, , 7F
你知道你那個沒用到的變數佔了多少記憶體嗎?
08/04 16:56, 7F

08/04 19:34, , 8F
x,y是在CIE1931色座標的位置
08/04 19:34, 8F

08/04 19:34, , 9F
假如我要5000K的色溫
08/04 19:34, 9F

08/04 19:34, , 10F
從CIE的色座標可以看到有條5000K的線
08/04 19:34, 10F

08/04 19:34, , 11F
那我要的就是CIE的xy範圍內有沒有我算出來的解5000K
08/04 19:34, 11F

08/04 19:34, , 12F
的點 我要將其取出
08/04 19:34, 12F

08/04 19:34, , 13F
但是CIE色座標看似平面 實際上確實立體的圖形 所以
08/04 19:34, 13F

08/04 19:34, , 14F
還要考慮其亮度Y 而Y是由R G B 也就是光的三原色得
08/04 19:34, 14F

08/04 19:34, , 15F
到的
08/04 19:34, 15F

08/04 19:34, , 16F
我所擁有的資料是
08/04 19:34, 16F

08/04 19:34, , 17F
紅光R的x y
08/04 19:34, 17F

08/04 19:34, , 18F
綠光G的x y
08/04 19:34, 18F

08/04 19:34, , 19F
藍光B的x y
08/04 19:34, 19F

08/04 19:34, , 20F
與W(就是R+G+B的光)
08/04 19:34, 20F

08/04 19:34, , 21F
我先反推得到RGB的Y也就是亮度
08/04 19:34, 21F

08/04 19:34, , 22F
再將算RGB的xyY內插從8bits轉成10bits
08/04 19:34, 22F

08/04 19:34, , 23F
然後用RGB的xyY算出RGB的XYZ
08/04 19:34, 23F

08/04 19:34, , 24F
因為只有XYZ能進行加減故做此轉換
08/04 19:34, 24F

08/04 19:34, , 25F
再用XYZ算出混色後的1931CIE座標xy 方能求解色溫
08/04 19:34, 25F

08/04 19:41, , 26F
如果我能解出所有xy在CIE上的色溫 那我要如何反推
08/04 19:41, 26F

08/04 19:41, , 27F
知道是哪個RGB的x yY呢? 我推不回去...本來我想用f
08/04 19:41, 27F

08/04 19:41, , 28F
ind找所有5000K(舉例)的點但也只會找出當初算他們
08/04 19:41, 28F

08/04 19:41, , 29F
的混色後的xy 所以要再回找XYZ 然後還要再往回找RG
08/04 19:41, 29F

08/04 19:41, , 30F
B的xyY才是我要的
08/04 19:41, 30F

08/04 19:47, , 31F
跟色彩學的計算有關
08/04 19:47, 31F
文章代碼(AID): #1NeYaK5b (MATLAB)
文章代碼(AID): #1NeYaK5b (MATLAB)