看板 MATLAB 關於我們 聯絡資訊
我要算每一個顏色與對應灰階的色溫值 但是記憶體不足(要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
sunev: cct0001 沒用到啊? 08/04 02:44
immortal1314: 那本來是我要用來存color_temperature的 但後來沒 08/04 06:26
immortal1314: 用到 08/04 06:26
YoursEver: 能不能先把你的問題描述清楚? 第一個部分就好. 08/04 16:05
YoursEver: rgb的關係是什麼? 能解釋清楚些嗎? 08/04 16:06
YoursEver: 還有,x,y範圍是指什麼?是指某顏色所對應溫度的上下界嗎 08/04 16:08
sunev: 你知道你那個沒用到的變數佔了多少記憶體嗎? 08/04 16:56
immortal1314: x,y是在CIE1931色座標的位置 08/04 19:34
immortal1314: 假如我要5000K的色溫 08/04 19:34
immortal1314: 從CIE的色座標可以看到有條5000K的線 08/04 19:34
immortal1314: 那我要的就是CIE的xy範圍內有沒有我算出來的解5000K 08/04 19:34
immortal1314: 的點 我要將其取出 08/04 19:34
immortal1314: 但是CIE色座標看似平面 實際上確實立體的圖形 所以 08/04 19:34
immortal1314: 還要考慮其亮度Y 而Y是由R G B 也就是光的三原色得 08/04 19:34
immortal1314: 到的 08/04 19:34
immortal1314: 我所擁有的資料是 08/04 19:34
immortal1314: 紅光R的x y 08/04 19:34
immortal1314: 綠光G的x y 08/04 19:34
immortal1314: 藍光B的x y 08/04 19:34
immortal1314: 與W(就是R+G+B的光) 08/04 19:34
immortal1314: 我先反推得到RGB的Y也就是亮度 08/04 19:34
immortal1314: 再將算RGB的xyY內插從8bits轉成10bits 08/04 19:34
immortal1314: 然後用RGB的xyY算出RGB的XYZ 08/04 19:34
immortal1314: 因為只有XYZ能進行加減故做此轉換 08/04 19:34
immortal1314: 再用XYZ算出混色後的1931CIE座標xy 方能求解色溫 08/04 19:34
immortal1314: 如果我能解出所有xy在CIE上的色溫 那我要如何反推 08/04 19:41
immortal1314: 知道是哪個RGB的x yY呢? 我推不回去...本來我想用f 08/04 19:41
immortal1314: ind找所有5000K(舉例)的點但也只會找出當初算他們 08/04 19:41
immortal1314: 的混色後的xy 所以要再回找XYZ 然後還要再往回找RG 08/04 19:41
immortal1314: B的xyY才是我要的 08/04 19:41
immortal1314: 跟色彩學的計算有關 08/04 19:47