隨著互聯網技術和多媒體技術的快速發(fā)展,多媒體數據的傳輸和獲取變得越來越便利,人們對高清晰度視頻圖像畫面的需求日益增長。近年來,視頻圖像的分辨率經歷了從720P到1080P再到4K的發(fā)展,4K技術逐漸進入到人們的生活。4K讓人們體驗到極致的視覺感受的同時給硬件及軟件也帶來了更高的挑戰(zhàn),這其中就包括圖像顯示過程中涉及的色彩空間轉換的問題。YUV與RGB是最常見的兩種色彩空間模型[1],兩者之間的相互轉換在數字多媒體領域尤為重要。眾所周知,4K分辨率為,長寬比為16:9,標準4K分辨率的像素總數可達800萬,為全高清1080P(1920×1080)的4倍,是720P(1280×720)的8倍。如何高效地對高分辨率視頻圖像進行色彩空間轉換,受到了該領域研究者們的廣泛關注。
目前,業(yè)界主要使用FFmpeg工具進行音視頻的開發(fā)。FFmpeg是一款開源、免費、跨平臺且功能強大的音視頻處理工具,其主要利用CPU進行音視頻數據處理,然而當數據量非常龐大時,CPU在大規(guī)模矩陣類型的數值計算上就顯得力不從心[2]。因此,近些年GPU的迅猛發(fā)展彌補了CPU在這方面的不足。GPU可以用大量的并行線程對大規(guī)模矩陣類型數值進行并行計算,其和CPU并行工作可以極大的提高音視頻處理的效率。為了測試色彩空間轉換在GPU上的工作性能,本文分別基于FFmpeg和CUDA對YUV與RGB色彩空間的轉換性能進行了對比,實驗結果表明基于CUDA的色彩空間轉換由于利用了大量的GPU并行加速有著更好的性能表現。
常用的色彩空間模型有RGB、YUV/YCrCb、CMYK、HSV等[3]。RGB是計算機視覺系統(tǒng)中最常見的色彩空間模型,圖1中的立方體形象的表示了RGB色彩空間。3個坐標軸分別對應了紅(Red)、綠(Green)、藍(Blue)3個顏色分量。原點對應黑色,距離原點最遠的頂點即為白色。黑色原點與白色頂點之間的連線為灰度線。在計算機中,RGB色彩空間的存儲方式有多種,最常見的是R、G、B每個分量采用8比特即一個字節(jié)進行表示,因此每個像素占用3個字節(jié)的內存空間,每個分量的顏色強度為0~255。RGB色彩空間總共能表示約1678萬種色彩,通常也稱為1600萬色或24位色。
圖1 RGB色彩空間模型
人眼對亮度和色彩的感知程度不同,其對色彩細節(jié)的分辨能力比對亮度細節(jié)的分辨能力低,根據這一視覺特性產生了YUV、YCbCr、YIQ等色彩空間。YUV是一種基本的色彩空間,其他的色彩空間均是從YUV衍生而來。YUV色彩空間中的Y分量指圖像的亮度成分,顯示的是灰度圖像,U和V分量為色度成分,描述的是色彩和飽和度。
YUV色彩空間有多種采樣格式,如4:4:4,4:,2:2,4:2:0,4:1:1。4:2:0格式是比較常用的,它的含義是對Y分量進行全采樣,對U和V分量在水平和垂直方向上采樣率均為在Y分量上的一半。4:2:0格式的YUV通常是平面存儲格式,其一般是先全部存儲Y分量,然后U和V的分量依次存儲。YUV被廣泛的應用于視頻會議、數字電視和DVD存儲中,本文主要采用YUV420格式進行試驗對比。
FFmpeg是一個集錄制,轉換,音、視頻頻編解碼功能為一體的完整的開源免費解決方案,它包含了非常先進的音頻/視頻編解碼庫libavcodec和用于視頻場景比例縮放、色彩空間轉換的libswscale庫[4]。FFmpeg項目的部分組成如表1所示。
表1 FFmpeg項目部分組成成員
FFmpeg采用的是主程序+核心庫的編程模式,核心庫隱藏了內部各種具體格式的實現,對外提供統(tǒng)一的調用方法,這樣主程序就不用去關注如何調用與具體格式相關的函數。本文采用libswscale庫的sws_scale函數實現對視頻圖像的格式轉換以作對比。
基于FFmpeg的色彩空間轉換完全依賴于CPU的計算,而CPU是一個負責執(zhí)行復雜邏輯處理和事務管理的單元,它并不擅長大規(guī)模矩陣類型的數值計算,而GPU恰恰相反,它可以用大量的并行線程進行處理,可以很好地彌補CPU的不足。2003年NVIDIA公司推出了CUDA架構,為GPU通用計算提供了良好的軟硬件開發(fā)環(huán)境。CUDA可以看做是專為NVIDIA GPU設計的C語言開發(fā)環(huán)境,有著豐富的套件,讓開發(fā)人員可以更加專注于自己所開發(fā)的應用[5]。
在CUDA程序中,能被GPU執(zhí)行的部分稱作內核(Kernel),整個內核由成千上萬條簡單的線程組成,并交由GPU處理,無法并行化的部分交由CPU完成。為了提高線程之間的相互協(xié)作能力同時節(jié)省顯存帶寬,CUDA將線程分成了線程(thread)、線程塊(block)和線程網格(grid)三個層次結構,圖2展示了三者之間的結構關系。在同一block里面的線程可以共享內存數據[6]。
圖2 線程、線程塊、線程網格之間的關系
YUV色彩空間與RGB色彩空間之間的轉化公式如下:
本文利用CUDA進行色彩空間轉換的核心轉換算法代碼如下:
其中,maxlongth為圖像的所有像素長度;color_space_conversion_mat數組表示色彩空間轉換矩陣;blockIdx.x表示線程塊的x索引值;blockDim.x表示線程塊中線程的x維度值;threadIdx.x表示線程的x索引值。
為了更直觀地看到兩種方法在色彩空間轉換上的效果,本文分別在不同分辨率下對轉換時間以及轉換后的主觀視覺效果進行了對比。實驗平臺為64位CentOS7操作系統(tǒng),Intel酷睿i5四核處理器,3.3 GHz主頻,32G內存。顯卡為Quadro P2000,5G顯存。表2給出了實驗對比結果,實驗數據均為對十幅圖像進行色彩空間轉
表2 兩種方法在不同分辨率下的轉換時間對比(ms)
換取均值。CUDA/IO表示加入了CPU與GPU內存數據交換的時間(內存數據交換的時間主要由總線接口(Bus interface)影響)。從表2可以看出,如果不算內存交換時間,CUDA平臺下,720P、1080P、4K的轉換時間只有0.13 ms、0.26 ms和1.12 ms,比FFmpeg高出十幾倍,然而實際工程中內存交換地損耗是不可避免的,算入IO時間,轉換時間則分別上升到了1.18 ms、2.67 ms、10.43 ms,比FFmpeg高出不到兩倍,可想而知,內存交換極大的影響了色彩空間轉換的效率。從數據中還可以分析出隨著分辨率的增加CUDA平臺下的轉換效率有上升的趨勢,從側面說明了利用CUDA進行并行計算在越大的數據量下越有優(yōu)勢。
圖3給出了兩種方法在720P分辨率下的peppers圖像和baboon圖像上進行色彩空間轉換后的主觀視覺效果對比,從圖中可以看出,基于FFmpeg和基于CUDA的兩種方法對圖像轉換的主觀視覺與原始圖像基本一致。
圖3 基于ffmpeg和CUDA的色彩空間轉換主觀視覺對比(a)peppers圖像(b)baboon圖像
本文分別基于FFmepg和CUDA平臺實現了對YUV到RGB色彩空間轉換的仿真實驗,通過實驗數據的對比分析,可知利用GPU加速可以大幅提高數據處理的工作效率,然而CPU與GPU的內存交換損耗則成為了系統(tǒng)瓶頸的關鍵因素,因此,要想提高工作效率,一是要盡力避免頻繁的內存交換;二是選擇更有效的存儲方式;三是使用CUDA內存優(yōu)化技巧。無論如何,利用CUDA對大規(guī)模矩陣數據并行處理相較于CPU都有著一定的優(yōu)勢。如果總線接口傳輸帶寬問題解決,那么世界將真正迎來計算時代新紀元。