顏色空間

出自NMM Doc
跳至導覽 跳至搜尋

RIP的時候通常會遇到一些關於顏色方面的術語,比如YUV、RGB、YV12、4:2:2、4:2:0等等。不少人剛接觸到這些東西的時候,會覺得暈頭轉向,不知所云。再如,不少文章中強調影片在VDM處理的過程中要選Fast recompress,但是Fast recompress、Normal recompress、Full processing mode之間又有什麼區別呢?

本文是一篇總結性的文章,所以不少段落都是直接摘自其他的文章的。在這裡向原作者表示謝意。本文參考了原載於DVD Benchmark由Don Munsil & Stacey Spears原作的《The Chroma Upsampling Error(顏色Upsampling錯誤)》和Silky的文章。

RGB

RGB是通過紅綠藍三原色來描述顏色的顏色空間,R=Red、G=Green、B=Blue。

YUV/YCbCr/YPbPr

YUV是通過亮度-色差來描述顏色的顏色空間。

亮度信號經常被稱作Y,色度信號是由兩個互相獨立的信號組成。視顏色系統和格式不同,兩種色度信號經常被稱作UV或PbPr或CbCr。這些都是由不同的編碼格式所產生的,但是實際上,他們的概念基本相同。在DVD中,色度信號被存儲成Cb和Cr(C代表顏色,b代表藍色,r代表紅色)。

什麼是4:4:4、4:2:2、4:2:0

在最近十年中,視頻工程師發現人眼對色度的敏感程度要低於對亮度的敏感程度。在生理學中,有一條規律,那就是人類視網膜上的視網膜杆細胞要多於視網膜錐細胞,說得通俗一些,視網膜杆細胞的作用就是識別亮度,而視網膜錐細胞的作用就是識別色度。所以,你的眼睛對於亮和暗的分辨要比對顏色的分辨精細一些。正是因為這個,在我們的視頻存儲中,沒有必要存儲全部顏色信號。既然眼睛看不見,那為什麼要浪費存儲空間(或者說是金錢)來存儲它們呢?

像Beta或VHS之類的消費用錄像帶就得益於將錄像帶上的更多帶寬留給黑—白信號(被稱作「亮度」),將稍少的帶寬留給彩色信號(被稱作「色度」)。

在MPEG2(也就是DVD使用的壓縮格式)當中,Y、Cb、Cr信號是分開儲存的(這就是為什麼分量視頻傳輸需要三條電纜)。其中Y信號是黑白信號,是以全解析度存儲的。但是,由於人眼對於彩色信息的敏感度較低,色度信號並不是用全解析度存儲的。

YUV 4:4:4

(圖1)YUV 4:4:4採樣概念圖,畫面中每個象素都有與之對應的色度和亮度採樣信息。

色度信號解析度最高的格式是4:4:4,也就是說,每4點Y採樣,就有相對應的4點Cb和4點Cr。換句話說,在這種格式中,色度信號的解析度和亮度信號的解析度是相同的。這種格式主要應用在視頻處理設備內部,避免畫面質量在處理過程中降低。當圖像被存儲到Master Tape,比如D1或者D5,的時候,顏色信號通常被削減為4:2:2。

YUV 4:2:2

(圖2)YUV 4:2:2採樣概念圖。

其次就是4:2:2,每4點Y採樣,就有2點Cb和2點Cr。在這裡,每個象素都有與之對應的亮度採樣,同時一半的色度採樣被丟棄,所以我們看到,色度採樣信號每隔一個採樣點才有一個。當著張畫面顯示的時候,缺少的色度信息會由兩側的顏色通過內插補點的方式運算得到。就像上面提到的那樣,人眼對色度的敏感程度不如亮度,大多數人並不能分辨出4:2:2和4:4:4顏色構成的畫面之間的不同。

YUV 4:2:0

(圖3)非交錯的YUV 4:2:0概念圖。

圖3表示了概念上4:2:0顏色格式非交錯畫面中亮度、色度採樣信號的排列情況。同4:2:2格式一樣,每條掃描線中,只有一半的色度採樣信息。與4:2:2不同的是,不光是橫向的色度信息被「扔掉」了一半,縱向的色度信息也被「扔掉」了一半,整個屏幕中色度採樣只有亮度採樣的四分之一。同時,YUV 4:2:0是所有採樣方式中顏色解析度最低的一種。

請注意,在4:2:0顏色格式中,色度採樣被放在了兩條掃描線中間。為什麼會這樣呢?很簡單:DVD盤上的顏色採樣是由其上下兩條掃描線的顏色信息「平均」而來的。比如,圖三中,第一行顏色採樣(Line 1和Line 2中間夾著的那行)是由Line 1和Line 2「平均」得到的,第二行顏色採樣(Line 3和Line 4中間夾著的那行)也是同樣的道理,是由Line 3和Line 4得到的。

雖然文章中多次提到「平均」這個概念,但是這個「平均」可不是我們通常意義上的(a+B)/2的平均。顏色的處理有極其複雜的算法保證其最大限度地減少失真,接近原始質量。

事實上4:2:0是一個混亂的稱呼,按照字面上理解,4:2:0應該是每4點Y採樣,就有2點Cb和0點Cr,但事實上完全不是這樣。事實上,4:2:0的意思是,色度採樣在每條橫向掃描線上只有亮度採樣的一半,掃描線的條數上,也只有亮度的一半!換句話說,無論是橫向還是縱向,色度信號的解析度都只有亮度信號的一半。舉個例子,如果整張畫面的尺寸是720*480,那麼亮度信號是720*480,色度信號只有360*240。在4:2:0中,「缺失」的色度採樣不單單要由左右相鄰的採樣通過內插補點計算補充,整行的色度採樣也要通過它上下兩行的色度採樣通過內插補點運算獲得。這樣做的原因是為了最經濟有效地利用DVD的存儲空間。誠然,4:4:4的效果很棒,但是如果要用4:4:4存儲一部電影,我們的DVD盤的直徑至少要有兩英尺(六十多厘米)!

什麼是YV12,什麼是YUY2

在個人計算機上,這些YUV讀出來以後會以一些格式包裝起來,送給軟體或硬體處理。包裝的方式分成兩種,一種是Packed format,把Y和相對應的UV包在一起。另一種是Planar format,把Y和U和V三種分別包裝,拆成三個plane(平面)。

其中YV12和YUY2都是一種YUV的包裝格式,YV12是Planar format,YUY2則是Packed format。

YV12和YUY2的不同,在於YV12是YUV 4:2:0格式,也就是DVD/VCD上原本儲存的格式。YUY2則是YUV 4:2:2格式。

為什麼影片在VDM處理的過程中要選Fast recompress

選擇Fast recompress的原因,現得從Avisynth 2.5講起。

Avisynth 2.5最大的特色,就是支持YV12直接處理。我們知道原始MPEG數據是YUV4:2:0,也就是YV12的格式,以前我們在做DivX/XviD壓縮的時候,處理流程是: DVD/VCD(YUV 4:2:0) -> DVD2AVI(YUV 4:2:0 ->YUV4:2:2 ->YUV4:4:4 -> RGB24) -> VFAPI(RGB24) -> TMPGEnc/AviUtl/VirtualDub(RGB24) -> DivX/XviD Codec(RGB24 ->YUV4:2:0) -> MPEG-4(YUV 4:2:0)

(VFAPI 內部只能以 RGB24 傳遞數據,所以會轉成 RGB24 輸出)

或是

DVD/VCD(YUV 4:2:0) -> MPG2DEC.DLL(YUV 4:2:0 ->YUV4:2:2) -> Avisynth 2.0.x(只能用支援YUV4:2:2 的濾鏡,不能用 RGB24/32 的 filter) -> VirtualDub(YUV 4:2:2,不能使用 VD 的 filter,因為 VD 的 filetr 都是在 RGB32 上處理,壓縮時要選 Fast recompress,才會直接原封不動的送YUV4:2:2,也就是 YUY2 的數據給 Codec 壓縮) -> DivX/XviD Codec(YUV 4:2:2 ->YUV4:2:0) -> MPEG-4(YUV 4:2:0)

所以以前的處理流程中間要經過好幾次YUV<-> RGB 的轉換。這個轉換是有損的,做得越多次,原始的色彩信息就損失的越嚴重。而且這個轉換的計算又耗時。那麼有人(Marc FD)就想到,反正最後轉成 MPEG 都要存成YUV4:2:0 的格式,那麼為什麼不乾脆一路到底,全程都以YV12處理,也就是所有的 filter 都改寫成YV12的版本,直接在YV12上做調整色彩、濾噪訊、IVTC 等工作,這樣:

  • 處理的數據量少。(YV12的資料,UV 比YUY2少一半,比RGB 24/32少更多)
  • 不用轉換計算

所以速度快。再加上又可以避免YUV<-> RGB 轉換的損失,豈不是一舉兩得?所以支持YV12的 Avisynth 2.5 就誕生了。但是目前VirtualDub還是不支持 YV12,即使選 Fast recompress,VD還是會將YV12的輸入轉為 YUY2。所以要得到全程YV12處理的好處,必須使用VirtualDubMod才行,這個改版才有支持YV12。只有在選擇Fast recompress的時候,VDM才不會進行任何處理,直接將數據丟給編碼器壓縮,這樣就能保留YV12,實現了全程YV12。

參考文獻