蘇 錦,馬明棟
(南京郵電大學(xué) 通信與信息工程學(xué)院,江蘇 南京 210003)
現(xiàn)今,計(jì)算機(jī)技術(shù)飛速發(fā)展,數(shù)字圖像處理技術(shù)也隨之快速發(fā)展,因此人們對(duì)數(shù)字圖像處理的要求越來(lái)越高。如現(xiàn)在的智能手機(jī)不單單僅只是靠處理器的性能作為賣點(diǎn),更加尋求在拍照方面的提升,清晰的圖片以及更高的分辨率能夠提供更好的體驗(yàn)。圖像并行技術(shù)融合了數(shù)字圖像處理和并行計(jì)算兩個(gè)方面的特性[1]。計(jì)算機(jī)圖像處理通過(guò)目前非常流行的并行技術(shù)和數(shù)字圖像處理實(shí)現(xiàn)并行化,不僅能夠處理大規(guī)模的數(shù)據(jù),并且在處理速度上也大大提升。這點(diǎn)在圖像處理中的作用尤為顯著,在圖像處理的過(guò)程中提升了不少速度,節(jié)省了很多時(shí)間,并且對(duì)于邊緣的提取也很有成效[2]。
目前,國(guó)內(nèi)在計(jì)算機(jī)并行計(jì)算技術(shù)研究方面頗有成效,在很多對(duì)性能要求很高的并行計(jì)算應(yīng)用方面都取得了一定的成果。使用比較多的并行技術(shù)有三種,除了CPU并行技術(shù)和GPU并行技術(shù)外,用到最多的是異構(gòu)平臺(tái)CPU+GPU,它結(jié)合了前兩種的優(yōu)勢(shì)。這三種技術(shù)都有自己獨(dú)特的優(yōu)勢(shì),可以根據(jù)需求使用。
計(jì)算機(jī)圖像視頻的處理在各領(lǐng)域應(yīng)用廣泛。視頻監(jiān)控在生活中無(wú)處不在,無(wú)論是道路監(jiān)控還是其他方面的視頻監(jiān)控都需運(yùn)用計(jì)算機(jī)圖像處理技術(shù),但是對(duì)于監(jiān)控視頻圖像,大多在數(shù)據(jù)處理上很欠缺,大部分監(jiān)控視頻的分析處理都是由人工完成的。如在小區(qū)安全監(jiān)控方面,當(dāng)有偷竊安全事故發(fā)生時(shí),往往需要花大量時(shí)間來(lái)翻看近段時(shí)間的監(jiān)控視頻,加上視頻的畫(huà)質(zhì)非常模糊,獲取到有用的信息非常困難,這給案件的處理造成了極大的不便。因此獲取高質(zhì)量以及快速的視頻監(jiān)控是非常急需的。
在當(dāng)前視頻圖像處理的基礎(chǔ)上,基于C++AMP并行處理對(duì)傳統(tǒng)Canny算法進(jìn)行改進(jìn),使得在圖像邊緣處理、圖像的連續(xù)性以及圖像處理的速度方面獲得一定的提升。
C++AMP作為一種新的GPU并行計(jì)算技術(shù),是對(duì)C++的一種擴(kuò)展,模板類型是在進(jìn)行并行時(shí)所需的。為了降低并行軟件在開(kāi)發(fā)上的難度,且避免在開(kāi)發(fā)過(guò)程中的一些安全問(wèn)題,C++AMP的開(kāi)發(fā)者提供了類型安全的泛型,保證在使用時(shí)不會(huì)出現(xiàn)錯(cuò)誤的數(shù)據(jù)類型。
C++AMP作為并行庫(kù)和語(yǔ)言的擴(kuò)展,可以在程序中實(shí)現(xiàn)異構(gòu)計(jì)算。通過(guò)使用C++AMP創(chuàng)建不會(huì)過(guò)時(shí)以及可移植的應(yīng)用程序,可以讓那些適合并行計(jì)算的程序的運(yùn)行速度顯著提高。
如果GPU獲取處理數(shù)據(jù)以及獲取輸出結(jié)果的時(shí)間比GPU節(jié)省的時(shí)間更長(zhǎng),那么將會(huì)使程序變得非常復(fù)雜。可以使用工具來(lái)獲取GPU性能,保證在GPU處理大量數(shù)據(jù)時(shí)獲取實(shí)時(shí)性能。使用開(kāi)發(fā)工具Visual Studio中的一些新功能有助于研究它的性能[3]。
C++AMP編寫的可執(zhí)行程序可以在各種計(jì)算機(jī)上運(yùn)行,它還有一個(gè)非常重要的特征就是不會(huì)過(guò)時(shí),可以將用它編寫的程序部署在云端,供其他計(jì)算機(jī)使用。C++AMP中的GPGPU編程可以使開(kāi)發(fā)者獲得很多益處。它是通過(guò)GPU和CPU的向量處理單元,利用異構(gòu)計(jì)算的一種方法。隨著不斷地發(fā)展,其規(guī)模越來(lái)越大,應(yīng)用越來(lái)越廣泛。
C++AMP經(jīng)歷了CPU并行的發(fā)展過(guò)程,現(xiàn)在已經(jīng)是CPU+GPU的異構(gòu)并行階段[4]。C++AMP和Visual Studio作為主流開(kāi)發(fā)人員所需要的工具、庫(kù)和框架,使得異構(gòu)計(jì)算變得更加容易[5]。基于這些,在圖像處理方面會(huì)有極大的提高,以后人們就不會(huì)再面對(duì)長(zhǎng)達(dá)幾十甚至上百個(gè)小時(shí)的監(jiān)控視頻發(fā)呆,而是直接分析計(jì)算機(jī)給出的數(shù)據(jù),當(dāng)前畫(huà)面中有多少人、都是誰(shuí)、誰(shuí)的動(dòng)作可疑等。總之,智能監(jiān)控將會(huì)迅速發(fā)展。
在圖像處理的過(guò)程中,濾除噪聲是非常重要的一步。圖像噪聲很容易影響圖像的邊緣檢測(cè)結(jié)果,為了使得到的圖像更加平滑,可以先對(duì)圖像進(jìn)行高斯濾波,然后再進(jìn)行卷積,這樣得到的圖像相對(duì)更加平滑[6]。
傳統(tǒng)的Canny算法是利用二維高斯函數(shù)的一階導(dǎo)數(shù)來(lái)實(shí)現(xiàn)平滑處理,設(shè)二維高斯函數(shù)為:
(1)
梯度向量為:
(2)
(3)
(4)
然后將圖像f(x,y)分別與得到的兩個(gè)濾波器卷積,從而得到圖像I(x,y),且
(5)
(6)
上式中,k為一個(gè)常量;σ為一個(gè)決定高斯濾波器寬度的分布參量。相比σ小的濾波器信噪比低;比σ大的濾波器雖然精度相對(duì)低一點(diǎn),但是它的信噪比高,得到的圖像會(huì)更加平滑。
梯度的方向和幅值可以用有限差分計(jì)算,一階差分卷積為:
(7)
φ1(m,n)=f(m,n)*H1(m,n)
(8)
φ2(m,n)=f(m,n)*H2(m,n)
(9)
(10)
(11)
邊緣檢測(cè)點(diǎn)的位置只有當(dāng)沿θφ方向兩個(gè)相鄰像素點(diǎn)的梯度幅值小于等于φ(m,n)時(shí),才有可能是該位置[7]。
雙閾值算法使用高、低兩個(gè)閾值檢測(cè)與連接邊緣,分割得到兩個(gè)閾值邊緣圖像T1(i,j)和T2(i,j),因此得到的圖像邊緣信息是正確的。為了保證T1(i,j)中在圖像上沒(méi)有間斷,雙閾值算法需要把邊緣連接成完整的輪廓,遇到輪廓端點(diǎn)時(shí),為了讓輪廓上的邊緣連接起來(lái),該算法就在由低閾值得到的邊緣圖像T2(i,j)的8鄰域位置尋找。然后利用遞歸算法在T2(i,j)中尋找邊緣,直到T1(i,j)中的輪廓形成一個(gè)完整的圖像為止[8]。
對(duì)于傳統(tǒng)Canny算法,為了求圖像梯度幅值,可以通過(guò)2×2鄰域內(nèi)的有限差分來(lái)計(jì)算。但是這種方法對(duì)噪音的要求很高,只要有一點(diǎn)檢測(cè)出來(lái)的邊緣效果就很差。改進(jìn)的Canny算法可以很好地解決這個(gè)問(wèn)題。首先采用3×3鄰域代替2×2鄰域,然后在x方向、y方向、45°方向和135°方向計(jì)算一階偏導(dǎo)的差分,利用差分結(jié)果計(jì)算圖像的梯度幅值[9]。這種方式可以準(zhǔn)確地定位邊緣信息,得到非常好的處理效果,避免噪聲帶來(lái)的影響。
x方向的偏導(dǎo)數(shù)為:
Fx(x,y)=I(x+1,y)-I(x-1,y)
(12)
y方向的偏導(dǎo)數(shù)為:
Fy(x,y)=I(x,y+1)-I(x,y-1)
(13)
45°方向的偏導(dǎo)數(shù)為:
F45°(x,y)=I(x-1,y+1)-I(x+1,y-1)
(14)
135°方向的偏導(dǎo)數(shù)為:
F135°(x,y)=I(x+1,y+1)-I(x-1,y-1)
(15)
水平方向的差分為:
Ex(x,y)=Fx(x,y)+[F45°(x,y)+F135°(x,y)]/2
(16)
垂直方向的差分為:
Ey(x,y)=Fy(x,y)+[F45°(x,y)-F135°(x,y)]/2
(17)
像素的梯度幅值表示如下:
M(x,y)=[Fx(x,y)2+Fy(x,y)2+
(18)
梯度方向?yàn)椋?/p>
(19)
傳統(tǒng)的邊緣檢測(cè)檢測(cè)到的邊緣信息比較模糊,可能會(huì)看到一個(gè)假的邊緣。Canny算法采用3×3大小的鄰域,沿梯度方向使用8方向的鄰域?qū)μ荻确店嚵蠱[x,y]中的所有像素插值,邊緣點(diǎn)就是幅度的極大值點(diǎn)[10]。
現(xiàn)今比較流行的有CUDA、OpenCL以及C++AMP[11]。在眾多并行算法中,C++AMP有很好的移植性,可以將寫好的并行算法移植到不同的硬件平臺(tái)下,而且代碼不會(huì)過(guò)時(shí),因此可以被更多的程序開(kāi)發(fā)人員使用。
文中采用的Canny邊緣檢測(cè)算法具有非常好的并行性,具有邊緣梯度方向和邊緣強(qiáng)度的信息,能檢測(cè)出更多的邊緣信息,并與周邊的邊緣信息明顯地隔離開(kāi),可以很好地使用C++AMP進(jìn)行并行化[12]。
為了實(shí)現(xiàn)圖像的并行運(yùn)算,在C++AMP平臺(tái)下進(jìn)行操作。實(shí)驗(yàn)過(guò)程用的是并行流水線,通過(guò)異步代理庫(kù)和PPL來(lái)實(shí)現(xiàn)[13]。它可以同時(shí)處理4幅圖像,以并發(fā)序列的方式將各個(gè)流水線階段作為獨(dú)立的并發(fā)代理運(yùn)行。
處理流程如圖1所示。

圖1 流水線處理流程
傳統(tǒng)的Canny算子由于其單純采用高斯濾波器進(jìn)行濾波,導(dǎo)致去噪和邊緣細(xì)節(jié)的不穩(wěn)定,容易造成高頻邊緣丟失[14]。以前在CPU上運(yùn)行時(shí),速度受限,采用四方檢測(cè)使圖像漏掉較多細(xì)節(jié),導(dǎo)致邊緣不清晰,而且CPU上串行執(zhí)行的算法速度較慢[15]。
針對(duì)上述傳統(tǒng)算子的缺陷,利用基于C++AMP的改進(jìn)Canny算子。在GPU上綜合使用高斯濾波和圖像直方圖,避免高頻邊緣丟失,采用3×3鄰域代替2×2鄰域可以很好地抑制噪聲,準(zhǔn)確定位邊緣信息。使用C++AMP編程模型,將Canny算子中可并行化處理的部分放在GPU上進(jìn)行并行化處理,能夠合理分配GPU的存儲(chǔ)空間,減少重復(fù)計(jì)算點(diǎn)元[16]。為了最大程度地發(fā)揮C++AMP利用GPU處理的能力,利用GPU來(lái)控制性能相異的多GPU協(xié)作,還可以利用CPU對(duì)數(shù)據(jù)進(jìn)行預(yù)處理核后處理。
3.4.1 C++AMP環(huán)境搭建
(1)文中主要在Microsoft Windows7系統(tǒng)環(huán)境下進(jìn)行并行運(yùn)算。
(2)安裝Microsoft Visual Studio 2013,它自帶所需的DirectX SDK。
(3)為了看到GPU計(jì)算帶來(lái)的性能提升,DirectX 11驅(qū)動(dòng)程序的顯卡也是必不可少的。
實(shí)驗(yàn)環(huán)境配置如下:
CPU:Intel(R) Core(TM) i3-2 310 M CPU@ 2.10 GHz;
GPU:NVIDIA GeForce GT 520 M 1 GB;
操作系統(tǒng):64位操作系統(tǒng),基于x64的處理器;
內(nèi)存(RAM):6.0 GB。
3.4.2 實(shí)現(xiàn)過(guò)程
利用C++AMP在GPU上使用Canny算子優(yōu)化處理圖像,算法在CPU和GPU之間有數(shù)據(jù)傳遞的I/O操作,主要對(duì)圖像的邊緣部分進(jìn)行處理,僅在CPU上執(zhí)行分割圖像和判斷大小的這些必要的串行時(shí)長(zhǎng)操作,大部分可并行化的循環(huán)、迭代操作在GPU的工作組中執(zhí)行[17]。GPU端處理圖像比CPU端多了在加速器上復(fù)制圖像數(shù)據(jù)和轉(zhuǎn)換圖像數(shù)據(jù)這兩個(gè)步驟。
(1)在Microsoft Visual Studio 2013運(yùn)行C++AMP程序,從輸入源文件夾中選擇圖片,點(diǎn)擊處理圖像。應(yīng)用程序以ARGB32格式加載圖像文件和視頻幀格式;
(2)點(diǎn)擊運(yùn)行按鈕,程序會(huì)創(chuàng)建對(duì)應(yīng)的文件讀取的實(shí)例和一個(gè)新的圖像代理來(lái)處理圖像或視頻幀序列,然后調(diào)用start()方法進(jìn)行處理;
(3)先創(chuàng)建存儲(chǔ)輸入、輸出圖像和原始圖像的存儲(chǔ)區(qū)域,然后將數(shù)據(jù)復(fù)制到GPU中;
(4)配置流水線,把圖像送入流水線中,使用消息塊連接縮放器、圖像處理器和顯示代理,也會(huì)同時(shí)連接取消消息源以便隨時(shí)取消執(zhí)行;
(5)啟動(dòng)流水線代理,在迭代過(guò)程中反復(fù)簡(jiǎn)化顏色,然后執(zhí)行Canny邊緣檢測(cè)算法;
(6)將GPU上的數(shù)據(jù)移回destFrame位圖中的像素?cái)?shù)據(jù);
(7)流水線等待所有代理完成工作,發(fā)出結(jié)束信號(hào),通知關(guān)閉流水線;
(8)輸出C++AMP處理過(guò)后的圖片,以及各階段處理的時(shí)間。
為了對(duì)比并行運(yùn)算與串行運(yùn)算的運(yùn)算時(shí)間及圖片效果,選取6幅不同分辨率的圖像進(jìn)行實(shí)驗(yàn)。圖2~4分別為分辨率535×610的原始圖像,Canny算子串行圖像,改進(jìn)后的并行算法圖像[18]。根據(jù)結(jié)果可知,使用串行算法獲得圖像的對(duì)比度較低,邊緣位置較少,且偽邊緣較多。改進(jìn)后并行化的圖像邊緣細(xì)且圖像對(duì)比度增加,邊緣信息更多,圖像細(xì)節(jié)更清晰,人物特征更明顯,更有利于人物視頻圖像的判別。

圖2 原始圖片

圖3 Canny算子生成的串行圖片

圖4 改進(jìn)并行算法生成的圖像
如表1所示,分別對(duì)6幅分辨率不同的圖片進(jìn)行串行化和在C++AMP中CPU+GPU模式下的并行化處理。串行和并行算法都計(jì)算了圖像加載、處理和顯示總的時(shí)間,然后計(jì)算了加速比。從數(shù)據(jù)可以看出,隨著圖像分辨率的增加,串行所用時(shí)間相比于并行所用時(shí)間的加速比越來(lái)越大,加速效果明顯,圖像的分辨率越大,GPU并行化算法的效果越明顯。在視頻監(jiān)控中,現(xiàn)在的監(jiān)控設(shè)備越來(lái)越先進(jìn),視頻的分辨率也越來(lái)越清晰,使用并行算法可以更加快速地處理視頻圖像,而且處理效果更好,邊緣信息更清晰,圖像顯示更好,為用戶帶來(lái)了便利,省去了大量時(shí)間。

表1 圖片串行化和改進(jìn)后的并行化處理時(shí)間
針對(duì)視頻圖像領(lǐng)域中存在的問(wèn)題,提出了改進(jìn)的Canny算子,并且基于C++AMP實(shí)現(xiàn)了改進(jìn)的Canny算法的并行處理,不僅提高了圖像處理效果,使得邊緣信息更多、更明顯,而且加快了處理速度。
C++AMP在并行處理上高速且高效,由于C++AMP的可擴(kuò)展性使得C++AMP作為一種新的異構(gòu)并行技術(shù)得以快速發(fā)展[19]。C++AMP是一種新的具有集成優(yōu)勢(shì)的并行化技術(shù),而基于C++AMP的圖像并行化技術(shù)對(duì)于圖像處理的速度以及效率都有很大的優(yōu)勢(shì)。C++AMP在圖像處理中應(yīng)用廣泛,也可以在其他需要并行的地方使用。隨著C++AMP技術(shù)的不斷成熟與改進(jìn),C++AMP在并行計(jì)算領(lǐng)域會(huì)占據(jù)更重要的地位[20]。
參考文獻(xiàn):
[1] 胡 瓊,秦 磊,黃慶明.基于視覺(jué)的人體動(dòng)作識(shí)別綜述[J].計(jì)算機(jī)學(xué)報(bào),2013,36(12):2512-2524.
[2] 董榮勝.《九校聯(lián)盟(C9)計(jì)算機(jī)基礎(chǔ)教學(xué)發(fā)展戰(zhàn)略聯(lián)合聲明》呼喚教育的轉(zhuǎn)型[J].中國(guó)大學(xué)教學(xué),2010(10):14-15.
[3] 陳冠誠(chéng).C++AMP異構(gòu)并行編程解析[J].程序員,2012(4):104-106.
[4] 肖 漢.基于CPU+GPU的影像匹配高效能異構(gòu)并行計(jì)算研究[D].武漢:武漢大學(xué),2011.
[5] 丁 鵬,陳利學(xué),龔 捷,等.GPU通用計(jì)算研究[J].計(jì)算機(jī)與現(xiàn)代化,2010(1):12-15.
[6] 陳宏希.基于邊緣保持平滑濾波的Canny算子邊緣檢測(cè)[J].蘭州交通大學(xué)學(xué)報(bào),2006,25(1):86-90.
[7] 唐志文.淺析數(shù)字圖像處理技術(shù)的研究現(xiàn)狀及其發(fā)展方向[J].硅谷,2010(5):30.
[8] 吳學(xué)明,李燦平.邊緣檢測(cè)算法在不同分辨率圖像中的性能研究[J].計(jì)算機(jī)測(cè)量與控制,2006,14(2):166-169.
[9] 王 蘭,吳 謹(jǐn).一種改進(jìn)的Canny邊緣檢測(cè)算法[J].微計(jì)算機(jī)信息,2010,26(2):198-199.
[10] LIANG L R,LOONEY C G.Competitive fuzzy edge detection[J].Applied Soft Computing,2003,3(2):123-137.
[11] PELLEGRINO F A,VANZELLA W,TORRE V.Edge detection revisited[J].IEEE Transactions on Systems,Man and Cybernetics,2004,34(3):1500-1518.
[12] 王 蓉,高立群,柴玉華,等.綜合Canny法與小波變換的邊緣檢測(cè)方法[J].東北大學(xué)學(xué)報(bào):自然科學(xué)版,2005,26(12):1131-1133.
[13] 朱仲濤,張 鈸,張?jiān)倥d.圖像關(guān)于邊緣提取算子的微分不變性[J].計(jì)算機(jī)學(xué)報(bào),1999,22(9):903-910.
[14] 姚 平.CUDA平臺(tái)上的CPU/GPU異步計(jì)算模式[D].合肥:中國(guó)科學(xué)技術(shù)大學(xué),2010.
[15] SANDERS J.GPU高性能編程CUDA實(shí)戰(zhàn)[M].聶雪軍,譯.北京:機(jī)械工業(yè)出版社,2011.
[16] COOK S.A developer’s guide to parallel computing with GPUs[M].[s.l.]:Morgan Kaufmann,2012.
[17] 宗露艷,吳 陳.一種改進(jìn)的Canny算子邊緣檢測(cè)算法[J].現(xiàn)代電子技術(shù),2011,34(4):104-106.
[18] 張煥龍,胡士強(qiáng),楊國(guó)勝.基于外觀模型學(xué)習(xí)的視頻目標(biāo)跟蹤方法綜述[J].計(jì)算機(jī)研究與發(fā)展,2015,52(1):177-190.
[19] GOMEZ-LUNA J,GONZALEZ-LINARES J M,BENAVIDES J I,et al.An optimized approach to histogram computation on GPU[J].Machine Vision and Applications,2013,24(5):899-908.
[20] DESTREMPES F,MIGNOTTE M.A statistical model for contours in image[J].IEEE Transactions on Pattern Analysis and Machine Intelligence,2004,26(5):626-638.