作者YoursEver (银英传出webgame!?)
看板MATLAB
标题Re: [问题]计算10bits色温
时间Wed Aug 10 12:55:06 2016
※ 引述《immortal1314 (Eden)》之铭言:
: 恩 好的
: 首先是这样 我对一个显示面板进行量测
: 得到0~255gray level的
: 白光 W_Y W_x W_y Ex:某一阶的 W_Y=400 W_x=0.3342 W_y=0.3153
: 红光 R_x R_y Ex: R_x=0.6341 R_y=0.3412
: 绿光 G_x G_y Ex: G_x=0.3310 G_y=...
: 蓝光 B_x B_y Ex: .....
: 此为input
: (x X y Y 大写小写代表的不同)
: 然後 从结果往回看
: 为了计算CCT 需要CIE色座标的x,y
: 为了算CIE色座标的x,y 需要XYZ
: 为了得到XYZ 需要算出R_Y G_Y B_Y
: 於是乎目前流程是这样的
: 输入W的xyY 与 RGB的xy ,先算出RGB各自的Y ,
: 将RGB的xyY 转换成各自对应的XYZ(XYZ才能做混色)
: 混色後的 x=RX/(RX+GX+BX)
: y=RY/(RY+GY+BY)
: (x,y各有1021*1021*1021个组和)(省略了将0~255内插成0~1020的说明)
: 再将x,y带入CCT的公式得到色温(K)
: *******************************
: 简单流程如下:
: WxyY RGBxy----------------->
: R_Y G_Y B_Y---------------->
: XYZ------------------------>
: CIE座标上的xy-------------->
: ----->CCT(color temperature)
: *******************************
: 我要找出所有答案皆为某色温(ex:5000K)的RGB各自的xyY
: 也就是最一开始输入的RGB_xyY 是哪些组合得到目标色温的
: (目标色温每一阶0~255阶 找最接近那个 这部分我还没写到code里)
: 遇到的问题:
: 1.for 回圈 写了3层 虽然写出了所有结果 but执行起来太慢
: 2.计算结果太大 必须用实验室的电脑才跑得起来 光是xy就会吃掉14G的记忆体
: 急--> 3.即使计算完 我也想不出 怎麽往回找出是哪组R_x R_y R_Y得到我要的色温
: G_x G_y G_Y
: B_x B_y B_Y
: 解决办法:
: 1.不用for 回圈写 但又要能计算出所有结果
: 2.增加限制条件 使它不用 跑完所有的计算结果
: (1) 利用gamma2.2限制亮度 (R_Y+B_Y+G_Y,就是限制每一阶的总亮度)
: (2) 利用下一阶不会超过上一阶亮度的限制 (例如: G_Y 180阶<G181阶)
: (3) 利用各阶亮度的差不会太大 限制搜索范围
: 例如:不可能出现 R_Y的200阶 + G_Y的10阶 +B_Y
: 相差太大的结果是不可能的
: 因为会导致下一阶出现没有值可用的情况
: ..................以上方法 我都不会写
: 所以目前是用 最简单的暴力解 全部展开 再取出所有目标与对应的RGBxyY
: 却发现不知道如何找出目标色温 对应的所有RGB_xyY
: 非常感谢回复我的大神 QQ...我想很久还是百思不得解
你的程式码看起来好杂,
先把前面color transform的部分简化一下,
(1) 你的input data是 xyY representation,
你所需要的output是 XYZ representation,
所以, matlab下只需要靠 makecform 和 applycform 就可以完成,
假设你已经先排列好 W, R, G, B的 m-n-3 xyY 矩阵,
分别称为: W_xyY, R_xyY, G_xyY, B_xyY;
C = makecform( 'xyl2xyz' ); % convert xyY to XYZ;
W_XYZ = applycform( W_xyY, C);
R_XYZ = applycform( R_xyY, C);
G_XYZ = applycform( G_xyY, C);
B_XYZ = applycform( B_xyY, C);
(2) 假设你已经知道你的 目标色温 对应到某个表示法後的 区间范围
以下是pseudo code:
step-1: 建立一个mask来纪录/标记目标色温区域.
例:
Indicator = zeros( size( IMG ) );
Indicator( intersect(find(IMG<upperbound), find(IMG>lowerbound)) = 1;
step-2: 把目标区取出
Target_area = IMG .* Indicator;
(3) 我不了解你说的:
"利用各阶亮度的差不会太大 限制搜索范围
例如:不可能出现 R_Y的200阶 + G_Y的10阶 +B_Y"
(4) 比较好的做法应该是把 xyz 换到 CCT approximation上,
然後直接对 CCT domain 切出你需要的值.
切法请直接套用(2).
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 140.109.22.216
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/MATLAB/M.1470804909.A.24A.html
1F:推 sunev: (2)可改成Target_area=IMG(IMG<upperbound&IMG>lowerbound) 08/10 13:53
2F:→ YoursEver: 谢楼上提醒,中午没想太多顺手就打intersection了. orz 08/11 00:52
3F:推 sunev: 不客气,matlab难得的特色语法要多加利用才是。 XD 08/11 02:36
4F:推 immortal1314: 非常感谢大大 马上来试试看 08/11 10:23