史萊姆論壇

返回   史萊姆論壇 > 教學文件資料庫 > 應用軟體使用技術文件
忘記密碼?
論壇說明

歡迎您來到『史萊姆論壇』 ^___^

您目前正以訪客的身份瀏覽本論壇,訪客所擁有的權限將受到限制,您可以瀏覽本論壇大部份的版區與文章,但您將無法參與任何討論或是使用私人訊息與其他會員交流。若您希望擁有完整的使用權限,請註冊成為我們的一份子,註冊的程序十分簡單、快速,而且最重要的是--註冊是完全免費的!

請點擊這裡:『註冊成為我們的一份子!』

Google 提供的廣告


 
 
主題工具 顯示模式
舊 2005-04-30, 07:55 PM   #1
psac
榮譽會員
 
psac 的頭像
榮譽勳章
UID - 3662
在線等級: 級別:30 | 在線時長:1048小時 | 升級還需:37小時級別:30 | 在線時長:1048小時 | 升級還需:37小時級別:30 | 在線時長:1048小時 | 升級還需:37小時級別:30 | 在線時長:1048小時 | 升級還需:37小時級別:30 | 在線時長:1048小時 | 升級還需:37小時
註冊日期: 2002-12-07
住址: 木柵市立動物園
文章: 17381
現金: 5253 金幣
資產: 33853 金幣
預設 MPEG視瀕壓縮原理及其實現

前言:

剛剛看完了Silky sama的聖經系列,佩服之至!終於理解了什麼叫「成竹在胸」了……好想找Silky sama給簽個名
看的程序中有這樣一個感覺,就是美則美矣,了則未了。也許silky sama太忙,無法把視瀕壓縮做一完整的描述,只能採用就事論事的方法提到很多知識點。這未免是一個遺憾
我希望能給大家整理出一套MPEG標準下的視瀕處理全流程,並對這個流程中的各步驟的實現也做一論述。


這樣的話,當大家再看Silky sama的聖經的時候,可以跟我的這篇拙作對照看。如果您看了本文後覺得能加深對聖經的理解,我就感到很欣慰了。

為避免過於課本化而讓大家感到頭暈看不下去,我爭取用最易於理解的說法描述一系列的專有術語。 請原諒我沒有silky sama那樣好的表述力, 說不好的地方大家多補充~

--------------------------------------------------------------------------------------------------------

關鍵詞:
MPEG, 結構層, DCT/iDCT, 量化矩陣, 編碼

--------------------------------------------------------------------------------------------------------

第一個問題:MPEG之前世今生

很簡單。 MPEG=運動圖像專家組(Moving Picture Experts Group)的簡稱。90年7月到94年11月,一群老頭在國際標準化組織(ISO)和國際電工委員會(IEC)聯合技術委員會(JTC)經過乏味而冗長的技術討論後制定了這一標準。ISO使用權發佈,所以作為全球公認的行業標準得到業內遵守。


MPEG是幹什麼的?

MPEG可以完成對視瀕和音瀕的壓縮。這裡我們當然只談視瀕壓縮部分。


那具體怎麼進行壓縮呢?

實際上壓縮要幹的事情就是去除訊息源的3重冗余度。包括:空間冗余度、時間(動態)冗余度、結構(靜態)冗余度

同一畫格訊源圖像中相鄰像素之間的幅度值相近,即同一行上的相鄰像素之間幅值相近,相鄰行之間同樣位置上的像素幅值相近。


這被稱為圖像的空間冗余度;
相鄰兩畫格訊源圖像同一位置上像素幅度值相近,體現了訊源圖像的時間(動態)冗余度;
訊源圖像上每個像素所用bit數的多少表示了比特結構,多用的比特數為冗余量,體現了靜態(結構)冗余度。

MPEG是怎樣去除這些冗余度的呢?它主要從兩個方面入手:

1、利用圖像信號的統計特性進行壓縮

也就是:

採用運動補償(MC)去除時間冗余度;
採用離散餘弦變換(DCT)和游程長度編碼(RLC)去除空間冗余度;
採用可變長度編碼(VLC)去除靜態(比特結構)冗余度
這3種計算的具體實現我等一下會講到。現在你只需要明白,它們其實並不太複雜,至少不像它們的名字那樣讓人望而生畏

2、利用人的視覺生理特性設計壓縮

人眼對構成圖像的不同頻率成分、物體的不同運動程度等具有不同的敏感度,這是由人眼的視覺生理特性所決定的,如人的眼睛含有對亮度敏感的柱狀細胞1.8億個,含有對色彩敏感的椎狀細胞0.08億個,由於柱狀細胞的數量遠大於椎狀細胞,所以眼睛對亮度的敏感 程度要大於對色彩的敏感程度。據此,可控制圖像適合於人眼的視覺特性,從而達到壓縮圖像資料量的目的。


例如,人眼對低頻信號的敏感程度大於對高頻信號的敏感程度,可用較少的bit數來表示高頻信號;人眼對靜態物體的敏感程度大於對動態物體的敏感程度,可減 少表示動態物體的bit數;人眼對亮度信號的敏感程度大於對色度信號的敏感程度,可在行、畫格方向縮減表示色度信號的bit數;人眼對圖像中心訊息的敏感程度大於對圖像邊緣訊息的敏感程度,可對邊緣訊息少分配bit數;人眼對圖像水準向及垂直向訊息敏感於傾 斜向訊息,可減少表示傾斜向訊息高頻成分的bit數等。



在實際工作中,由於眼睛對亮度、色度敏感程度不一樣,故可將其分開處理。 (這一段引用2003年度北京廣播學院電視工程專業教材)
所以我們將單元份量RGB改變為YUV(或YCrCb)全局份量,在編碼時強調亮度訊息,可去掉一些色度訊息,如4:4:4變為4:2:2,這就意味著改變了視瀕的比特結構。去處掉的就是所謂的靜態(比特結構)冗余度了。

引用教才部分所說的這個辦法,把結構冗余訊息去除(RGB->YUV),就可以實現適度的壓縮。去除結構冗余度對圖像品質無影響,所以可以稱作「無損壓縮」。



但是無損壓縮的壓縮比不高,壓縮能力有限。


為了提高度壓縮比,MPEG標準採用了對圖像品質有損傷的「有損壓縮」技術,即上面說的去除時間和空間的冗余度。這些是 要付出代價的----但這個帳很划算


那麼How to 去除時間和空間的冗余度呢?

仔細說說上面那幾個算法吧~ 可能需要一點點離散數學/高等數學基礎,您才能較好理解 不過就算不是很明白也無所謂,您只需要瞭解這些處理所起的作用就Ok了~

首先說運動補償預測。這個好像是這裡和ccf的會員們最熟悉的一環了,懂得人多我更要小心描述了

什麼叫運動補償呢?將前一圖像畫格的相應的塊(microblock)按求得的運動向量進行位移,這就是運動補償程序。為了壓縮視瀕信號的時間冗余度,MPEG採用了運動補償預測(Motion Compensated Prediction)。


運動補償預測假定:通過把畫面以一定的提前時間(pre)平移,可以局部地預測當前畫面。這裡的局部意味著在畫面內的每個地方位移的幅度和方向可以是不相同的。

採用運動估值的結果進行運動補償,以便盡可能地減小預測誤差。運動估值包括了從視瀕序列中提取運 動訊息的一套技術,該技術與所處理圖像序列的特點決定著運動補償效能的優劣。



所謂預測,實際上是由前一(n-1)圖像畫格匯出當前(n)畫格所考慮像素的預測值,而後由運動向量編碼傳輸n畫格的實際像素值與其預測值之間的差值。

例如,設巨集塊(MB)為M×N的矩形塊,將(n-1)畫格的巨集塊與n畫格的巨集塊進行比較。


這實際上是一個進行巨集塊匹配的運動補償程序,即將n畫格中16×16像素的巨集塊與n-1畫格中限定搜尋區(SR)內全部16×16像素的巨集塊進行比較。


這一程序試圖判斷在n-1畫格的那個MB到n畫格中運動到了哪裡。若n-1畫格圖像亮度信號為f [n -1 (i , j)],n畫格圖像亮度信號為f [ n (i , j)],其中(i , j)為n畫格的M×N巨集塊的任意位置,並將n畫格中的一個M×N的巨集塊看作是從n-1畫格中平移而來的,而且規定同一個巨集塊內的所有像素都具有同樣的位移值(k,l) 。



這樣,通過在n-1畫格限定搜尋區(SR)內進行搜尋,總可以搜尋到某一巨集塊,使得該巨集塊與n畫格中要匹配的巨集塊的差值的絕對值達到最小,並得到運動向量的運動資料,在n-1畫格和運動資料的控制下,獲得n畫格的一個相應的預測值。


照此辦理,直到n畫格的M×N巨集塊的任意位置(i , j)的像素全部通過n-1畫格的像素預測出來。



大家都知道,不緊緊是n和n-1這樣相鄰的兩畫格可以進行MCP,實際上MPEG-1和MPEG-2可以當前畫格之前若干畫格的某一畫格為基準進行MCP。



為了改善預測效果,可以採用分場預測。這一點在silky sama的聖經裡說的很清楚了。
需要說明的是:
MPEG定義了關於畫格、關於場及雙場的圖像預測,也定義了16×8的運動補償。


對逐行掃瞄方式,可以採用關於畫格的圖像預測;隔行掃瞄方式,也可以採用關於場的圖像預測。


因此,MPEG-2編碼器要對每個圖像先判斷是畫格模式壓縮還是場模式壓縮。

在隔行掃瞄方式下:
運動少的場景時,採用關於畫格的圖像預測,因為關於畫格的圖像兩相鄰行間幾乎沒有位移,畫格內相鄰行間相關性強於場內相關性,從整個畫格中去除的空間冗余度比從個別場中去除得多;劇烈運動 的場景時,採用關於場的圖像預測,因為關於畫格的相鄰兩行間存在1場延遲時間,相鄰行像素間位移較大,畫格內相鄰行間相關性會有較大下降,關於場的圖像兩相鄰行間相關性強於畫格內相鄰行間相關性,在1畫格內,場間運動有很多高頻份量(silky重點提過),從場間 去除的高頻份量比從整個畫格中去除的多。



由上述可見,選項關於畫格的圖像預測還是關於場的圖像預測的關鍵是行間相關性。

所以,在進行DCT之前,要作畫格DCT編碼或場DCT編碼的選項,對16×16 的原圖像或亮度進行運動補償後所獲得的差值作畫格內相鄰行間和場內相鄰行間相關係數的計算。若畫格內相鄰行間相關係數大於場內相鄰行間相關係數,就選項畫格DCT編碼,反之選場DCT編碼。

So , about DCT………

MPEG採用了Ahmed(一個巨牛的數學家) 等人於70年代提出的離散餘弦變換(DCT-Discrete Cosine Transform)壓縮算法,降低視瀕信號的空間冗余度。


DCT將運動補償誤差或原畫面訊息塊轉換成代表不同頻率份量的係數集,這有兩個優點:其一,信號常將其能量的大部分集中於頻率域的1個小範圍內,這樣一來,描述不重要的份量只需要很少的比特數;其二,頻率域分解映射了人類視覺系統的處理程序,並允許後繼的 量化程序滿足其靈敏度的要求。



關於這一點在我手頭的教學中有詳盡的描述,讓我直接引用:

視瀕信號的頻譜線在0-6MHz範圍內,而且1幅視瀕圖像內包含的大多數為低頻頻譜線,只在占圖像區域比例很低的圖像邊緣的視瀕信號中才含有高頻的譜線。


因此,在視瀕信號數位處理時,可根據頻譜因素分配比特數:
對包含訊息量大的低頻譜區域分配較多的比特數,對包含訊息量低的高頻 譜區域分配較少的比特數,而圖像品質並沒有可察覺的損傷,達到碼率壓縮的目的。



然而,這一切要在低熵(Entropy)值的情況下,才能達到有效的編碼。能否對一串資料進行有效的編碼,取決於每個資料出現的概率。每個資料出現的概率差別大,就表明熵值低, 可以對該串資料進行高效編碼。反之,出現的概率差別小,熵值高,則不能進行高效編碼。


視瀕信號的數位化是在規定的取樣頻率下由A/D轉換器對視瀕電平轉換而來的,每個像素的視瀕信號幅度隨著每層的時間而週期性地變化。


每個像素的平均訊息量的總和為總平均訊息量,即熵值。

由於每個視瀕電平發生幾乎具有相等的概率,所以視瀕信號的熵值很高。


熵值是一個定義碼率壓縮率的參數,視瀕圖像的壓縮率依賴於視瀕信號的熵值,在多數情況下視瀕信號為高熵值,要進行高效編碼,就要將高熵值變為低熵值。怎樣變成低熵值呢?

這就需要分析視瀕頻譜的特點。

大多數情況下,視瀕頻譜的幅度隨著頻率的升高而降低。其中 低頻頻譜在幾乎相等的概率下獲得0到最高的電平。與此相對照,高頻頻譜通常得到的是低電平及稀少的高電平。顯然,低頻頻譜具有較高的熵值,高頻頻譜具有較低的熵值。


據此,可對視瀕的低頻份量和高頻份量分別處理,獲得高頻的壓縮值。

由上面的引用可見,碼率壓縮關於變換編碼和熵值編碼兩種算法。前者用於降低熵值,後者將資料變為可降低比特數的有效編碼方式。在MPEG標準中,變換編碼採用的是DCT,變換程序本身雖然並不產生碼率壓縮作用,但是變換後的頻率係數卻非常有利於碼率壓縮。


實際上壓縮數位視瀕信號的整個程序分為塊取樣、DCT、量化、編碼4個主要程序進行-----首先在時間域將原始圖像分成N(水準)×N(垂直)取樣塊,根據需要可選項4×4、4×8、8×8、8×16、16×16等塊,這些取樣的像素塊代表了原圖像畫格各像素的灰度值,其範圍在139-163之間,並依序送入DCT編碼器,以便將取樣塊由時間域轉換為頻率域的DCT係數塊。


DCT系統的轉換分別在每個取樣塊中進行,這些塊中每個取樣是數位化後的值,表示一場中對應像素的視瀕信號幅度值。
DCT和它解壓時的反運算的具體算法如下。

(我居然不能用img/img引用圖片? 暈暈,那只好請有興趣的大家自己下下來看了)

當u,v = 0 時,離散餘弦正變換(DCT)後的係數若為F(0,0)=1,則離散餘弦反變換(IDCT)後的重現函數f(x,y)=1/8,是個常數值,所以將F(0,0)稱為直流(DC)係數;當 u,v≠0時,正變換後的係數為F(u,v)=0,則反變換後的重現函數f(x,y)不是常數,此時正變換後的係數F(u,v)為交流(AC)係數。


DCT轉換的一個具體套用見下面這個圖: (偶們作員工培訓的一張幻燈片,剛好合適 )
http://pic.zingking.com/rzhy/kean/DCTpro.jpg

看上圖變換原理可察覺兩點:
其一,DCT後的64個DCT頻率係數與DCT前的64個像素塊相對應,DCT前後都是64個點,它只是1個本身沒有壓縮作用的無損變換程序。


其二,單獨1場圖像的全部DCT係數塊的頻譜幾乎都集中在最左上角的係數塊中,僅從該 塊的頻譜中就可以形成1幅壓縮圖像;DCT輸出的頻率係數矩陣最左上角的直流(DC)係數幅度最大,圖中為315,由於代表了x軸和y軸上的DC份量,所以它表示了輸入矩陣全部幅度的平均值;以DC係數為出發點向下、向右的其它DCT係數,離DC份量越遠 ,頻率越高,幅度值越小,圖中最右下角為-0.11,即圖像訊息的大部分集中於直流係數及其附近的低頻頻譜上,離DC係數越來越遠的高頻頻譜幾乎不含圖像訊息,甚至於只含雜波。顯然,DCT本身雖然沒有壓縮作用,卻為以後壓縮時的「取」、「捨」 奠定了必不可少的基礎。


到這裡MPEG的原理及實現大約說了一半。


下面該說量化過成和編碼了,這會涉及到各種畫格的構建方式和量化矩陣(Matrix)的一些知識,我原本打算弄完的,但實在手酸眼漲 ,只好有空再接著寫了。但願各位不要看的頭昏腦脹才好
__________________
http://bbsimg.qianlong.com/upload/01/08/29/68/1082968_1136014649812.gif
psac 目前離線  
送花文章: 3, 收花文章: 1631 篇, 收花: 3205 次
舊 2005-04-30, 07:59 PM   #2 (permalink)
榮譽會員
 
psac 的頭像
榮譽勳章
UID - 3662
在線等級: 級別:30 | 在線時長:1048小時 | 升級還需:37小時級別:30 | 在線時長:1048小時 | 升級還需:37小時級別:30 | 在線時長:1048小時 | 升級還需:37小時級別:30 | 在線時長:1048小時 | 升級還需:37小時級別:30 | 在線時長:1048小時 | 升級還需:37小時
註冊日期: 2002-12-07
住址: 木柵市立動物園
文章: 17381
現金: 5253 金幣
資產: 33853 金幣
預設

Q值低到幾可以認為是較好的壓縮?

使用同一個量化矩陣, Quantizer 越低壓縮得到的畫面越好
但如果使用兩個不同的矩陣的 clip A 和 B, 就不能光憑, 比如, clip A 的 Quantizer 低於 clip B 就下結論 clip A 的畫面效果比 clip B 好, 如果 A 的矩陣使用了很高 threshold 的矩陣, 而 B 使用了更加保留性的低 threshold 的矩陣, 比較同一壓縮出來的楨, 哪怕 B 的這畫格 Quantizer 比 A 高, 也很有可能畫面品質(比如 PSNR) 比 A 來的高.

通常對於 XviD 的預設 MPEG 矩陣或者 h.263 量化方法, 我們認為 I/P Quantizer 高於 4 將很難得到讓人滿意的品質。 但如果使用一個 threshold 相對很低的矩陣, 標準就要重新定義了

我還是覺得使用較低 threshold 的矩陣比較好, 尤其是文件大小不是特別重要的時候
「Q值與畫質之間的關係」。

先明確的將一下:在量化方式相同的前提下,在MPEG視瀕壓縮程序中,Q值越小畫質越高。這一點沒有疑問。 而有疑問的,是各種畫格的Q值對整體畫質而言影響力不同。(可以說有很大的差別) 但不論哪種畫格,都是Q越小越好的。

我還是詳講一下mpeg裡的Q值究竟是什麼東西。因為我感覺很多由xvid使用入手的愛好者們似乎都不太能確知Q值的意義。

首先,Q值(quantizer)在中文的資料中被譯作「量化精度」或「量化誤差」。(不是「畫面品質」哦~ )
數學上Q值的表達是為:

Qn=當前畫格的原始圖像的取樣值(fn) - 當前畫格解碼復原值(fn』)

對Mpeg,標準規定fn為此原始畫格的亮度取樣值。 而所謂的「解碼復原」實際上是把該畫格的量化以後的值進行反量化,再加上該畫格的預測值,把得到的和作為最終的輸出。
根據上面的式子,我們就能瞭解:第一,Qn所紀錄的,是這一畫格圖像在未量化之前和經過「量化-〉反量化」之後的誤差。 第二,如果訊源很差勁的話,Q值再小,壓縮前後誤差再小,畫面的視覺效果也不會好。

您的其它幾個沒有詳講的問題,都跟量化程序(Quantiation)有關,我希望先接著上面說沒有講完的部分講量化時再細說,哈哈。
psac 目前離線  
送花文章: 3, 收花文章: 1631 篇, 收花: 3205 次
 



發表規則
不可以發文
不可以回覆主題
不可以上傳附加檔案
不可以編輯您的文章

論壇啟用 BB 語法
論壇啟用 表情符號
論壇啟用 [IMG] 語法
論壇禁用 HTML 語法
Trackbacks are 禁用
Pingbacks are 禁用
Refbacks are 禁用


所有時間均為台北時間。現在的時間是 09:28 PM


Powered by vBulletin® 版本 3.6.8
版權所有 ©2000 - 2024, Jelsoft Enterprises Ltd.


SEO by vBSEO 3.6.1