傅志中, 趙宇飛, 徐 進(jìn)
(電子科技大學(xué) 通信與信息工程學(xué)院, 四川 成都 611731)
基于GPU的圖像增強(qiáng)實(shí)驗(yàn)設(shè)計(jì)與實(shí)現(xiàn)
傅志中, 趙宇飛, 徐 進(jìn)
(電子科技大學(xué) 通信與信息工程學(xué)院, 四川 成都 611731)
圖像增強(qiáng)旨在改善和提高圖像的顯示質(zhì)量,通過(guò)梯度進(jìn)行增強(qiáng)是一種十分有效的方法。圖形計(jì)算單元(GPU)因?yàn)槠漭^高并行性和其特殊的結(jié)構(gòu)特性,正被廣泛地應(yīng)用在算法加速和科學(xué)計(jì)算領(lǐng)域。為了提高學(xué)生對(duì)圖像增強(qiáng)原理的理解,以及使學(xué)生掌握利用GPU進(jìn)行算法實(shí)現(xiàn)的原理與過(guò)程,設(shè)計(jì)了基于GPU的圖像增強(qiáng)實(shí)驗(yàn)。
圖像增強(qiáng); 梯度場(chǎng); 圖形計(jì)算單元; CUDA編程; 實(shí)驗(yàn)設(shè)計(jì)
實(shí)際應(yīng)用場(chǎng)景中采集得到的圖像往往存在一些缺陷,例如曝光不足引起的圖像偏暗和噪聲引起的圖像弱化等[1]。無(wú)論是出于后續(xù)進(jìn)一步處理考慮還是為了顯示效果考慮,都需要對(duì)圖像進(jìn)行增強(qiáng),使其達(dá)到更好的顯示效果,顯示盡可能多的信息。作為圖像處理領(lǐng)域的一個(gè)重要組成部分,圖像增強(qiáng)旨在提高圖像的顯示效果,使物體更加突出。無(wú)論是民用還是軍用領(lǐng)域,圖像增強(qiáng)都有廣泛的應(yīng)用場(chǎng)景[2]。
自INTEL公司推出OPENCV以來(lái),基于C/C++的圖像處理實(shí)時(shí)應(yīng)用技術(shù)得到了快速的發(fā)展,使得VC或VS開(kāi)發(fā)環(huán)境成為圖像處理技術(shù)應(yīng)用的一個(gè)重要開(kāi)發(fā)平臺(tái)?;贑語(yǔ)言的數(shù)字圖像處理實(shí)驗(yàn)[3-4],有助于學(xué)生通過(guò)實(shí)驗(yàn)直觀地認(rèn)識(shí)和掌握?qǐng)D像處理的原理和用途。
隨著GPU(圖形處理單元)技術(shù)近幾年的飛速發(fā)展,憑借其先天的并行架構(gòu)特性,以及遠(yuǎn)高于普通CPU的核心數(shù),使得GPU在科學(xué)計(jì)算、圖像處理和人工智能等對(duì)計(jì)算能力有較高要求的學(xué)科領(lǐng)域中發(fā)揮著越來(lái)越重要的作用[5]。
本實(shí)驗(yàn)先向?qū)W生講解圖像增強(qiáng)的算法原理,學(xué)生可以利用Matlab對(duì)算法進(jìn)行仿真,并可以通過(guò)修改參數(shù)觀察效果變化,加深對(duì)算法的理解。另外,就GPU的原理向?qū)W生進(jìn)行簡(jiǎn)單介紹,并給出一個(gè)示例程序代碼。學(xué)生可根據(jù)該示例代碼掌握并行化和GPU編程的基本方法,并將自己的圖像增強(qiáng)算法移植到GPU平臺(tái)上。此過(guò)程中既加深了學(xué)生對(duì)圖像增強(qiáng)原理的進(jìn)一步理解,又使學(xué)生對(duì)GPU的原理和使用方法有了切實(shí)的感受,初步掌握基于GPU的圖像處理方法。
基于圖像梯度場(chǎng)的增強(qiáng)算法源自高動(dòng)態(tài)圖像處理技術(shù)[6-7]。該增強(qiáng)方法首先求出圖像的梯度場(chǎng)函數(shù),然后構(gòu)造增強(qiáng)函數(shù),利用增強(qiáng)函數(shù)直接對(duì)梯度場(chǎng)進(jìn)行增強(qiáng),最后從梯度場(chǎng)重建出增強(qiáng)后的圖像[8]。
利用增強(qiáng)函數(shù)對(duì)梯度場(chǎng)進(jìn)行增強(qiáng)見(jiàn)式(1):
(1)
其中,G(x,y)為提升后的梯度場(chǎng),I(x,y)為原圖像I(x,y)的梯度。φ(x,y)為增強(qiáng)函數(shù),通??啥x為
(2)
其中,α是梯度場(chǎng)增強(qiáng)因子,取值范圍[0.3,0.45],C=max{||I(x,y)||2}是梯度場(chǎng)歸一化因子,δ是歸一化偏移因子,保證φ(x,y)為有界值,取值為0<δ<1/C。
(3)
其中,div()是散度算子。
求解公式(3),即可重構(gòu)出增強(qiáng)后圖像[9]。本實(shí)驗(yàn)的梯度增強(qiáng)與重構(gòu)流程見(jiàn)圖1(圖中r、g、b圖像3個(gè)分量)。
圖1 圖像梯度增強(qiáng)算法流程圖
式(3)為泊松方程,有基于離散正弦變換的快速求解方法[10],求解算法圖見(jiàn)圖2。
圖2 泊松方程快速求解算法圖
GPU結(jié)構(gòu)組成類似于CPU單元,都由控制部分(Control,圖3中黃色部分)、緩存(Cache,圖3中藍(lán)色部分)、動(dòng)態(tài)隨機(jī)訪問(wèn)存儲(chǔ)(DRAM,圖3中橙色部分),以及算術(shù)邏輯單元(ALU,圖3中綠色部分)4部分組成。由于CPU單元負(fù)責(zé)整個(gè)操作系統(tǒng)的控制與進(jìn)程調(diào)度,所以其結(jié)構(gòu)組成中控制部分和緩存部分消耗了CPU單元的主要資源。GPU單元只進(jìn)行計(jì)算任務(wù),不需要復(fù)雜的控制電路,所以GPU單元的絕大多數(shù)資源都被用于ALU設(shè)計(jì),從而擁有更高的計(jì)算密度[11]。由于GPU不能單獨(dú)作為一個(gè)系統(tǒng)來(lái)使用,通常需要與CPU一起工作,CPU負(fù)責(zé)進(jìn)程調(diào)度等控制功能,同時(shí)負(fù)責(zé)一些串行計(jì)算任務(wù),當(dāng)執(zhí)行到并行計(jì)算部分代碼時(shí),由GPU負(fù)責(zé)并行的執(zhí)行該段代碼。CPU+GPU的程序執(zhí)行流程見(jiàn)圖3。
圖3 CPU+GPU的程序執(zhí)行流程圖
GPU在結(jié)構(gòu)上擁有先天的并行性,一組ALU共享控制和緩存部分,每組ALU之間相互獨(dú)立。當(dāng)一段程序用來(lái)對(duì)大量數(shù)據(jù)做相同的處理時(shí),GPU可以將數(shù)據(jù)分組,每組數(shù)據(jù)用一組ALU來(lái)處理[12-13]。被GPU并行執(zhí)行的函數(shù)或代碼段稱之為Kernel(圖3中紫色部分),在函數(shù)名后緊跟的<<
首先將增強(qiáng)算法在Matlab上仿真實(shí)現(xiàn),學(xué)習(xí)并加深對(duì)算法理解。學(xué)生可以調(diào)整增強(qiáng)函數(shù),觀察實(shí)際增強(qiáng)效果并選擇合適的增強(qiáng)函數(shù)。然后,學(xué)生根據(jù)給出的一個(gè)GPU編程示例的代碼,思考算法中的并行部分,并將這些部分在GPU實(shí)現(xiàn),并最終通過(guò)優(yōu)化、對(duì)比算法在不同平臺(tái)的執(zhí)行時(shí)間,掌握其基本編程原理和方法。
3.1 增強(qiáng)算法的Matlab仿真實(shí)現(xiàn)
本實(shí)驗(yàn)的圖像增強(qiáng)原理部分涉及以下幾個(gè)部分:圖像讀入,求梯度,設(shè)計(jì)增強(qiáng)函數(shù),求散度,求解泊松方程,輸出歸一化結(jié)果,算法流程見(jiàn)圖1。用Matlab自帶的圖像讀取函數(shù)實(shí)現(xiàn)圖像數(shù)據(jù)的讀入,得到一個(gè)三維矩陣形式的圖像數(shù)據(jù)[14]。在求解梯度時(shí)采用一階前向差分來(lái)近似,而求散度時(shí)采用一階后向差分來(lái)近似。增強(qiáng)函數(shù)決定了對(duì)不同梯度強(qiáng)度采取什么樣的增強(qiáng)操作,是圖像梯度增強(qiáng)的核心。在實(shí)驗(yàn)中學(xué)生可以參照式(2)給出的增強(qiáng)函數(shù)形式,自行修改具體參數(shù),甚至可以修改函數(shù)形式,并通過(guò)最后結(jié)果體會(huì)不同增強(qiáng)函數(shù)帶來(lái)的結(jié)果差異。
求解泊松方程得到重構(gòu)圖像時(shí),Matlab提供了離散正弦變化(DST)及其逆變換的庫(kù)函數(shù),調(diào)用該函數(shù)即可。最后利用Matlab提供的圖像顯示函數(shù),將歸一化以后的圖像數(shù)據(jù)顯示出來(lái)[11]。仿真階段的主要任務(wù)是驗(yàn)證增強(qiáng)方法的可行性,通過(guò)此過(guò)程加深學(xué)生對(duì)增強(qiáng)的原理的理解,學(xué)生自行設(shè)計(jì)增強(qiáng)函數(shù),探索不同場(chǎng)景下如何采用不同形式的增強(qiáng)函數(shù),達(dá)到更好的增強(qiáng)效果。
3.2 算法的GPU移植實(shí)現(xiàn)
首先,在程序的初始階段,由CPU負(fù)責(zé)調(diào)用OPENCV庫(kù)函數(shù)、讀取圖片文件,并將彩色圖像的r、g和b3個(gè)分量以一維數(shù)組形式保存在主機(jī)端內(nèi)存空間內(nèi);對(duì)應(yīng)圖1中的圖片讀取和r、g、b分量的兩個(gè)步驟。
然后,求解梯度圖像的偽代碼如下:
cudaMalloc(&指向顯存指針, size); //在顯存中分配空間用于存儲(chǔ)梯度 2. cudaMemcpy(內(nèi)存中單通道圖像指針, 指向顯存空間的指針, size, cudaMemcpyHost- ToDevice);//將圖像數(shù)據(jù)拷貝至顯存 mykernel_gradient<<
//將圖像數(shù)據(jù)指針傳遞給計(jì)算梯度的核函數(shù),該函數(shù)將結(jié)果寫(xiě)入到傳遞的結(jié)果指針?biāo)缚臻g,此處block取16*16便于優(yōu)化對(duì)齊,grid取(圖像長(zhǎng)度/16)*(圖像寬度/16)
此過(guò)程對(duì)應(yīng)圖1中的圖像梯度部分。
求增強(qiáng)函數(shù)的偽代碼如下:
mykernel_enhance<<<1,256>>>(增強(qiáng)值指針){ · 確定線程與灰度級(jí)關(guān)系; · 根據(jù)當(dāng)前線程對(duì)應(yīng)梯度的幅值依公式(3)計(jì)算增強(qiáng)系數(shù); · 將結(jié)果寫(xiě)入增強(qiáng)值指針?biāo)傅刂分械南鄳?yīng)位置;
}
//因?yàn)閳D像梯度的幅值只有256種,因此block劃分為1*256即可
此過(guò)程對(duì)應(yīng)圖1中的增強(qiáng)因子部分。
求增強(qiáng)后梯度的函數(shù)偽代碼如下:
mykernel_enhancedGradien<<< grid,16*16>>>(圖像梯度指針,增強(qiáng)值指針,增強(qiáng)后梯度指針){ · 確定線程與像素坐標(biāo)對(duì)應(yīng)關(guān)系; · 讀取當(dāng)前線程對(duì)應(yīng)像素點(diǎn)的梯度值; · 根據(jù)當(dāng)前梯度幅值確定該位置梯度增強(qiáng)值; · 將原始梯度與增強(qiáng)值相乘后結(jié)果寫(xiě)入增強(qiáng)后梯度指針?biāo)缚臻g的正確位置;
}
//為每個(gè)梯度像素分配一個(gè)線程,block取16*16,每個(gè)像素并行的求解其增強(qiáng)后梯度;
此過(guò)程對(duì)應(yīng)圖1中增強(qiáng)梯度圖像G。
求解散度的函數(shù)偽代碼如下:
mykernel_div<<
}
//為每個(gè)增強(qiáng)后梯度像素分配一個(gè)線程,block取16*16,每個(gè)像素并行的求解其散度值;
此過(guò)程對(duì)應(yīng)圖1中的散度div(G)過(guò)程。
最后,根據(jù)散度求解泊松方程得到重構(gòu)結(jié)果的函數(shù)偽代碼如下:
mykernel_possion <<< 1*image_height,1*image_width>>>(散度結(jié)果指針,重構(gòu)結(jié)果指針){ //根據(jù)圖2所示流程求解泊松方程 確定線程與圖像某行的對(duì)應(yīng)關(guān)系; · 對(duì)本行散度調(diào)用IDST庫(kù)函數(shù)計(jì)算本行的IDST; · 計(jì)算本行散度的特征值,并與2的結(jié)果相乘; · 調(diào)用DST對(duì)于本行進(jìn)行DST變換; · 將結(jié)果寫(xiě)入重構(gòu)結(jié)果指針?biāo)缚臻g的正確位置;
}
//為每一行散度分配一個(gè)線程求解泊松方程,行之間并行,因此block大小為1*image_width圖像寬度,grid大小為1*image_height圖像高度
此過(guò)程對(duì)應(yīng)圖1中的求解泊松方程。
圖1中的最后2個(gè)步驟,即歸一化處理和圖像顯示,將在CPU端完成。只需要將GPU計(jì)算的求解泊松方程后的結(jié)果拷貝至CPU端,調(diào)用OPENCV中相應(yīng)的庫(kù)函數(shù)[15]即可,因篇幅限制此處不再詳細(xì)給出。
對(duì)本實(shí)驗(yàn)的圖像增強(qiáng)效果和GPU實(shí)現(xiàn)的加速效果進(jìn)行了測(cè)試與分析,由于篇幅有限,僅給出了部分測(cè)試圖像結(jié)果,如圖4所示。圖中第一列為原始圖像,第二列是基于Matlab的算法增強(qiáng)結(jié)果,第三列是基于GPU的算法增強(qiáng)結(jié)果。兩者的增強(qiáng)圖像在視覺(jué)效果上都取得了很好的結(jié)果。
為測(cè)試GPU相對(duì)CPU的運(yùn)算加速性能,本實(shí)驗(yàn)配置了如下的硬件環(huán)境:CPU為酷2四核Q8200 (2.33 GHz),2 GB內(nèi)存(DDR3);GPU為Q2000D。操作系統(tǒng)為32位WinXP SP3,軟件開(kāi)發(fā)環(huán)境為VS2008。選取尺寸分別為256像素×256像素、512像素×512像素和1024像素×1024像素的圖片進(jìn)行測(cè)試,算法計(jì)算耗時(shí)見(jiàn)表1。通過(guò)與CPU處理速度的比較,可以看到隨著圖像尺寸的增加,算法執(zhí)行效率也逐漸提高。
表1 不同分辨率下GPU加速效果對(duì)比
通過(guò)本實(shí)驗(yàn)學(xué)生對(duì)圖像增強(qiáng)的概念與原理有了較好理解,并動(dòng)手進(jìn)行了仿真,通過(guò)調(diào)整和定義自己的增強(qiáng)函數(shù),并觀察增強(qiáng)結(jié)果使學(xué)生進(jìn)一步加深理解。學(xué)生動(dòng)手將算法在當(dāng)前流行的GPU平臺(tái)上實(shí)現(xiàn),大大提升了算法的實(shí)時(shí)性。針對(duì)多個(gè)場(chǎng)景測(cè)試了系統(tǒng)的增強(qiáng)效果,同時(shí)針對(duì)不同分辨率測(cè)試了系統(tǒng)的速度提升情況。使得學(xué)生對(duì)GPU的原理有了進(jìn)一步認(rèn)識(shí),并初步掌握使用GPU進(jìn)行算法實(shí)現(xiàn)的方法。
References)
[1] 岡薩雷斯. 數(shù)字圖像處理 [M]. 阮秋琦, 阮宇智,譯.3版.北京:電子工業(yè)出版社, 2011.
[2] 胡學(xué)龍. 數(shù)字圖像處理[M].2版. 北京:電子工業(yè)出版社,2011: 1-16.
[3] 汪沛. 基于OpenCV庫(kù)的C語(yǔ)言編程學(xué)習(xí)方法[J]. 電氣電子教學(xué)學(xué)報(bào), 2012,34(4):93-95.
[4] 印月. 基于VC++6.0的數(shù)字圖像處理綜合性設(shè)計(jì)實(shí)驗(yàn)[J]. 實(shí)驗(yàn)科學(xué)與技術(shù),2011,9(3):10-11.
[5] 張舒, 褚艷利. GPU高性能運(yùn)算之CUDA [M]. 北京:中國(guó)水利水電出版社,2009.
[6] 彭韜. 高動(dòng)態(tài)圖像視覺(jué)保真實(shí)時(shí)顯示變換技術(shù)[D]. 成都: 電子科技大學(xué),2005.
[7] 朱立新, 王平安, 夏德深. 基于梯度場(chǎng)均衡化的圖像對(duì)比度增強(qiáng)[J]. 計(jì)算機(jī)輔助設(shè)計(jì)與圖形學(xué)學(xué)報(bào), 2007,19(12):1546-1552.
[8] 劉琳. 基于GPU的圖像梯度場(chǎng)增強(qiáng)算法的研究與實(shí)現(xiàn)[D]. 成都: 電子科技大學(xué), 2014.
[9] 朱立新, 王平安, 夏德深. 基于梯度場(chǎng)均衡化的圖像對(duì)比度增強(qiáng)[J]. 計(jì)算機(jī)輔助設(shè)計(jì)與圖形學(xué)學(xué)報(bào), 2008,19(12):1546-1552.
[10] Lai M C, Wang W C. Fast direct solvers for Poisson equation on 2D polar and spherical geometries [J]. Numerical Methods for Partial Differential Equations, 2002,18(1):56-68.
[11] Nvidia. CUDA C Programming Guide [M]. USA: Nvidia,2014:1-68.
[12] Cook S. CUDA Programming: A Developer’s Guide to Parallel Computing with GPUs [M]. Newnes, 2012.
[13] 王正林, 劉明. 精通MATLAB [M]. 北京: 電子工業(yè)出版社, 2011.
[14] Jason Sanders, EdwardKandrot. CUDA By Example [M]. USA: Addison-Wesley,2011:21-57.
[15] 毛星云, 冷雪飛. OPENCV3編程入門(mén)[M]. 北京: 電子工業(yè)出版社, 2015.
Design and realization of image enhancement experiment based on GPU
Fu Zhizhong,Zhao Yufei,Xu Jin
(School of Communication and Information Engineering, University of Electronic Science and Technology of China,Chendug 611731, China)
The image enhancement aims to improve the display quality of images. It is a very effective method to enhance images by gradients. The GPU (graphic processing unit) is widely used in the fields of algorithm acceleration and scientific computation because of its high parallelism and its special structural characteristics. In order to improve the students’ understanding of the principle of image enhancement, and help them to grasp the principle and process of using GPU to realize the algorithm, the image enhancement experiment based on GPU is designed.
image enhancement; gradient field; graphic processing unit(GPU); CUDA programming; experiment design
10.16791/j.cnki.sjg.2017.05.010
2016-11-03 修改日期:2017-01-04
國(guó)家自然科學(xué)基金項(xiàng)目“基于信息認(rèn)知的圖像超分辨技術(shù)研究”(61075013);國(guó)家自然科學(xué)基金項(xiàng)目“多視角混合分辨率視頻關(guān)鍵技術(shù)研究”(61671126)
傅志中(1970—),男,重慶,博士,副教授,現(xiàn)主要從事信號(hào)檢測(cè)、圖像處理與實(shí)時(shí)實(shí)現(xiàn)技術(shù)研究及相關(guān)教學(xué)工作.
E-mail:fuzz@uestc.edu.cn
TN911.73;G642.423
A
1002-4956(2017)5-0037-04