![]() |
|
論壇說明 | 標記討論區已讀 |
歡迎您來到『史萊姆論壇』 ^___^ 您目前正以訪客的身份瀏覽本論壇,訪客所擁有的權限將受到限制,您可以瀏覽本論壇大部份的版區與文章,但您將無法參與任何討論或是使用私人訊息與其他會員交流。若您希望擁有完整的使用權限,請註冊成為我們的一份子,註冊的程序十分簡單、快速,而且最重要的是--註冊是完全免費的! 請點擊這裡:『註冊成為我們的一份子!』 |
|
主題工具 | 顯示模式 |
![]() |
#1 |
榮譽會員
![]() |
![]() Q:
請問 RGB 轉換至 YCbCr (YUV) 的計算公式中如何替換 Cg 的? 對於每個取樣點的 R,G,B 值, 在轉換到 YUV colour space 時, 首先定義畫面的平均亮度值(Luminance), Y, 其計算公式為: Y = kr*R + kg*G + kb*B kr, kg, kb 為 weighting factors (加權因數), kr + kg + kb = 1 恆定. (其中, ITU-R BT.601 定義 kb = 0.114 和 kr = 0.299) 然後定義 Cr, Cg, Cb 為色彩強度 (colour intensity) 與這個 luminance 的差值: Cb = B − Y Cr = R − Y Cg = G − Y 這時對於一個取樣點, 完整的訊息被儲存於 Y, Cb, Cr, Cg 四個變量裡, 此時相對於 RGB colour space 的三個變量值, 這樣的計算公式還沒有優勢. 但由於 Cb + Cr + Cg 是個常數, 我們可以用其中兩個變量來表達原來所需的三個, 並且在資料的貯存和傳輸中也只需使用其中的兩個變量. 這樣, 就完成了定義 YCbCr colour space 中的三個變量了: Y, Cb, Cr. 一個在 RGB colour space 中取樣值的三個變量 R, G, B 在轉換為 YCbCr 的公式於是重新 定義/轉化 為: Y = kr*R + (1 − kb − kr )*G + kb*B........ (1) Cb = 0.5(1 − kb) / (B − Y ) Cr = 0.5(1 − kr) / (R − Y ) 然後再用公式 (1) 代換 Y, 得到僅含 R,G,B 的 Cb, Cr 函數 (kr,kb 視為常數) 作簡單的代數也可以求出從 YCbCr 轉換至 RGB 的公式: R = Y + (1 - kr)*Cr/0.5 G = Y - [kb*(1 - kb)*Cb]/ [0.5*(1 - kb - kr)] - [kr*(1 - kr)*Cr]/ [0.5*(1 - kb - kr)] B = Y + (1 - kb)*Cb/0.5 代入 ITU-R BT.601 定義的 kb = 0.114 和 kr = 0.299 那麼 RGB ---> YCbCr 的公式為: Y = 0.299R + 0.587G + 0.114B........ (2) Cb = 0.564(B − Y ) Cr = 0.713(R − Y ) 同樣地, 然後再用公式 (2) 代換 Y, 得到僅含 R,G,B 的 Cb, Cr 函數 (kr,kb 視為常數) YCbCr ---> RGB 的公式為: R = Y + 1.402Cr G = Y − 0.344Cb − 0.714Cr B = Y + 1.772Cb 兩個問題. 1. 代換 kr 由於 k 本來就是 weighting factors, 所以和由其定義為1, 理解. 但代換 Cb 是由於"Cr + Cg + Cb 為常數" , 這裡沒看懂, 為什麼 Cr + Cg + Cb 是個常數? 2. 因為注意到跟 Silky 兄很早前提到的 XviD 作 RGB ---> YUV 算式的些許出入: XviD 使用的 RGB -> YUV 算式 由 source code 可以得知,XviD 和大部分的軟體一樣是遵照這本書的標準轉換式作的 http://www.video-demystified.com/book1/index.htm 算式為 Y = (0.257 * R) + (0.504 * G) + (0.098 * B) + 16 Cr = V = (0.439 * R) - (0.368 * G) - (0.071 * B) + 128 Cb = U = -(0.148 * R) - (0.291 * G) + (0.439 * B) + 128 但 XviD 也是遵照 ITU-R bt.601 吧, 所以問一下 舉例中的 kb 和 kr 在 ITU-R bt.601 標準中的值是不是僅針對 Y: Cb: Cr = 4:4:4 的, 或緣由其他? 謝謝. A: 問題算式不同的原因是您寫的算式是模擬 YCbCr 和模擬 RGB 的轉換式,這是很多人會被弄迷糊的地方。 ITU-R BT.601 建議書裡面記載了五種色彩變換式,分別是: 1. 模擬 RGB 訊號轉為模擬 Y, (B-Y), (R-Y) 2. 模擬 (B-Y), (R-Y) 轉為模擬 Cb, Cr 3. 模擬 YCbCr 數位化(取樣、量化)成為數位 YCbCr 4. 模擬 RGB 數位化(取樣、量化)成為數位 RGB 5. 數位 RGB 轉為數位 YCbCr 1. 的變換式是 代碼:-------------------------------------------------------------------------------- Y = 0.299 * R + 0.587 * G + 0.114 * B (R - Y) = R - 0.299 * R - 0.587 * G - 0.114 * B = 0.701 * R - 0.587 * G - 0.114 * B (B - Y) = B - 0.299 * R - 0.587 * G - 0.114 * B = - 0.299 * R - 0.587 * G + 886 * B -------------------------------------------------------------------------------- 2. 的變換式是 代碼:-------------------------------------------------------------------------------- Cr = 0.713 * (R - Y) = 0.500 * R - 0.419 * G - 0.081 * B Cb = 0.564 * (B - Y) = - 0.169 * R - 0.331 * G + 0.500 * B -------------------------------------------------------------------------------- 就是你寫的那個變換式。 上式 Y, R, G, B 的範圍是 0.0~1.0,Cb, Cr 的範圍是 0.5~-0.5。 模擬的 CbCr 通常表記為 PbPr。 由於這些表記的方法很亂,常有人會混合著用,所以寫的時候最好註明是模擬還是數位,例如 3. 的模擬 YCbCr 數位化轉換式 Y(d) = 219 * Y(a) + 16 Cb(d) = 224 * Cb(a) + 128 Cr(d) = 224 * Cr(a) + 128 Y(a) 代表 analog,Y(d) 代表 digital。 4. 的模擬 RGB 數位化轉換式 R(d) = 219 * R(a) + 16 G(d) = 219 * G(a) + 16 B(d) = 219 * B(a) + 16 R(a), G(a), B(a) 的範圍是 0.0~1.0,R(d), G(d), B(d) 的範圍是 16~235。 加上 (a), (d),這樣表記就清楚多了。 5. 的數位 RGB 轉為數位 YCbCr Y = (77 * R(d) / 256) + (150 * G(d) / 256) + (29 * B(d) / 256) Cb = - (44 * R(d) / 256) - (87 * G(d) / 256) + (131 * B(d) / 256) + 128 Cr = (131 * R(d) / 256) - (110 * G(d) / 256) - (21 * B(d) / 256) + 128 YCbCr: 16~235, RGB: 16~235 這個轉換式是 straight 變換,沒有 YC 伸張(Full-range,擴展 RGB: 0~255),有 YC 伸張的算式就是你提出的我以前寫的那個算式。 這個表記法有點複雜,有的教科書在介紹亮度和色差的時候前面就先花了很多篇幅在定義表記的用法,例如我上面寫的還是不及格,因為 BT.601 的 RGB 都要先經過 gamma correction,是 gamma 校正後的 RGB,要表記為 R'G'B' ^^; 還有那個 Y,是 BT.601 的 Y,所以 Y 的右下角要加上一個底字寫 601,或者左上角要寫 601,這樣人家才知道你是 BT.601 定義的 Y,不是 BT.709 定義的 Y ^^;; 由於名詞太多有點亂,許多人會混合著用,同樣一個 YUV,有時候我們搞不清楚作者指的到底是數位的 YCbCr,還是模擬的 YPbPr,是 NTSC 的 YIQ,還是 PAL 的 YUV,是 601 的 YUV,還是 709 的 YUV,或者是 SMPTE 240M 的 YUV .... XD 有的時候作者在表記上沒有明寫,不過根據上下文意,我們可以猜出他說的是哪一個。 您看的那本書 有註明列的是 ITU-R recommendation BT.601 [1] 的 YCbCr 轉換式,所以是模擬轉換式,不是 BT.601-5。 當然用比較通用的 PbPr 來表示模擬色差是比較清楚的寫法。 ITU 的建議書(recommendation)只要登記成為會員,每年都可以免費下載三本,601, 709, H.263 ..等等都可以免費下載 http://www.itu.int/publications/bookshop/index.html 大致回覆如上 ^^;; |
![]() |
送花文章: 3,
|
主題工具 | |
顯示模式 | |
|
|
![]() |
||||
主題 | 主題作者 | 討論區 | 回覆 | 最後發表 |
(Tmpgenc)參數設定詳解 | psac | 應用軟體使用技術文件 | 1 | 2006-05-21 05:38 PM |
如何突破區域網路對上網用戶的限制 | psac | 網路軟硬體架設技術文件 | 9 | 2006-05-11 10:57 PM |
用XVID製作精品DVDRIP之菜鳥密籍 | psac | 多媒體影音轉檔燒錄技術文件 | 1 | 2004-12-03 03:11 AM |
高手請問 要如何去看YUV及.dll的內容 | tomland | 軟體應用問題討論區 | 0 | 2003-01-03 09:20 AM |