Re: [問題]計算10bits色溫

看板MATLAB作者 (銀英傳出webgame!?)時間7年前 (2016/08/10 12:55), 編輯推噓3(301)
留言4則, 3人參與, 最新討論串4/4 (看更多)
※ 引述《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
(2)可改成Target_area=IMG(IMG<upperbound&IMG>lowerbound)
08/10 13:53, 1F

08/11 00:52, , 2F
謝樓上提醒,中午沒想太多順手就打intersection了. orz
08/11 00:52, 2F

08/11 02:36, , 3F
不客氣,matlab難得的特色語法要多加利用才是。 XD
08/11 02:36, 3F

08/11 10:23, , 4F
非常感謝大大 馬上來試試看
08/11 10:23, 4F
文章代碼(AID): #1NghEj9A (MATLAB)
文章代碼(AID): #1NghEj9A (MATLAB)