| ---以往,在醫(yī)用、工業(yè)和軍事系統(tǒng)中進(jìn)行實時視頻或圖像分析時,設(shè)計師通常需要采用昂貴的專用處理器。但隨著定點、高性能嵌入式媒體處理器的出現(xiàn),使低成本的實時圖像處理成為可能。為了開發(fā)高效的算法,產(chǎn)品設(shè)計工程師需要充分利用這些處理器所提供的體系結(jié)構(gòu)特點。本文討論了數(shù)字圖像濾波算法能夠如何利用嵌入式媒體處理器體系結(jié)構(gòu)的多媒體特性。該Blackfin處理器的特點和指令集可用作一個參照,但是同樣的概念通常也適用于其他高性能媒體處理器。 ---雖然現(xiàn)在的定點處理器的時鐘速率已超過300MHz,但是僅靠增加時鐘速率并不能確保實時視頻濾波的功能,同樣重要的是針對多媒體應(yīng)用的體系結(jié)構(gòu)特性和專用視頻指令。 ---大多數(shù)視頻應(yīng)用需要處理8bit數(shù)據(jù),因為單個像素分量(無論是RGB還是YUV)通常以字節(jié)為單位的。因此,8bit視頻算術(shù)邏輯單元(ALU)和基于字節(jié)的地址數(shù)據(jù)在像素處理中會有很大不同。這一點非常重要,因為數(shù)字信號處理器(DSP)通常采用16bit或32bit數(shù)據(jù)工作。 ---另一特點是具有一個靈活的數(shù)據(jù)寄存器文件。在傳統(tǒng)的定點DSP中,字長通常是固定的。然而,數(shù)據(jù)寄存器的優(yōu)點是能以1個32bit字(例如R0)或者2個16bit字(例如,R0.L和R0.H分別代表低16位和高16位)來處理數(shù)據(jù)。這種結(jié)構(gòu)的應(yīng)用將在下面介紹。 ---專用的單周期指令可以非常方便地提供高效的多媒體編碼算法。這種應(yīng)用的一個很好的范例是“絕對差的和”指令能同時將幾個像素集之間的差值相加,從而表明在兩幀之間的場景變化有多大。  二維圖像卷積 ---由于一個視頻流實際上是一個以一定速率運(yùn)動的圖像序列,所以圖像濾波器需要足夠快的工作速率才能跟上輸入的圖像序列。因此,必須優(yōu)化圖像濾波器內(nèi)核以便占用盡可能最小的處理器周期。這可以通過分析基于二維卷積的一個簡單的圖像濾波器組來說明。 ---卷積是圖像處理中的一個基本運(yùn)算。一個給定像素的二維卷積計算是將其直接的鄰域像素的亮度按權(quán)值相加。由于一個掩碼的鄰域集中在一個給定的像素中心,所以該掩碼通常具有奇數(shù)維數(shù)。該掩碼的大小通常比圖像小,并且經(jīng)常選用一種3×3的掩碼,因為它在每個像素基礎(chǔ)上的計算是合理的,但是足夠大才可以檢測出一幅圖像的邊界。 ---3×3內(nèi)核的基本結(jié)構(gòu)如圖1a所示。例如,位于一幅圖像第20行第10列的像素卷積過程的輸出應(yīng)該是: ---Out(20,10)=A*(19,9)+B*(19,10)+C*(19,11)+D*(20,9)+E*(20,10)+F*(20,11)+G*(21,9)+H*(21,10)+I*(21,11) ---重要的是按照一種輔助計算方法來選擇系數(shù)。例如,比例系數(shù)首選是冪指數(shù)2(包括小數(shù)),因為乘法可以通過簡單的移位操作來替換。 ---圖1b~1e示出了幾種有用的3×3內(nèi)核,每一種內(nèi)核簡述如下。 ---圖1b示出的Δ函數(shù)是最簡單的圖像處理函數(shù),當(dāng)前像素不經(jīng)修改直接輸出。 ---圖1c示出了邊界檢測掩碼的兩種常用形式,第一種檢測垂直邊界,而第二種檢測水平邊界,高輸出值對應(yīng)較高的邊界出現(xiàn)。 ---圖1d的內(nèi)核是一個平滑濾波器,它計算當(dāng)前像素周圍8個像素的平均值,并且把結(jié)果放在當(dāng)前像素的位置上。它具有“平滑”或者“低通濾波”圖像的作用。 ---圖1e中的濾波器稱為“模糊掩碼”操作,它可認(rèn)為通過從當(dāng)前像素中減去一個平滑的當(dāng)前象素(通過取其相鄰的8個像素平均值得到)產(chǎn)生一個邊界增強(qiáng)的圖像。 用嵌入式媒體處理器實現(xiàn)的圖像卷積 ---進(jìn)一步討論二維卷積過程,其高階算法可按下述步驟。 ---(1)將掩碼的中心放在輸入矩陣上的一個元素上。 ---(2)位于該掩碼鄰域內(nèi)的每個像素乘以相對應(yīng)的濾波器掩碼元素。 ---(3)將每次乘法結(jié)果相加得到一個結(jié)果。 ---(4)將每次相加后的結(jié)果放在輸出矩陣中掩碼中心對應(yīng)的位置上。 ---圖2示出了3個矩陣:一個輸入矩陣f(x,y),一個3×3掩碼矩陣h(x,y)和一個輸出矩陣g(x,y)。 ---對每個的輸出點計算后,該掩碼被向右移一個元素。在圖像的邊界,該算法繞回下一行的第一個元素上。例如,當(dāng)將掩碼集中在以元素F2m為中心時,該掩碼矩陣的H23元素乘以輸入矩陣的F31元素。結(jié)果使輸出矩陣的可用部分在圖像的每個邊界都減少了1個元素。下面考慮將這樣一個濾波器放到一個處理器上的要求。 ---對于一個30幀/秒幀速率的視頻圖形陣列(VGA)(640×480像素/幀),其像素速率達(dá)到每秒920萬像素,F(xiàn)在考慮如果9次乘法和8次加法需要串行實現(xiàn),運(yùn)算速度將是(9+8)×9.2 = 156MIPS!如果加法和乘法并行執(zhí)行,那么運(yùn)算速度降低為9×9.2=83MIPS。下面的例子將說明如何節(jié)省2倍的運(yùn)算周期。  高效二維卷積實例 ---對于下面一節(jié)將描述的代碼,將主要討論完成所有乘法累加(MAC)運(yùn)算的“內(nèi)部”環(huán)路。這個示例將證明通過適當(dāng)?shù)貙R輸入數(shù)據(jù),MAC單元能夠在一個處理器周期內(nèi)每次處理兩個輸出點。在同樣的周期內(nèi),讀取多個數(shù)據(jù)可與MAC運(yùn)算并行執(zhí)行。 ---這個應(yīng)用的關(guān)鍵部分是內(nèi)部循環(huán),如圖3所示。內(nèi)部循環(huán)的每條線路都按照單周期指令執(zhí)行,輸入數(shù)據(jù)以16bit數(shù)表示。輸入矩陣的開始必須對齊32bit邊界。這確保了輸入矩陣的兩個連續(xù)點可以在一個32bit讀操作中讀出來。在進(jìn)入此循環(huán)之前,該輸入矩陣的第一個值保存在R0.H中并且它的第二個值(F12)保存在R0.L中,正如圖3示出的第一周期的前2個運(yùn)算。寄存器R1.L也要在進(jìn)入內(nèi)部循環(huán)之前裝入。它包含掩碼矩陣(H11)第一個元素的值。每經(jīng)過這樣一個循環(huán),會產(chǎn)生兩個輸出點。每兩個像素所需的總處理周期為9個,相當(dāng)于處理一個像素需要4.5個周期。 ---正如前面所述,為了獲得該輸出矩陣的每個元素,需要9次乘法和8次加法運(yùn)算。但是,由于雙MAC運(yùn)算,2個輸出元素可以在每個內(nèi)部循環(huán)結(jié)束時獲得。因此,F11×H11和F12×H11可以在第一條指令結(jié)束時在加法器中獲得。內(nèi)部循環(huán)的每條指令都轉(zhuǎn)向下一個掩碼值,其結(jié)果將在單獨(dú)的累加法中累加。該內(nèi)部循環(huán)的最終輸出裝進(jìn)R6中。 ---多個數(shù)學(xué)運(yùn)算不僅僅同時出現(xiàn)在每個周期中,而且裝入和保存還可并行操作,以便進(jìn)一步提高效率。還以第一周期為例,下一個輸入元素(F13)讀入R0.L中,并且在隨后的一個指令中用于一個MAC運(yùn)算。類似地,將下一批掩碼值裝入R2。這些值用于該內(nèi)部循環(huán)的后續(xù)MAC操作。  結(jié)論 ---在進(jìn)行圖像濾波時,3×3掩碼二維卷積是很容易實現(xiàn)的。上面介紹的研究結(jié)果示范了如何選擇一個適合實時圖像處理的處理器,并且了解其結(jié)構(gòu)組成,以便能夠提高算法效率并且減少執(zhí)行周期(這里為原來的1/4)。此外,還能為在同一個平臺實現(xiàn)更復(fù)雜的圖像處理功能提供堅實的基礎(chǔ)。 |