公衆號回覆:666,領取學習資源大禮包
這是一份循序漸進的視頻技術的介紹,來自 Github 倉庫:
https://github.com/leandromoreira/digital_video_introduction
本文檔旨在儘可能使用淺顯的詞語,豐富的圖像和實際例子介紹數字視頻概念,使這些知識能適用於各種場合。
有興趣瞭解更多內容的同學可以下載倉庫源碼,這裏只做摘錄,僅供參考。
往期內容:
消除冗餘
我們認識到,不對視頻進行壓縮是不行的;一個單獨的一小時長的視頻,分辨率爲 720p 和 30fps 時將需要 278GB*。僅僅使用無損數據壓縮算法——如 DEFLATE(被PKZIP, Gzip, 和 PNG 使用)——也無法充分減少視頻所需的帶寬,我們需要找到其它壓縮視頻的方法。
*我們使用乘積得出這個數字 1280 x 720 x 24 x 30 x 3600 (寬,高,每像素比特數,fps 和秒數)
爲此,我們可以利用視覺特性:和區分顏色相比,我們區分亮度要更加敏銳。時間上的重複:一段視頻包含很多隻有一點小小改變的圖像。圖像內的重複:每一幀也包含很多顏色相同或相似的區域。
顏色,亮度和我們的眼睛
我們的眼睛對亮度比對顏色更敏感,你可以看看下面的圖片自己測試。
如果你看不出左圖的方塊 A 和方塊 B 的顏色是相同的,那麼好,是我們的大腦玩了一個小把戲,這讓我們更多的去注意光與暗,而不是顏色。右邊這裏有一個使用同樣顏色的連接器,那麼我們(的大腦)就能輕易分辨出事實,它們是同樣的顏色。
簡單解釋我們的眼睛工作的原理
眼睛是一個複雜的器官,有許多部分組成,但我們最感興趣的是視錐細胞和視杆細胞。眼睛有大約1.2億個視杆細胞和6百萬個視錐細胞。
簡單來說,讓我們把顏色和亮度放在眼睛的功能部位上。視杆細胞主要負責亮度,而視錐細胞負責顏色,有三種類型的視錐,每個都有不同的顏料,叫做:S-視錐(藍色),M-視錐(綠色)和L-視錐(紅色)。
既然我們的視杆細胞(亮度)比視錐細胞多很多,一個合理的推斷是相比顏色,我們有更好的能力去區分黑暗和光亮。
eyes composition
一旦我們知道我們對亮度(圖像中的亮度)更敏感,我們就可以利用它。
顏色模型
我們最開始學習的 彩色圖像的原理 使用的是 RGB 模型,但也有其他模型。有一種模型將亮度(光亮)和色度(顏色)分離開,它被稱爲 YCbCr*。
* 有很多種模型做同樣的分離。
這個顏色模型使用 Y 來表示亮度,還有兩種顏色通道:Cb(藍色色度) 和 Cr(紅色色度)。YCbCr 可以由 RGB 轉換得來,也可以轉換回 RGB。使用這個模型我們可以創建擁有完整色彩的圖像,如下圖。
YCbCr 和 RGB 之間的轉換
有人可能會問,在**不使用綠色(色度)**的情況下,我們如何表現出所有的色彩?
爲了回答這個問題,我們將介紹從 RGB 到 YCbCr 的轉換。我們將使用 ITU-R 小組*建議的標準 BT.601 中的係數。
第一步是計算亮度,我們將使用 ITU 建議的常量,並替換 RGB 值。
Y = 0.299R + 0.587G + 0.114B
一旦我們有了亮度後,我們就可以拆分顏色(藍色色度和紅色色度):
Cb = 0.564(B - Y)
Cr = 0.713(R - Y)
並且我們也可以使用 YCbCr 轉換回來,甚至得到綠色。
R = Y + 1.402Cr
B = Y + 1.772Cb
G = Y - 0.344Cb - 0.714Cr
*組織和標準在數字視頻領域中很常見,它們通常定義什麼是標準,例如,什麼是 4K?我們應該使用什麼幀率?分辨率?顏色模型?
通常,顯示屏(監視器,電視機,屏幕等等)僅使用 RGB 模型,並以不同的方式來組織,看看下面這些放大效果:
色度子採樣
一旦我們能從圖像中分離出亮度和色度,我們就可以利用人類視覺系統對亮度比色度更敏感的特點,選擇性地剔除信息。色度子採樣是一種編碼圖像時,使色度分辨率低於亮度的技術。
我們應該減少多少色度分辨率呢?已經有一些模式定義瞭如何處理分辨率和合並(最終的顏色 = Y + Cb + Cr
)。
這些模式稱爲子採樣系統,並被表示爲 3 部分的比率 - a:x:y
,其定義了色度平面的分辨率,與亮度平面上的、分辨率爲 a x 2
的小塊之間的關係。
a
是水平採樣參考 (通常是 4),x
是第一行的色度樣本數(相對於 a 的水平分辨率),y
是第二行的色度樣本數。
存在的一個例外是 4:1:0,其在每個亮度平面分辨率爲 4 x 4 的塊內提供一個色度樣本。
現代編解碼器中使用的常用方案是:4:4:4 (沒有子採樣)**, 4:2:2, 4:1:1, 4:2:0, 4:1:0 and 3:1:1。
YCbCr 4:2:0 合併
這是使用 YCbCr 4:2:0 合併的一個圖像的一塊,注意我們每像素只花費 12bit。
YCbCr 4:2:0 合併
下圖是同一張圖片使用幾種主要的色度子採樣技術進行編碼,第一行圖像是最終的 YCbCr,而最後一行圖像展示了色度的分辨率。這麼小的損失確實是一個偉大的勝利。
前面我們計算過我們需要 278GB 去存儲一個一小時長,分辨率在720p和30fps的視頻文件。如果我們使用 YCbCr 4:2:0
我們能剪掉一半的大小(139GB)
*,但仍然不夠理想。
* 我們通過將寬、高、顏色深度和 fps 相乘得出這個值。前面我們需要 24 bit,現在我們只需要 12 bit。
自己動手:檢查 YCbCr 直方圖
你可以使用 ffmpeg 檢查 YCbCr 直方圖。這個場景有更多的藍色貢獻,由直方圖顯示。
ycbcr 顏色直方圖
推薦閱讀:
覺得不錯,點個在看唄~