Senior Member
您的住址: El's room
文章: 1,046
|
前面提到了 YUV 的數值範圍(Y: 16~235, UV: 16~240),轉貼以前寫的一篇文章給大家參考:
=======================================
DVD/VCD/DV 等使用的 MPEG/MJPEG 壓縮,記錄的 YCbCr 格式,是遵循 ITU-R BT.601 的
建議,其資料範圍(動態範圍)為 Y(亮度)16~235,C(色度)以 128 為中心代表無色
,範圍 16~240。
做處理和顯示的時候,YCbCr 要轉為 RGB,其範圍為 16~235。
但是電腦螢幕上,純白的點,其 RGB 值為 (255,255,255),純黑的點,
其 RGB 為 (0,0,0)。所以 MPEG/MJPEG 所記錄的純白 (235,235,235) 在電腦螢幕上看起
來就不是純白,純黑 (16,16,16) 在電腦螢幕上看起來也不會是純黑。
因此 DV 錄下來的東西,拿到電腦上看,會覺得顏色變淡,好像照上了一層白紗。
同時因為資料範圍(動態範圍)縮小為 16~235,而不是全範圍(Full Scale)0~255,
所以會覺得對比不足(最亮和最暗的差距縮小),不如在電視上看漂亮。
所以在電腦上看、編輯 DV AVI,必需要先做 Y/C 伸張,也就是將 Y/C 的動態由原來的
16~235 擴展到 0~255,然後轉為 RGB 0~255,這樣在電腦螢幕上看到的顏色才會是正確的
。以此為基準作顏色校正、各種濾鏡處理,出來的結果才會是正確的。
經過 Y/C 伸張以後,然後才作各種的編輯。
最後要壓成 DVD/VCD/DV 的時候,因為仍然是存成 MPEG/MJPEG 格式,
資料範圍還是 16~235,所以已經做過 Y/C 伸張的影像在壓縮之前,必須先做 Y/C 壓縮,
把目前 RGB 0~255 的資料壓縮為 16~235,然後轉為 YCbCr 16~235,這樣才會正確。
不然超過的資料在轉為 YCbCr 16~235 的時候會被削掉(clipping),
對比、顏色會完全錯誤。
如果沒有編輯、修改畫面的必要,只是要將 DV AVI 直接做成 DVD/VCD,
則可以不必做 Y/C 伸張,直接壓縮為 DVD/VCD。
此時資料沒有做過 Y/C 伸張,所以壓縮的時候,不可以再做一次 Y/C 壓縮然後壓 MPEG,
否則做好的 DVD/VCD 即使在電視上播放,對比、顏色也會是錯的。
總結:
原始資料以 MPEG/MJPEG 儲存,為 Y/C 壓縮過的資料,
修改編輯時需先做 Y/C 伸張之後再修改。
若做過 Y/C 伸張,壓縮時需做 Y/C 壓縮,出來的畫面才是正確的。
若沒做過 Y/C 伸張,壓縮時不可以做 Y/C 壓縮,出來的畫面才是正確的。
以 TMPGEnc 這個壓縮軟體為例,壓縮時預設是接收 0~255 的 RGB 資料,
先做 Y/C 壓縮,然後才壓 MPEG。
所以如果是 YCbCr 16~235 的資料要對畫面做修改,必須使用 Descale CCIR601 這個濾鏡
(CCIR601 就是 ITU-R BT.601,CCIR 是 ITU 以前的名字),把 Luminous, Chroma 兩個
選項都推到 255(也就是做 Y/C 伸張),然後才做其他的編輯動作。
Descale CCIR601 的順位要排第一位。
然後壓縮時直接壓縮便可以得到正確的結果。
如果沒有要對畫面做修改,則不必做 Y/C 伸張,但是壓縮的時候必需要勾選
進階設定--> 量子化行列(Quantize matrix)底下的 "Basic YCbCr ?出力"
(Out YUV data as Basic YCbCr not CCIR601),這樣 TMPGEnc 壓縮時便不會
做 Y/C 壓縮,壓出來的顏色、對比才會正確。
總結:
如果原始資料是 YCbCr 16~235
有做 Y/C 伸張的話,壓縮時直接壓縮就好,不能勾選 "Basic YCbCr ?出力"。
沒有做 Y/C 伸張的話,壓縮時必須勾選 "Basic YCbCr ?出力"。
再以 Cinema Craft Encoder SP 這個壓縮軟體為例,設定選項的
"16 ??235" = TMPGEnc 不勾選 "Basic YCbCr ?出力" = 壓縮時先做 Y/C 壓縮
"0 ??255" = TMPGEnc 勾選 "Basic YCbCr ?出力" = 壓縮時不做 Y/C 壓縮
實際上 CCE SP 是用兩個不同的 YUV <--> RGB 轉換式,列在下面給有興趣的人參考:
"16 ??235"
Rd = 219*R + 16*256
Gd = 219*G + 16*256
Bd = 219*B + 16*256
Y = 77*Rd + 150*Gd + 29*Bd / 2^16
CR = (( 131*Rd - 110*Gd - 21*Bd ) / 2^16 ) +128
CB = (( -44*Rd - 87*Gd + 131*Bd ) / 2^16 ) +128
"0 ??255"
Y = 77*Rd + 150*Gd + 29*Bd / 2^8
CR = (( 131*Rd - 110*Gd - 21*Bd ) / 2^8 ) +128
CB = (( -44*Rd - 87*Gd + 131*Bd ) / 2^8 ) +128
而 YC 伸張的計算式是(簡略)
Y' = (Y - 16) * 255 / (235 - 16)
C' = C * 255 / (255 - (240-16))
再來探討兩個問題,第一個是 DV Codec 在輸出資料給壓縮軟體時,可能會輸出兩種格式
,第一種是直接輸出 YUV 4:1:1,由壓縮軟體自己去做 YUV --> RGB 的轉換。
第二種是由 Codec 內部先做 YUV --> RGB 轉換,再輸出 RGB 給壓縮軟體。
如果 Codec 是輸出 YUV 4:1:1,則轉換後的 RGB 範圍是 0~255(有做 Y/C 伸張)
還是 16~235(沒做 Y/C 伸張),由執行轉換的壓縮軟體決定。
如 TMPGEnc 的環境設定的選項中,有針對 Canopus DV Codec 做設定,提供你選擇,
YUV --> RGB 轉換時,要用哪一種轉換式。有三種,Basic YCbCr,CCIR601,YUV。
如果是由 Codec 做轉換,輸出 RGB,則是否做伸張由 Codec 決定。
不同 Codec 有不同作法,是否有做伸張必須要做實驗才能確定。
如果 YUV --> RGB 時已經做過伸張,則 RGB 資料已經是 0~255 的範圍,
就不可以再用 Descale CCIR601 濾鏡,否則會有許多資料破表被削掉,切記。
第二個問題,壓縮軟體壓縮時,是否會先做 Y/C 壓縮?
如 MS MPEG-4 Codec,DivX Codec,XviD Codec 這幾個 Codec 都是假設收到的資料是
0~255,會先做 Y/C 壓縮的動作。那麼其他 Codec 和壓縮軟體呢?
這個也必須要做實驗確認才能確定。
唯有解壓縮和壓縮的轉換式能正確搭配(做過 Y/C 伸張壓縮時就必須做 Y/C 壓縮,
沒做 Y/C 伸張壓縮時就不可以做 Y/C 壓縮)最後壓出來的成品才會是正確的。
|