Re: [問題]計算10bits色溫
※ 引述《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://www.ptt.cc/bbs/MATLAB/M.1470804909.A.24A.html
推
08/10 13:53, , 1F
08/10 13:53, 1F
→
08/11 00:52, , 2F
08/11 00:52, 2F
推
08/11 02:36, , 3F
08/11 02:36, 3F
推
08/11 10:23, , 4F
08/11 10:23, 4F
討論串 (同標題文章)
MATLAB 近期熱門文章
PTT數位生活區 即時熱門文章