。。。。。etc 时域错误隐藏个人理解
三個(gè)文件名以 erc 開(kāi)頭的文件就是 EC 相關(guān)的文件。EC 的入口在 exit_picture 函數(shù)中,從 ercStartSegment 開(kāi)始到 ercConcealInterFrame 結(jié)束。你自己做一個(gè)丟包之后的碼流,把程序跑起來(lái)跟蹤一下 EC 過(guò)程,慢慢分析代碼。
?
錯(cuò)誤隱藏過(guò)程在整個(gè)幀全部解碼后,而且位于環(huán)狀濾波過(guò)程之后。
?????? 因?yàn)楹陦K按掃描順序一行一行的編解碼,錯(cuò)誤碼流會(huì)影響一連串的宏塊。因此,錯(cuò)誤隱藏時(shí),一般在當(dāng)前幀解碼結(jié)束后,一列一列的錯(cuò)誤隱藏。又由于人眼對(duì)圖像中間區(qū)域更敏感,故常從兩側(cè)邊緣開(kāi)始對(duì)宏塊列進(jìn)行掩藏,再逐漸向中央逼近,掩藏塊的運(yùn)動(dòng)矢量可以進(jìn)一步為后續(xù)處理塊提供預(yù)測(cè)信息,從而這樣做使得圖像中間誤碼塊的恢復(fù)效果更好些。
?????? 所謂時(shí)域錯(cuò)誤隱藏,就是根據(jù)正確解碼的鄰塊或前幀塊信息,推測(cè)得到合適的當(dāng)前誤碼塊運(yùn)動(dòng)矢量。該運(yùn)動(dòng)矢量對(duì)應(yīng)的參考?jí)K直接拷貝至當(dāng)前塊位置,就完成了錯(cuò)誤隱藏過(guò)程。可見(jiàn),關(guān)鍵問(wèn)題在于如何找到合適的運(yùn)動(dòng)矢量。
??????? 最簡(jiǎn)單的時(shí)域錯(cuò)誤隱藏,就是設(shè)定每個(gè)錯(cuò)誤宏塊的運(yùn)動(dòng)矢量都是零,這樣對(duì)于靜止塊和準(zhǔn)靜止塊有效,對(duì)于運(yùn)動(dòng)較大的塊這出現(xiàn)了明顯的質(zhì)量下降。一個(gè)稍稍改進(jìn)的方法是:設(shè)定其運(yùn)動(dòng)矢量為鄰塊運(yùn)動(dòng)矢量、或它們的中值、或均值運(yùn)動(dòng)矢量,對(duì)于運(yùn)動(dòng)矢量場(chǎng)連續(xù)的序列效果較好,對(duì)于復(fù)雜運(yùn)動(dòng)序列依然效果較差。
?????? 改進(jìn)方法1:得到多個(gè)候選運(yùn)動(dòng)矢量。比如,所有的鄰塊(4領(lǐng)域或8領(lǐng)域)運(yùn)動(dòng)矢量、它們的中值和均值、運(yùn)動(dòng)矢量、前一幀對(duì)應(yīng)塊運(yùn)動(dòng)矢量....。然后根據(jù)匹配準(zhǔn)則選擇代價(jià)最小的運(yùn)動(dòng)矢量。常用的準(zhǔn)則就是邊界匹配法(BMA,boundary matching algorithm),就是選擇邊界像素和誤碼塊周?chē)噜彽南袼夭钪底钚〉膲K。JM中正是這么做的,它的候選運(yùn)動(dòng)矢量只考慮了4鄰域的鄰塊運(yùn)動(dòng)矢量和零運(yùn)動(dòng)矢量。
??????? 改進(jìn)方法2:方法1中的BMA準(zhǔn)則,參與計(jì)算差異的像素個(gè)數(shù)較少,容易受到噪聲干擾。而且,如果本來(lái)宏塊邊界就存在物體邊緣,BMA的匹配效果將大打折扣。一個(gè)替代的準(zhǔn)則是外邊界匹配法(EBMA,external boundary matching algorithm)。就是計(jì)算參考?jí)K和誤碼塊的外部相鄰像素的差異。
?????? 改進(jìn)方法3:方法1中得到的運(yùn)動(dòng)矢量,一般并不是誤碼塊的真實(shí)運(yùn)動(dòng)矢量。因此可以用加入運(yùn)動(dòng)估計(jì)過(guò)程,得到更佳的匹配塊。
?????? 改進(jìn)方法4:以往的算法中,一般以整個(gè)宏塊為單元做錯(cuò)誤隱藏(JM中就是這么做的)。可以將宏塊分成多個(gè)小塊(比如4個(gè)8*8塊),對(duì)每個(gè)小塊分別做錯(cuò)誤隱藏,效果更好。但是這樣做,會(huì)出現(xiàn)一定的塊效應(yīng)。因此,一個(gè)更折衷的方法是根據(jù)鄰塊的編碼模式推測(cè)誤碼塊的隱藏塊模式。
?????? 改進(jìn)方法5:由于H.264中采用了更小的宏塊分割模式(最小支持到4*4),這樣使得編碼后的運(yùn)動(dòng)矢量場(chǎng)更佳連續(xù),即塊與塊的運(yùn)動(dòng)矢量相關(guān)性更大。可以將誤碼塊分成16個(gè)4*4塊,每個(gè)4*4塊的運(yùn)動(dòng)矢量由周?chē)陦K的運(yùn)動(dòng)矢量插值得到。一般是水平、垂直方向各插值一遍,然后取二者的均值。
?????? 改進(jìn)方法6:在b、p幀中,也有一定的幀內(nèi)編碼塊。同樣,錯(cuò)誤隱藏的時(shí)候,也可以考慮空域錯(cuò)誤隱藏方法。關(guān)鍵是如何判斷用空域還是時(shí)域隱藏。研究比較多的是,對(duì)I slice的宏塊(第一幀除外)也進(jìn)行時(shí)域隱藏,前提是要判斷沒(méi)有出現(xiàn)場(chǎng)景轉(zhuǎn)換。
補(bǔ)充一點(diǎn),時(shí)域錯(cuò)誤隱藏也可以被應(yīng)用于intra frame。h.264的對(duì)于intra-frame的weighted pixel averaging(WPA)插補(bǔ)錯(cuò)誤隱藏算法不能取得良好的效果,時(shí)域錯(cuò)誤隱藏往往能取得比WPA更好的結(jié)果。
Q1:風(fēng)車(chē),能不能推薦幾篇文章是講通過(guò)相鄰宏塊的編碼模式推測(cè)丟失塊類型的???
A:
A New Temporal Error Concealment Method for H.264 using Adaptive Block Sizes
A New Error Concealment algorithm for H.264 Video?? Transmission
Q:改進(jìn)方法3:方法1中得到的運(yùn)動(dòng)矢量,一般并不是誤碼塊的真實(shí)運(yùn)動(dòng)矢量。因此可以用加入運(yùn)動(dòng)估計(jì)過(guò)程,得到更佳的匹配塊。不太明白如何進(jìn)行運(yùn)動(dòng)估計(jì),哪位高手指點(diǎn)下
A:就是說(shuō)在做錯(cuò)誤隱藏時(shí)采用一種類似于運(yùn)動(dòng)估計(jì)的方法,比如你有一個(gè)丟失的宏塊,你可以用這個(gè)丟失宏塊的臨近宏塊的邊界像素在前一幀中進(jìn)行邊界匹配計(jì)算,在 一定的范圍內(nèi)進(jìn)行遍歷。最后得到的邊界匹配失真最小的宏塊就可以用來(lái)替代丟失的宏塊。這個(gè)過(guò)程 和運(yùn)動(dòng)估計(jì) 有些相似。
總結(jié)
以上是生活随笔為你收集整理的。。。。。etc 时域错误隐藏个人理解的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: FFMPEG设置 cbr讨论
- 下一篇: 程序员的本质