北方工業大學信息學院 余海鑫 丁 航 李文邦
目前大部分的視頻處理大多都是采用Avisynth這一視頻文件后期處理工具,但是從最近幾年來看,這款工具由于其代碼不規范,更新緩慢,版本更替出現各種各樣的問題而飽受非議?,F如今出現一種新興的視頻處理工具vapoursynth,由于其必須基于python的環境下,因此其代碼與python語言有著相同的規范。文章通過對vapoursynth進行了研究,采用該工具來設計實現了對視頻進行降噪與去色帶處理,在視頻編碼方面采用visualstudio調用ffmpeg包中的編碼器來對視頻進行編碼。最終處理結果符合預期效果。
隨著通信技術的不斷發展,使視頻的傳播變得更為迅捷,高效。那么視頻的傳輸與處理就相當的關鍵。視頻處理部分目前普遍使用Avisynth,其優點有很多,其內置濾鏡支持在YUV格式下進行處理,省去了將YUV文件轉到RGB文件這一過程,同時Avisynth內建大量視頻處理濾鏡,也支持第三方強力濾鏡等等。但該產品已經停滯發展了,其所使用的腳本語言是自定義的,需要重新學習。而新興的產品vaporsynth是基于python環境下的,其腳本語言也采用python語言,簡單方便。大部分Avisynth中的濾鏡都可以移植到vaporsynth中,因此使得其功能也會相當強大。視頻傳輸核心部分是視頻壓縮,而視頻編碼就是將原有視頻的圖像進行壓縮處理,去除掉冗余數據,以此達到視頻壓縮的目的。有高編碼效率的視頻可以有更高的通信效率,在傳輸的過程中也有更低的噪聲,目前最廣泛流行的視頻編碼格式當屬H.264。傳統視頻編碼采用基于塊劃分的混合編碼框架,包括幀內預測、幀間預測、變換、量化、熵編碼和環路濾波等技術模塊。本文設計實現了基于Vapoursynth和ffmpeg的視頻編輯系統,闡述了基于ffmpeg的h.264編碼的過程以及基于vapoursynth的降噪與去色帶的原理以及結果分析。
該系統包括視頻處理和視頻編碼兩個模塊,視頻處理模塊包含降噪處理與去色帶處理,整個系統的框圖如圖1所示。
圖1 系統框圖
先將視頻用vapoursynth進行降噪或者是去色帶等一系列非線性編輯處理(若視頻質量符合條件可以不進行處理)。然后對視頻進行編碼,使用visual studio調用ffmpeg包中的編碼器對視頻編碼。
實現降噪和去色帶模塊的開發工具是vapoursynth,它是可以支持開發Python腳本來進行非線性的處理的一種frameserver庫,與停滯發展的Avisynth相比,vapoursynth有支持多線程的處理工作、多種視頻編碼格式等優點。
vapoursynth下載地址為:https://github.com/vapoursynth/vapoursynth/releases
Python:下載地址為:https://www.python.org/downloads/release/python-370a4/
安裝完成python和vapoursynth及vapoursyntheditor后可在python編輯器中輸入以下代碼查看是否安裝成功:from vapoursynth import core
print(core.version())
若能輸出vapoursynth的版本信息代表安裝成功,且成功識別出已安裝的python環境。
實現視頻編碼模塊的開發工具是ffmpeg,它是一套開源多功能媒體編輯計算機程序。本文主要利用其中的libavcodec音視頻編解碼庫進行操作。安裝完成后在visual studio中新建工程并完成與ffmpeg的聯合調試即可。
ffmpeg下載地址為http://ffmpeg.org/
visual studio:下載地址為https://visualstudio.microsoft.com/zhhans/downloads
要進行視頻處理,必須要調用所需的函數,因此首先引入函數庫,調用函數讀入視頻,接著對視頻進行一系列的處理,所需的函數必須在函數庫中存在,將處理結束的視頻輸出。
本文的視頻處理方式共有兩種,分別是降噪處理和去色帶處理。2.2.1 降噪處理
首先通過MATLAB對原視頻圖像進行加噪,MATLAB的的加噪函數為:
imnoise(img1,?salt & pepper?,0.2);
該函數的第一個參數img1是需要進行處理的圖像,第二個參數是所加噪聲類型,本文使用的類型為椒鹽噪聲,還可以使用的噪聲有高斯噪聲,乘性噪聲等等,第三個參數是噪聲密度,噪聲密度越大,噪聲點越明顯,本文采用0.2使噪聲更為明顯。
通過調用vapoursynth插件中的降噪模塊實現對視頻的降噪處理,其原理為對原像素亮度值一致的像素亮度取算術平均值,以抑制噪聲方差。降噪函數為:
core.rgvs.RemoveGrain(clip,mode=4)
其中第一個參數為所要進行降噪的視頻,第二參數為降噪模式,有1~24共24個模式,不同模式的降噪方式不同,本文采用的使降噪模式4,其vapoursynth源代碼為:
import vapoursynth as vs
from vapoursynth import core#引入函數庫
file_path=?test.mp4?#文件的路徑,此為相對路徑
clip = core.lsmas.LWLibavSource(file_path,threads=1)#threads為線程數
clip = core.rgvs.RemoveGrain(clip, mode=4)#降噪函數
clip.set_output()#輸出視頻進行預覽
2.2.2 去色帶處理
色帶是由于色彩精確度不夠導致的,這里我們采用的方法是將構成色帶的像素替換為臨近像素直接的中間值,并施加抖動加噪以淡化色帶。其中抖動算法通過對周圍相鄰像素使用非均勻分布的量化誤差以達成抖動目的。去色帶函數為:
core.f3kdb.Deband(clip,range=31,y=511,cb=511,cr=511,grainy=0,grainc=0)
其中參數clip為要進行處理的視頻文件名,參數range為色帶檢測范圍,可以設0~31之間的數,參數y,cb,cr分別為亮度平面,藍色色度平面和紅色色度平面的色帶檢測閾值,可以為0~511,grainy和grainc為亮度和色度平面的抖動值,可以為0`64。
利用基于ffmpeg的視頻編碼器,可以將yuv視頻編碼成h.264壓縮編碼數據。流程圖如圖2所示。在開始之前,先將視頻轉換為yuv格式的視頻文件。然后初始化各結構體。將視頻的每一幀送入編碼器編碼。將編碼完成的數據流寫入文件。
圖2 視頻編碼流程圖
為了方便對比結果,原視頻圖像應清晰明亮,輪廓明顯,細節清楚可觀察。原視頻中的一幀圖像如圖3所示。
圖3 原圖像
可以使用MATLAB對其進行增加噪聲點,可以增加高斯噪聲,椒鹽噪聲,乘性噪聲等,如圖4所示加入了噪聲密度為0.1的椒鹽噪聲,可以看到有些輪廓已經有些模糊了,有許多零零散散的噪聲點分布在圖像中。
圖4 加噪后的圖像
使用vapoursynth處理該圖片后,采用降噪模式4的圖像如圖5所示,用第8個相鄰像素的第四個最小值和第四個最大值來對該像素進行編輯,與圖4相比可以明顯感覺到大部分的噪聲點已經被去除掉,但是與圖4相比還是能感覺到還殘有部分的噪聲點沒有去除,但總體效果上來看還是能達到目標的。
圖5 經過模式4降噪后的圖像
采用降噪模式2的圖像如圖6所示,使用第8個相鄰像素的第二個最小值和第二個最大值來對該像素進行編輯,與圖3相比還殘余有大量的噪聲點,去除的效果比較差,因此采用模式4進行降噪效果更好。
圖6 經過模式2降噪后的圖像
可以看出如圖7所示的圖像中各個顏色之間出現了塊狀的明顯色帶,接下來用vapoursynth對該圖進行去色帶處理。
圖7 具有色帶的原圖像
如圖8所示,設置色帶檢測范圍range為31,亮度平面y、藍色色度平面cb和紅色色度平面cr都設置為511,grainy和grainc代表亮度和色度平面的抖動值,設置為0即可,經過去色帶以后的圖像大部分的色帶消失,圖像顏色之間過渡平滑。經過去色帶處理后的圖像可以盡可能減小因壓縮而產生的影響。如圖9所示,將色帶檢測范圍設置為3,其他不變,處理后的圖像色帶未完全去除,依然存在較為明顯的色帶。如圖10所示,將亮度平面色帶檢測閾值設置為200,處理后的圖像也依然剩余部分色帶未清除。因此,各個參數對色帶的去除都有影響,色帶檢測范圍range越大,其去除效果越好,亮度平面與色度平面檢測閾值越大,去除效果也越好。
圖8 經過去色帶后的圖像
圖9 色帶檢測范圍為3的圖像
圖10 亮度平面色帶檢測閾值為200的圖像
圖11 原視頻幀圖像
圖12 H264編碼后視頻幀圖像
視頻編碼之前應該先播放該視頻查看視頻的清晰度是否方便對比,若是符合才可進行編碼操作,若是不符合,則應另外選則合適的視頻進行編碼。如圖11所示為原視頻中的一幀圖像。視頻清晰度符合要求,可進行下一步編碼。
經過H264編碼后的一幀圖像如圖12所示,對比編碼后的視頻與原視頻,可以看到幾乎是等同的,因此視頻編碼成功。
本文基于vapoursynth庫與H.264框架。使用降噪模塊抑制噪聲方差,將壓縮過程中產生的噪聲點去除。通過將構成色帶的像素替換為臨近像素的中間值,去除不同顏色間的色帶,使顏色之間過渡平滑。能夠有效解決視頻編碼中出現的圖像失真嚴重問題,且此視頻編碼方法具有代碼簡單易懂、容易操作的特點,可以盡可能減小失真,在視頻編碼和噪聲修復等實際應用中有較強的實用價值。本文所使用的兩種編輯方式其難點在于需要多種軟件相互協調,共同處理視頻文件,對環境的配置要求較高。