張衛(wèi)東,杜師帥,路皓翔,卓 永,楊輝華,+
(1.桂林電子科技大學(xué) 計算機(jī)與信息安全學(xué)院,廣西 桂林 541004;2.北京郵電大學(xué) 自動化學(xué)院,北京 100876)
圖像增強(qiáng)技術(shù)在圖像處理領(lǐng)域受到廣泛的關(guān)注,可以有效地提高圖片的顯像效果,如抑噪、改善清晰度等,并且成功地應(yīng)用于多個領(lǐng)域[1,2]。其中帶色彩恢復(fù)的多尺度視網(wǎng)膜增強(qiáng)算法是一種被廣泛應(yīng)用的圖像增強(qiáng)算法[3,4]。
Land提出基于顏色恒常性的成像模型即Retinex理論。Retinex是由視網(wǎng)膜和皮層兩個詞合成[5]。在人類視覺的基礎(chǔ)之上,Shi[6]對Retinex進(jìn)行了改進(jìn),并且提出了帶彩色的多尺度Retinex增強(qiáng)算法。該方法[7]不僅改進(jìn)了單尺度算法中針對細(xì)節(jié)增強(qiáng)較弱的缺陷,還提高了多尺度算法的增強(qiáng)效果。針對初始Retinex算法隨機(jī)選擇路徑時參數(shù)設(shè)置困難的缺點,以中心環(huán)繞為基礎(chǔ)的改進(jìn)算法得到了發(fā)展[8]。隨著圖像增強(qiáng)技術(shù)的不斷發(fā)展,Yang等[9]指出了以中心環(huán)繞為基礎(chǔ)的增強(qiáng)算法,可能存在過度增強(qiáng)和色彩失真的缺陷,結(jié)合人眼的視覺特點提出了一種基于保持色的彩圖像增強(qiáng)算法。在隨后的研究中,針對要處理不同的特定圖像,研究者分別提出了結(jié)合雙邊濾波器的Retinex算法、結(jié)合伽柏變換的Retinex算法、結(jié)合IIR低通濾波的Retinex算法、結(jié)合引導(dǎo)濾波的Retinex算法。Petro等提出對亮度線性操作使得Retinex算法具有更好的色彩保持等等[10]。這些改進(jìn)模型或者參數(shù)的提出,極大地豐富了Retinex理論。
盡管一系列的Retinex算法針對多種場景下圖像處理獲得令人滿意的效果,但是仍然存在一些問題,如復(fù)雜的計算過程和過大的計算量使得對圖像處理實時性效果較差。在圖像增強(qiáng)領(lǐng)域,雖然有關(guān)于GPU[11]加速的報道,但是它們沒有考慮到CPU資源的充分利用。本文考慮到通過3個CPU線程實現(xiàn)RGB三通道的并行,每個通道的增強(qiáng)過程通過GPU并行。在保證圖像增強(qiáng)質(zhì)量的情況下,不僅充分利用CPU和GPU各自的優(yōu)勢,還提高了算法的執(zhí)行效率。
Retinex的基本思想是反射光的強(qiáng)度不是物體的色彩的決定性因素,是毫不影響的。而是由物體對長中短波的光線反射能力決定的,即保留反映物體本質(zhì)的反射屬性,去掉照射光對原始圖像的影響。一幅圖像根據(jù)Retinex思想可以有如下的定義方式
S(x,y)=L(x,y)·R(x,y)
(1)
其中,S(x,y)表示現(xiàn)實中人觀賞到的或者其它成像設(shè)備生成的圖像;L(x,y)表示入射光,它決定圖像中的像素能達(dá)到的動態(tài)范圍;R(x,y)表示反射圖像。
對式(1)兩邊取對數(shù),將其轉(zhuǎn)換到對數(shù)域
log(S(x,y))=log(L(x,y))+log(R(x,y))
(2)
由式(2)可得R(x,y),即
log(R(x,y))=log(S(x,y))-log(L(x,y))
(3)
入射光分量L(x,y)可以通過用高斯濾波方法從原始圖像S(x,y)中估計出
L(x,y)=S(x,y)*G(x,y)
(4)
其中,*表示卷積運(yùn)算,G(x,y)如下所示
(5)
其中:σ是高斯函數(shù)的標(biāo)準(zhǔn)差也稱為尺度常量,λ是歸一化常量,使得?G(x,y)dxdy=1。
所以由式(3)~式(5)得
log(Ri(x,y))=log(Si(x,y))-log(Si(x,y)*G(x,y))
(6)
其中,i代表圖像的某個通道,式(6)其實就是算法SSR的公式,為了彌補(bǔ)SSR的不足,MSR算法把多個不同尺度的色彩通道進(jìn)行線性加權(quán)來改善增強(qiáng)效果
(7)
MSRCR算法在MSR基礎(chǔ)上引入色彩恢復(fù)因子C,可以克服MSR增強(qiáng)后的圖像色彩失真問題,C公式如下
(8)
其中,β為增益常數(shù),α為受控制的非線性增強(qiáng)系數(shù)。所以MSRCR可以表示為
(9)
上述MSRCR方法中引入了色彩恢復(fù)因子,使得增強(qiáng)后的圖像有較好的色彩保真性,但是利用以上公式得到的最終RGB的值會出現(xiàn)任意大小的值,為了將像素的值轉(zhuǎn)化到[0,255]的范圍,Moore等提出用三色帶的最大值和最小值來調(diào)整每個像素點的值,如式(10)所示
(10)
Jobson則發(fā)現(xiàn)利用Retinex算法處理后的圖像不論被處理的圖像是什么類型,得到的直方圖輪廓基本不變,因此,為了在log域和顯示間的變化利用了一種附件常量參數(shù)的線性變換方式,稱為“gain/offset”,如式(11)所示
RMSRCRi(x,y)=a[RMSRCRi(x,y)-b]
(11)
其中,a是gain,又稱為增益系數(shù);b是offset,又稱為偏移量控制參數(shù)。
通過對GIMP中圖像增強(qiáng)代碼的研究,在調(diào)節(jié)色彩偏差的過程中使用了均值和均方差來得出通道上最大值和最小值,如式(12)和式(13)所示,同時引入了一個動態(tài)的參數(shù)D,使得在提高色彩保真度的同時對各種場景圖像具有更好的自適應(yīng)性,所以改進(jìn)后的MSRCR可以定義如式(14)所示
Min=mean-D·var
(12)
Max=mean+D·var
(13)
(14)
在對基于CPU的MSRCR圖像增強(qiáng)算法的并行分析,分為高斯濾波、對數(shù)域的計算、像素值的線性映射(包括計算最大值和最小值)等步驟。其中高斯濾波和對數(shù)域計算是最耗時的兩步,兩個步驟的耗時占了算法整體耗時的90%左右。通過分析這兩個步驟可以細(xì)粒度的并行的運(yùn)行在以SIMT為基礎(chǔ)架構(gòu)的GPU上,在均值和方差的計算以及像素值范圍調(diào)整的步驟中,涉及到求和、乘除、分支判斷等運(yùn)算,將該步驟也利用CUDA核函數(shù)實現(xiàn)在GPU上的并行運(yùn)行。將以上3個步驟分別設(shè)計為3個GPU核函數(shù)。這3個GPU核函數(shù)在使用時用到的CUDA存儲體系中存儲器是不相同的,需要根據(jù)不同核函數(shù)的計算特點選用不用存儲器,以充分利用GPU的硬件資源,提高算法的執(zhí)行效率。并且每個核函數(shù)在處理每個顏色通道數(shù)值時,將中間處理的數(shù)據(jù)存放在全局存儲器中供另外的核函數(shù)調(diào)用,減少CPU和GPU間的通信。每個GPU核函數(shù)中用到CUDA存儲器見表1。
表1 GPU核函數(shù)在運(yùn)行時用到的存儲器種類
針對MSRCR算法的計算特點,可分為4個主要的計算任務(wù),CPU線程處理函數(shù)和GPU核函數(shù)。其中,CPU線程處理函數(shù)用于并行R、G、B通道,GPU核函數(shù)用于并行MSRCR算法。重點在于GPU核函數(shù)的并行設(shè)計,GPU線程函數(shù)分別為高斯濾波核函數(shù)kernel_Conv、對數(shù)域計算核函數(shù)kernel_Log、像素值線性映射核函數(shù)kernel_Dyna(其中,均值核函數(shù)Kernel_Mean和標(biāo)準(zhǔn)差核函數(shù)Kernel_Std是Kernel_Dyna的輸入)。詳細(xì)的建模流程如圖1所示,首先載入圖像獲取RGB、GPU等信息,然后在CPU中開啟3個CPU線程分別對應(yīng)R、G、B通道,之后分配GPU內(nèi)存并且將數(shù)據(jù)拷貝到GPU內(nèi)存中,通過GPU核函數(shù)完成MSRCR算法的并行過程,最后輸出處理結(jié)果。
圖1 并行模型GPU核函數(shù)的設(shè)計與實現(xiàn)
2.3.1 高斯濾波核函數(shù)
本文中的高斯濾波采用的是離散化的滑動窗口做卷積計算來實現(xiàn)的。在二維的卷積計算中,如果計算卷積P[m][n],需要高斯模板M[][]和待卷積的矩陣N1×N2中以[m][n]為中心的與M矩陣大小相同的二維子矩陣這些數(shù)據(jù)。在做卷積計算時,需要將M矩陣和待卷積矩陣中對應(yīng)的子矩陣的數(shù)據(jù)相乘再累加即可得到結(jié)果,圖2給出一個卷積計算的示意圖。
圖2 二維卷積計算
通過對二維卷積的計算過程分析發(fā)現(xiàn),在整個計算過程中有大量乘法和累加計算,并且數(shù)據(jù)是離散且獨(dú)立的。但在邊界處理時,需要判斷該數(shù)據(jù)是屬于邊界還是非邊界,其中涉及大量的判斷分支指令。根據(jù)GPU的并行運(yùn)行特點,在處理含有大量分支結(jié)構(gòu)的程序時,會造成大量的線程空閑,只有少部分線程參與計算,造成計算資源浪費(fèi),嚴(yán)重影響程序的執(zhí)行效率。在對卷積計算的并行化的研究中,有的研究者提出使用可分離濾波器來將二維卷積轉(zhuǎn)換為兩次一維卷積來實現(xiàn)并行化取得了良好的加速效果,是在計算過程中仍然有分支結(jié)構(gòu)的存在,影響計算效率。本文采用一種新的方式將卷積計算過程并行化,徹底消除在卷積計算的過程中處理分支判斷的結(jié)構(gòu),并且在計算過程中除了使用紋理存儲器,還使用了常量存儲器和共享存儲器以優(yōu)化并行程序的讀寫效率,充分發(fā)揮GPU的并行性能。為了可以將卷積計算過程改成完全適合GPU的架構(gòu)特點以并行化運(yùn)行以及充分使用GPU的各種具有各自優(yōu)勢的存儲器。首先將待計算的矩陣行和列各補(bǔ)L/2行和L/2列的0,L為高斯模板的高度,如圖3所示。
圖3 待卷積矩陣擴(kuò)展補(bǔ)0
將待卷積計算的矩陣補(bǔ)0擴(kuò)展后,把在整個卷積計算過程中數(shù)據(jù)不會變化的高斯模板數(shù)據(jù)存入常量存儲器。而在計算過程中待卷積的矩陣數(shù)據(jù)會多次重復(fù)用到,而共享存儲器具有高出全局存儲器一個數(shù)量級的讀寫速度。因此,將預(yù)先存入紋理存儲器或者全局中的數(shù)據(jù)先讀入到共享存儲器中再參與計算,共享存儲數(shù)據(jù)的加載過程是卷積計算并行化中的難點之一。如果在加載數(shù)據(jù)時沒有有效組織線程以及沒有注意同步問題,容易造成數(shù)據(jù)加載錯誤,得到意想不到的計算結(jié)果。共享數(shù)據(jù)的加載過程如圖4所示。
圖4 共享存儲器數(shù)據(jù)加載
將數(shù)據(jù)加載共享內(nèi)存時,其中每個線程塊中共享存儲器大小的設(shè)置為(block_width+m-1)×(block_width+m-1),其中block_width為線程塊的寬度,m為高斯模板的寬度。
2.3.2 對數(shù)域計算核函數(shù)
該核函數(shù)主要用來對數(shù)域上的線性加權(quán)計算。(t_n,t_n)、((w+t_n-1)/t_n,(h+t_n-1)/t_n)分別設(shè)計為block和grid中線程和線程塊的數(shù)量,其中h、w分別為讀入圖像的高度和寬度,t_n為線程塊在一個維度上包含的線程數(shù)量。當(dāng)t_n取值為16時,則每個線程塊中線程數(shù)量為256。式(7)中的計算主要是對數(shù)值的相減以及求差結(jié)果帶權(quán)值的相加,參與計算的數(shù)值之間是互相獨(dú)立完全符合GPU線程并行的特點。將每個數(shù)據(jù)塊中數(shù)據(jù)映射到每個線程上,則一個數(shù)據(jù)塊被映射到一個線程塊上,在啟動GPU核函數(shù)時,流處理器就會調(diào)入若干個線程塊并行執(zhí)行。
2.3.3 線性映射計算的核函數(shù)
在對每一個顏色通道處理的最后,由kernel_Dyna核函數(shù)實現(xiàn)色彩調(diào)整以及最后像素值范圍的調(diào)整等計算任務(wù)。在式(14)中調(diào)整圖像色彩時需要先計算該通道上全部像素的均值和方差,在計算均值和方差時都需要執(zhí)行累加和的指令。對大規(guī)模數(shù)據(jù)加和時,使用并行規(guī)約求和方法可以大大降低執(zhí)行時間。因此,基于GPU的并行規(guī)約求和在核函數(shù)中扮演了重要的角色。在式(14)計算完成后,需要對求得的計算結(jié)果過濾,也就是判斷像素值是否溢出,即如果大于255取255,如果小于0,則取0。最終的處理結(jié)果由GPU傳送到CPU,并且在CPU上面將R、G、B通道上的數(shù)據(jù)合并。該GPU核函數(shù)的執(zhí)行步驟如下:①按線程索引號從存儲全局內(nèi)存中加載數(shù)據(jù)。②通過并行規(guī)約的當(dāng)時得到累加和,得到均值和方差的計算結(jié)果。③按照式(14),將每個數(shù)據(jù)映射到一個線程上,同時啟動所有的線程進(jìn)行線性映射計算。④對第③步求得的結(jié)果作溢出判斷后,CPU把結(jié)果取回。
實驗環(huán)境為:操作系統(tǒng)為WIN10,64位,處理器為Intel Core i7-6700,內(nèi)存大小為16 G,顯卡GTX730,編程平臺為VS2015,圖像處理庫Opencv2.49,以及GPU并行庫CUDA8.0。本次實驗中,我們選擇5種場景下不同比例大小的圖像進(jìn)行了速度的測試,并且與相應(yīng)的CPU-MSRCR和GPU-MSRCR算法的執(zhí)行速度進(jìn)行了對比,其中所有的圖像均來自于網(wǎng)絡(luò)以及NASA官網(wǎng)。
本實驗是基于Windows平臺進(jìn)行設(shè)計,其中平臺環(huán)境的搭建是實驗成功的關(guān)鍵,本平臺的搭建主要分為3個步驟:①首先安裝VS2015,該軟件來源于微軟官網(wǎng)。②然后安裝CUDA8.0,該庫來源于英偉達(dá)官網(wǎng)。安裝之后需要在系統(tǒng)的環(huán)境變量中添加CUDA8.0對應(yīng)的庫。③最后安裝Opencv2.49,該庫來源于Opencv官網(wǎng)。該庫直接解壓,解壓之后放在D盤的根目錄,然后在系統(tǒng)環(huán)境變量中添加Opencv對應(yīng)的庫。
本實驗的設(shè)計主要分為CPU并行、GPU并行以及CPU-GPU并行。其中,CPU并行是基于MATLAB設(shè)計的,GPU和CPU-GPU并行是基于VS2015設(shè)計的。3種并行設(shè)計都遵循圖像的讀入、圖像的增強(qiáng)以及圖像的合并。其中重點在于圖像的增強(qiáng)過程的并行設(shè)計,具體的并行步驟如下:①高斯濾波計算的并行設(shè)計。②對數(shù)域計算的并行設(shè)計。③均在計算的并行設(shè)計。④標(biāo)準(zhǔn)差計算的并行設(shè)計。⑤線性映射計算的并行設(shè)計。
其中在CPU-GPU并行設(shè)計時,需要在CPU內(nèi)存中創(chuàng)建3個CPU線程同時并行R、G、B通道。
為了方便展示算法并行后對圖像的增強(qiáng)效果以及對GPU加速效果的分析,在實驗中采用了5類圖像作為實驗對象且將同一類的圖像處理為相同大小,分別為夜間場景圖像,大小為256×191;水下場景圖像,大小為512×426;醫(yī)療診斷圖像,大小為1024×750;霧霾場景圖像,大小為2048×1445;月球表面探測圖像,3052×4096。這5類圖像的大小是在不斷增加的,如圖5所示,其中上面5幅為原始圖像,下面5幅為GPU并行增強(qiáng)處理后的效果圖。
圖5 GPU并行增強(qiáng)處理效果
在實驗中5組圖像的大小各不相同,并行后的MSRCR計算在CPU和GPU上面的運(yùn)行時間,圖像處理的耗時統(tǒng)計見表2。
表2中給出了在實驗中5類圖像在CPU-MSRCR、GPU-MSRCR和CPU-GPU-MSRCR上面的耗時,在GPU上分別統(tǒng)計了GPU-MSRCR模型和CPU-GPU-MSRCR模型的耗時情況,折線圖可以更清晰表示在CPU-MSRCR、GPU-MSRCR和CPU-GPU-MSRCR的耗時對比,如圖6所示。
表2 不同分辨率圖像總耗時統(tǒng)計/ms
其中左圖原始走勢,右圖是縮小10倍的走勢,隨著圖像的不斷增加,CPU-MSRCR耗時急劇增高;GPU-MSRCR耗時區(qū)線小幅度增高;CPU-GPU-MSRCR耗時區(qū)線的變化不是太明顯。以上結(jié)果表明GPU并行MSRCR可以顯著提高算法的執(zhí)行速度,并且充分利用CPU線程的并行思想不僅可以提供GPU的并行速度,還能提高CPU和GPU資源的利用率。可以看出采用CPU-GPU的并行設(shè)計的處理能力優(yōu)于GPU的并行設(shè)計處理能力。為了更好的量化GPU對CPU對程序執(zhí)行速度有著巨大的優(yōu)勢,在圖7中給出了CPU和GPU的加速比。
利用在GPU上執(zhí)行的總時間來衡量加速比,但這個總時間是不包含CPU與GPU的數(shù)據(jù)傳輸時所花費(fèi)的時間。如圖7所示:對于GPU-MSRCR算法,當(dāng)圖像大小小于1124*750時,加速度穩(wěn)定在一個范圍內(nèi)并且幅度不大,隨著圖像大小的增大加速比有明顯的提高,當(dāng)圖像大小達(dá)到3052*4096時,加速比最高達(dá)到72.2。在GPU-MSRCR基礎(chǔ)上,本文對該方法進(jìn)行了改進(jìn),考慮到圖像本身具有3個通道,并且GPU-MSRCR是順序執(zhí)行R、G、B通道的GPU并行過程,而多CPU線程可以并行執(zhí)行R、G、B通道的GPU并行過程。理論上采用CPU-GPU-MSRCR的處理速度是GPU-MSRCR的3倍,而實際結(jié)果取決于并行R、G、B通道時運(yùn)行時間最長的通道。當(dāng)圖像大小是256*191的時加速比為30多倍,隨著圖像的增加,加速比的效果逐漸明顯,當(dāng)圖片大小為3052*4096時加速比達(dá)到267倍左右。實現(xiàn)結(jié)果表明CPU-GPU-MSRCR具有較好的提速能力。
圖6 CPU-MSRCR、GPU-MSRCR和CPU-GPU-MSRCR耗時對比
圖7 5組圖片對應(yīng)的并行模型的加速比
多尺度視網(wǎng)膜圖像增強(qiáng)算法可以對光照不均勻、霧霾天氣、水下等場景下圖像處理獲得較好的顯像效果,但是由于其復(fù)雜的計算過程以及較大的計算量,導(dǎo)致算法的實時性效果較差。本文提出了一種結(jié)合CPU和GPU并行MSRCR的加速數(shù)據(jù)并行計算的并行化方案。通過CPU并行R、G、B通道,并且每個通道的MSRCR過程在GPU資源中并行。該方案在保證圖片質(zhì)量的情況下,不僅提高了算法的執(zhí)行效率,還提高了CPU和GPU的資源利用率。