作者immortal1314 (Eden)
看板MATLAB
标题Re: [问题]计算10bits色温
时间Fri Aug 5 01:04:53 2016
※ 引述《YoursEver (银英传出webgame!?)》之铭言:
: ※ 引述《immortal1314 (Eden)》之铭言:
: : 标题: [问题]计算10bits色温
: : 时间: Thu Aug 4 01:25:38 2016
: 先说重点:
: 你的描述方式,我看不懂你的input signal的格式.
: 先厘清你的输入信号吧.
: *****
: 请问你的input资料有哪些资讯?
: 有 R G B 吗?
: 我不懂你所说的"我所拥有的资料是, 红光R的x y, 绿光G的x y, 蓝光B的x y"
: 你是否是指以下两者之一的状况?
: (1) 先打红光,拍红光照射下的反射信号,此时会得到一组 x_r, y_r
: 再打绿光, 绿 x_g, y_g
: 最後蓝光, 蓝 x_b, y_b
: 最後这三张图,当成input signal.
: 或
: (2) 所谓的红光R的x y是依据以下的X_r, Y_r, Z_r所计算出的值:
: [ X_r ] [ ] [ R ]
: [ Y_r ] = [ A ] [ 0 ]
: [ Z_r ] [ ]3-by-3 [ 0 ],
: 而所用的输入信号,则是这个方式下所得到的x_r, y_r, x_b, y_b, x_g, y_g.
: ****
恩 好的
首先是这样 我对一个显示面板进行量测
得到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...我想很久还是百思不得解
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 122.146.82.231
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/MATLAB/M.1470330296.A.EBD.html
※ 编辑: immortal1314 (122.146.82.231), 08/05/2016 01:39:30
※ 编辑: immortal1314 (122.146.82.231), 08/05/2016 01:44:58
※ 编辑: immortal1314 (122.146.82.231), 08/05/2016 01:46:53
※ 编辑: immortal1314 (122.146.82.231), 08/05/2016 01:47:28
1F:→ YoursEver: 看起来跟从前算MURA很像,所以你是指: 08/05 10:51
2F:→ YoursEver: (0) 调整面板的输出亮度,固定量测时的输出亮度值. 08/05 10:51
3F:→ YoursEver: (1) 对 全白 画面拍照...(所以这是参考白?) 08/05 10:53
4F:→ YoursEver: (2) 加红光滤镜, 拍摄同面板同设定时的红光影像. 08/05 10:53
5F:→ YoursEver: (3) 加绿/蓝光滤镜, 拍摄同面板同设定时的绿/蓝光影像. 08/05 10:54
6F:→ YoursEver: 是这样吗? 总之你的量测器会同时量到同一个画面的 08/05 10:55
7F:→ YoursEver: 白光, 滤镜後红光, 滤镜後绿光, 滤镜後蓝光? 08/05 10:56
8F:→ YoursEver: 然後你希望根据这四组的CIEXYZ来做segmentation定色温 08/05 10:57
9F:→ YoursEver: 区域? 08/05 10:57
10F:→ immortal1314: 虽然我是用程式控制面板直接显示WRGB白红绿蓝的画 08/05 11:13
11F:→ immortal1314: 面而不是加滤镜 但是一样意思 我先让画面显示白 08/05 11:13
12F:→ immortal1314: 进行量测 08/05 11:13
13F:→ immortal1314: 再让画面显示红进行量测 08/05 11:13
14F:→ immortal1314: 再显示绿...蓝...这样 08/05 11:13
15F:→ immortal1314: 嗯 要定每一阶为同色温 08/05 11:15
16F:→ YoursEver: 那我现在剩下的问题是,你所谓的"让画面显示红",是否是 08/05 15:42
17F:→ YoursEver: 直接把原本的 White=[R, G, B] 改成 [R, 0, 0]来量? 08/05 15:43
18F:→ immortal1314: 是的 08/05 18:12
19F:→ YoursEver: 收到,我这个周末的空档会帮你想一下. 08/06 00:15
20F:→ immortal1314: 感谢~ 我还想请问一下 怎麽用for 写一个变数的回 08/07 01:50
21F:→ immortal1314: 圈 08/07 01:50
22F:→ immortal1314: 例如 g_=[1 4 9 14 17 25 31 ....1017 1021]有256 08/07 02:00
23F:→ immortal1314: 个递增的乱数 08/07 02:00
24F:→ immortal1314: for i=256:1 08/07 02:00
25F:→ immortal1314: for j=g_(i):g(i-1) 08/07 02:00
26F:→ immortal1314: (里面的函式会用1021 ~1017,...9~4, 4~1这样为范围 08/07 02:00
27F:→ immortal1314: 使用) 08/07 02:00
28F:→ immortal1314: end end 08/07 02:00
29F:→ immortal1314: 那个g就是我算来限定的范围 08/07 02:00