李園園
(西安郵電大學(xué)計算機學(xué)院 西安 710121)
數(shù)字圖像在采集、生成及傳輸?shù)冗^程中,極易受到一種最常見的椒鹽噪聲[1]的干擾,它是一種隨機的白點或黑點,不僅會影響圖像的視覺效果、降低圖像質(zhì)量,而且對圖像的后續(xù)處理過程也將產(chǎn)生嚴重的影響[2~4]。
在數(shù)字圖像處理中,直方圖均衡化[5](Histo?gram Equalization,HE)算法在圖像增強中具有很強的代表性,是圖像分割、圖像壓縮和圖像識別等后續(xù)圖像處理的基礎(chǔ),在圖像預(yù)處理技術(shù)中有著廣泛的應(yīng)用[6]。然而,直方圖均衡化不能有效去除圖像噪聲。因此,對于椒鹽噪聲的影響,引入中值濾波算法對圖像效果進行改進。中值濾波算法[7]是目前用于去除椒鹽噪聲的一種最常見的非線性濾波方法。
近年來,在實時、高分辨率3D圖形的市場需求的驅(qū)動下,可編程圖形處理器單元或GPU已經(jīng)發(fā)展成為一個高度并行的多線程多核處理器,具有極大的并行計算能力和極高的內(nèi)存帶寬?;贑PU/GPU架構(gòu)的異構(gòu)并行計算技術(shù)已廣泛地應(yīng)用于通用計算領(lǐng)域,并取得了很大進展。
開源計算機視覺庫OpenCV(Open Source Com?puter Vision Library)[8]是由一系列 C 函數(shù)和少量C++類構(gòu)成,包含了300多個C函數(shù)的跨平臺的中、高層API,實現(xiàn)了圖像處理和計算機視覺方面的很多通用算法,具有開源、簡單、免費及跨平臺的重要特性。
因此,本文以CPU/GPU異構(gòu)架構(gòu)作為計算平臺,針對直方圖均衡化不能有效去除噪聲的問題,論文引入中值濾波算法來消除直方圖均衡化圖像中的椒鹽噪聲,并基于CUDA和OpenCV實現(xiàn)了直方圖均衡化結(jié)合中值濾波的并行化圖像處理。
直方圖均衡化是利用直方圖對對比度進行調(diào)整的方法,其基本思想是把原始圖像的灰度直方圖從比較集中的某個灰度區(qū)間變成在全部灰度范圍內(nèi)均勻分布的形式。
對原始圖像進行直方圖均衡化分為以下五個步驟(本文實驗中圖像均轉(zhuǎn)換為256灰度級,灰度范圍為 0~255,即L=256):
1)計算原始圖像g的每個灰度級的像素點個數(shù)ni,i=0,1,...,L-1;
2)標準化直方圖,即每個灰度級的概率密度函數(shù):
其中,ni為每個灰度級像素數(shù)目,n為圖像總像素數(shù)目。
3)計算累計直方圖:
4)實現(xiàn)直方圖均衡化:
5)映射關(guān)系:
Turky于1971年提出了中值濾波算法[9],其基本思想是用指定領(lǐng)域內(nèi)像素的灰度中值替換需要處理的圖像中的像素點值。中值濾波算法,不僅可以消除破壞性的噪聲,而且可以保護圖像邊緣[10~11],在圖像增強和恢復(fù)等領(lǐng)域中得到了廣泛的應(yīng)用[12],比線性平滑濾波器的模糊程度明顯要低,其數(shù)學(xué)公式為
其中,d(i,j)為濾波結(jié)果,f(i,j)為輸入圖像灰度值,M為濾波模板。圖1顯示了要處理的原始圖像中待處理的中心像素點值及其領(lǐng)域像素點值,圖2為本文采用的3×3濾波模板,圖3顯示了濾波模板像素點的線性陣列排列順序。本文中值濾波算法的具體步驟為
1)將圖1待處理中心像素點及其領(lǐng)域像素點賦值給圖2濾波模板的對應(yīng)位置,并將濾波模板以圖3線性陣列的位置順序由小到大進行排序;
2)排列出圖3線性陣列前5個位置的像素點灰度值順序,因為中值濾波不需要對整個陣列進行排序,只需找到陣列中間值即可;
3)使用排序后陣列位置為f[4]的像素點灰度值代替圖1的中心像素點灰度值;
4)從左到右,從上到下依次移動濾波模板,重復(fù)1)~3)步驟,直至處理完所有的像素點灰度值。
圖1 原始圖像像素點
圖2 3×3濾波模板
圖3 線性陣列
從以上操作可以看出,圖像的第一行、最后一行、第一列和最后一列像素點沒有被遍歷到。一般有兩種方案解決這個問題:1)將該位置的所有像素賦值為零;2)在原始圖像的上下左右都加上全零向量。本文將中值濾波器未遍歷到的所有邊界像素點都賦值為零。
直方圖均衡化結(jié)合中值濾波的CPU串行算法流程如圖4所示。
GPUS不同于傳統(tǒng)的CPUS,為它們開發(fā)的應(yīng)用程序通常是使用專門的應(yīng)用程序編程接口來編寫[13],例如CUDA和OPenCL。NVIDIA于2006年11月推出了統(tǒng)一計算設(shè)備架構(gòu)CUDA(Compute Unified Device Architecture),一個通用的并行計算平臺和編程模型,它利用了NVIDIA GPUS的并行計算引擎,以一種比CPU更有效的方式解決許多復(fù)雜的計算問題。NVIDIA開發(fā)CUDA編程模型和軟件環(huán)境,讓程序員可以使用C語言的直接擴展來編寫可伸縮的并行程序[14]。在CUDA編程模型中,CPU作為主機端,GPU作為設(shè)備端,主機端僅有一個,設(shè)備端可以有多個,CPU與GPU通過PCI-E總線連接,CPU在處理邏輯性強的事務(wù)和串行計算任務(wù)方面具有優(yōu)勢,而GPU在處理密集型數(shù)據(jù)和并行數(shù)據(jù)方面優(yōu)勢明顯[15]。運行在GPU上的函數(shù)稱為核(kernel)函數(shù),一個完整的CUDA計算任務(wù),是由主機端串行代碼和設(shè)備端并行核函數(shù)共同完成[16]。
圖4 CPU串行算法流程
根據(jù)直方圖均衡化算法基本原理,分析算法耗時的三個模塊:遍歷統(tǒng)計每個灰度級的像素點個數(shù)、直方圖均衡化及灰度映射,各個像素點之間無相關(guān)性,各級灰度級之間相互獨立。
根據(jù)中值濾波算法基本原理,中值濾波后圖像每個像素點的灰度值僅與噪聲圖像中要處理的像素點及其領(lǐng)域內(nèi)像素點灰度值有關(guān)。中值濾波算法以相同的方式處理圖像中的每個像素,各個像素點之間相互獨立。
因此,由以上分析可知,隨著圖像尺寸的增大,像素點數(shù)量增多,像素點之間無相關(guān)性,符合GPU處理高計算密度和大規(guī)模并行數(shù)據(jù)的特點,可以實現(xiàn)直方圖均衡化結(jié)合中值濾波的并行化。
本文使用CUDA結(jié)合OpenCV自帶的簡單的圖像處理接口編程實現(xiàn)。在CPU端,使用OpenCV提供的API進行原始圖像的讀取、像素數(shù)據(jù)的獲取及圖像的顯示和輸出;在GPU端,編寫圖像并行化處理的CUDA程序。
并行算法具體步驟為1)使用OpenCV提供的API:imread()載入原始圖像,且加入椒鹽噪聲。對處理一幅大小為width×height的圖像,創(chuàng)建一個二維grid包含(width+16-1)×(height+16-1)/(16×16)個線程塊,并設(shè)置一個二維block包含256個線程,與灰度圖像的灰度級一致。主機端使用cuda?Malloc()函數(shù)分配顯存,并使用cudaMemcpy()函數(shù)將主存中的噪聲圖像數(shù)據(jù)拷貝到顯存。調(diào)用核函數(shù)Histokernel計算圖像直方圖,且調(diào)用原子操作函數(shù) atomicAdd(addr,y)生成一個原子操作序列,完成讀取地址為addr處的像素點值,累加到對應(yīng)的灰度級,及將結(jié)果保存回地址addr,在統(tǒng)計完成所有像素點后將直方圖結(jié)果拷貝到主存;2)在主機端串行完成計算量少的直方圖歸一化及累計直方圖計算,并在CPU端分配顯存,將累計直方圖結(jié)果拷貝到顯存;3)調(diào)用核函數(shù)Equhistkernel分配一個線程塊完成直方圖均衡化;4)調(diào)用核函數(shù)Mapmageker?nel完成灰度映射;5)在直方圖均衡化之后調(diào)用核函數(shù)MedianFliterkernel抑制圖像噪聲;6)將濾波后的圖像數(shù)據(jù)從顯存拷貝回主存,并釋放分配的顯存。使用OpenCV提高的API:imshow()和imwrite()分別顯示和輸出處理后的圖像。
直方圖均衡化結(jié)合中值濾波的GPU并行算法流程如圖5所示。
圖5 GPU并行算法流程
實驗環(huán)境配置,處理器:Intel Core i5-7400,物理 4核,主頻 3GHz,內(nèi)存 8GB;GPU:NVIDIA Ge?Force GT730,顯存為2048MB,2個流多處理器(SM),每個流多處理器包含192個流處理器(SP);操作系統(tǒng):Windows7 SP1 64bit;編程環(huán)境:Visual Studio 2015,安裝并配置CUDA9.0,OpenCV-3.4.1,Cmake3.12。
本文首先對原始圖像加入20000個椒鹽噪聲點,并進行直方圖均衡化處理;然后,引入中值濾波算法,分別實現(xiàn)直方圖均衡化結(jié)合中值濾波的串并行圖像處理。本文以分辨率為512×512的Lena圖像為例來比較串并行處理效果,圖6(a)為原始圖像,圖6(b)為椒鹽噪聲密度為7.6%的Lena圖像,圖6(c)、(d)和圖7(c)、(d)分別為串并行處理方式下,Lena圖像的處理效果。表1為直方圖均衡化結(jié)合中值濾波的串并行執(zhí)行時間。
圖6 串行Lena圖像處理結(jié)果
圖7 并行Lena圖像處理結(jié)果
從圖6(c)串行和圖7(c)并行處理效果圖可以看出,直方圖均衡化在改善圖像對比度上起到了良好的效果,但直方圖均衡化處理不能有效去除圖像噪聲。通過直方圖均衡化與中值濾波相結(jié)合,對含有椒鹽噪聲的圖像分別進行串行與并行處理后,從圖6(d)串行與圖7(d)并行處理效果圖可以看出,圖像處理效果一致,圖像噪聲得到了有效抑制,圖像清晰度和對比度得到了提高,且圖像變得平滑,圖像的整體視覺效果得到了明顯改善。
表1 中值濾波后CPU和GPU運行時間
表1是對加入20000個椒鹽噪聲點的圖像進行串并行處理。通過對中值濾波后的圖像進行20次測試取平均值,比較直方圖均衡化結(jié)合中值濾波在CPU和GPU上的執(zhí)行時間。從表中可以看出,隨著圖像尺寸的增大,CPU串行處理時間增幅較大,GPU并行處理時間增幅較小,加速比逐漸增大。
針對直方圖均衡化不能有效去除噪聲的問題,論文引入中值濾波算法來抑制最常見的椒鹽噪聲對直方圖均衡化圖像效果的影響。并對于使用傳統(tǒng)CPU處理方式,算法執(zhí)行效率低的缺點。利用GPU強大的并行計算能力,實現(xiàn)基于CUDA和OpenCV的直方圖均衡化結(jié)合中值濾波的并行化。實驗結(jié)果表明,直方圖均衡化結(jié)合中值濾波的串并行圖像處理效果一致,都能夠明顯抑制圖像中的椒鹽噪聲、提高圖像對比度和清晰度,改善圖像的整體視覺效果,但隨著圖像尺寸的增大,GPU并行處理速度相比于傳統(tǒng)CPU串行處理速度,明顯提高了數(shù)據(jù)處理速度。