【數字視頻技術介紹】| 消除冗餘 之 顏色模型

公衆號回覆:666,領取學習資源大禮包

這是一份循序漸進的視頻技術的介紹,來自 Github 倉庫:

https://github.com/leandromoreira/digital_video_introduction

本文檔旨在儘可能使用淺顯的詞語,豐富的圖像和實際例子介紹數字視頻概念,使這些知識能適用於各種場合。

有興趣瞭解更多內容的同學可以下載倉庫源碼,這裏只做摘錄,僅供參考。

往期內容:

  1. 數字視頻技術介紹 之 基本術語

消除冗餘

我們認識到,不對視頻進行壓縮是不行的;一個單獨的一小時長的視頻,分辨率爲 720p 和 30fps 時將需要 278GB*。僅僅使用無損數據壓縮算法——如 DEFLATE(被PKZIP, Gzip, 和 PNG 使用)——也無法充分減少視頻所需的帶寬,我們需要找到其它壓縮視頻的方法。

*我們使用乘積得出這個數字 1280 x 720 x 24 x 30 x 3600 (寬,高,每像素比特數,fps 和秒數)

爲此,我們可以利用視覺特性:和區分顏色相比,我們區分亮度要更加敏銳。時間上的重複:一段視頻包含很多隻有一點小小改變的圖像。圖像內的重複:每一幀也包含很多顏色相同或相似的區域。

顏色,亮度和我們的眼睛

我們的眼睛對亮度比對顏色更敏感,你可以看看下面的圖片自己測試。

luminance vs color

如果你看不出左圖的方塊 A 和方塊 B 的顏色是相同的,那麼好,是我們的大腦玩了一個小把戲,這讓我們更多的去注意光與暗,而不是顏色。右邊這裏有一個使用同樣顏色的連接器,那麼我們(的大腦)就能輕易分辨出事實,它們是同樣的顏色。

簡單解釋我們的眼睛工作的原理

眼睛是一個複雜的器官,有許多部分組成,但我們最感興趣的是視錐細胞和視杆細胞。眼睛有大約1.2億個視杆細胞和6百萬個視錐細胞。

簡單來說,讓我們把顏色和亮度放在眼睛的功能部位上。視杆細胞主要負責亮度,而視錐細胞負責顏色,有三種類型的視錐,每個都有不同的顏料,叫做:S-視錐(藍色),M-視錐(綠色)和L-視錐(紅色

既然我們的視杆細胞(亮度)比視錐細胞多很多,一個合理的推斷是相比顏色,我們有更好的能力去區分黑暗和光亮。

  

eyes composition

一旦我們知道我們對亮度(圖像中的亮度)更敏感,我們就可以利用它。

顏色模型

我們最開始學習的 彩色圖像的原理 使用的是 RGB 模型,但也有其他模型。有一種模型將亮度(光亮)和色度(顏色)分離開,它被稱爲 YCbCr*

* 有很多種模型做同樣的分離。

這個顏色模型使用 Y 來表示亮度,還有兩種顏色通道:Cb(藍色色度) 和 Cr(紅色色度)。YCbCr 可以由 RGB 轉換得來,也可以轉換回 RGB。使用這個模型我們可以創建擁有完整色彩的圖像,如下圖。

ycbcr 例子

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 模型,並以不同的方式來組織,看看下面這些放大效果:

pixel geometry

色度子採樣

一旦我們能從圖像中分離出亮度和色度,我們就可以利用人類視覺系統對亮度比色度更敏感的特點,選擇性地剔除信息。色度子採樣是一種編碼圖像時,使色度分辨率低於亮度的技術。

ycbcr 子採樣分辨率

我們應該減少多少色度分辨率呢?已經有一些模式定義瞭如何處理分辨率和合並(最終的顏色 = 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 顏色直方圖

推薦閱讀:

數字視頻技術介紹 之 基本術語

移動端技術交流喊你入羣啦~~~

推薦幾個堪稱教科書級別的 Android 音視頻入門項目

一文讀懂 YUV 的採樣與格式

UC瀏覽器視頻播放緩存以及視頻下載分析

覺得不錯,點個在看唄~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章