[问题]计算10bits色温

楼主: immortal1314 (Eden)   2016-08-04 01:25:38
我要算每一个颜色与对应灰阶的色温值 但是内存不足(要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
这我想来想去想不出所以然...
作者: sunev (Veritas)   2016-08-04 02:44:00
cct0001 没用到啊?
楼主: immortal1314 (Eden)   2016-08-04 06:26:00
那本来是我要用来存color_temperature的 但后来没用到
作者: YoursEver (猪是妳)   2016-08-04 16:05:00
能不能先把你的问题描述清楚? 第一个部分就好.rgb的关系是什么? 能解释清楚些吗?还有,x,y范围是指什么?是指某颜色所对应温度的上下界吗
作者: sunev (Veritas)   2016-08-04 16:56:00
你知道你那个没用到的变量占了多少内存吗?
楼主: immortal1314 (Eden)   2016-08-04 19:34:00
x,y是在CIE1931色座标的位置假如我要5000K的色温从CIE的色座标可以看到有条5000K的线那我要的就是CIE的xy范围内有没有我算出来的解5000K的点 我要将其取出但是CIE色座标看似平面 实际上确实立体的图形 所以还要考虑其亮度Y 而Y是由R G B 也就是光的三原色得到的我所拥有的资料是红光R的x y绿光G的x y蓝光B的x y与W(就是R+G+B的光)我先反推得到RGB的Y也就是亮度再将算RGB的xyY内插从8bits转成10bits然后用RGB的xyY算出RGB的XYZ因为只有XYZ能进行加减故做此转换再用XYZ算出混色后的1931CIE座标xy 方能求解色温如果我能解出所有xy在CIE上的色温 那我要如何反推知道是哪个RGB的x yY呢? 我推不回去...本来我想用find找所有5000K(举例)的点但也只会找出当初算他们的混色后的xy 所以要再回找XYZ 然后还要再往回找RGB的xyY才是我要的跟色彩学的计算有关

Links booklink

Contact Us: admin [ a t ] ucptt.com