邢耀文 李天鶴
(山東省國土測繪院,山東 濟南 250102)
隨著我國城市化進(jìn)程的發(fā)展與地理信息技術(shù)的不斷進(jìn)步,在城市建設(shè)、土地規(guī)劃、農(nóng)林檢測、生活生產(chǎn)等各個領(lǐng)域?qū)娇沼跋竦默F(xiàn)勢性及實用性的要求越來越高。像片照度作為判讀地物的關(guān)鍵參數(shù),應(yīng)在航空影像獲取后第一時間進(jìn)行檢查與處理。在現(xiàn)有航空攝影工作中,通常因為影像獲取時間、天氣狀況、地表反射情況或其他相關(guān)因素影響,極易出現(xiàn)單幅影像內(nèi)部、區(qū)域范圍內(nèi)多幅影像色彩、照度不平衡情況[1],影響后續(xù)航空影像的內(nèi)業(yè)處理(如影像分類解譯、數(shù)字正射影像圖制作、三維模型構(gòu)建等)[2]。由于目前航空攝影工作普遍存在單張影像像幅大、像片數(shù)量多等特點,因而解決大量影像的批量快速勻光成為航空影像預(yù)處理的重要內(nèi)容。
本研究選取目前單張像片勻光中最常用的Mask方法,通過探討其勻光原理與流程,基于Python語言簡單高效且擴展能力強的特點,結(jié)合第三方數(shù)據(jù)庫OpenCV在圖像分析與處理方面的強大功能模擬實現(xiàn)利用Mask方法對航空像片勻光的批量快速處理,為大量航空影像的快速勻光處理提供了新的解決方案。
Python語言是一種解釋型計算機程序腳本語言,由Guido van Rossum在1991年創(chuàng)造[3]。相對于其他計算機語言,Python語句結(jié)構(gòu)簡單、語法定義明確、代碼定義清晰,便于學(xué)習(xí)、閱讀和維護(hù);因為開放源代碼,Python具有豐富且強大的第三方庫,在Linux,Windows等平臺上兼容性都較好;Python既支持面向過程的編程也支持面向?qū)ο蟮木幊獭T凇懊嫦蜻^程”的語言中,程序是由過程或僅僅是可重用代碼的函數(shù)構(gòu)建起來的。在“面向?qū)ο蟆钡恼Z言中,程序是由數(shù)據(jù)和功能組合而成的對象構(gòu)建起來的。與其他主要的語言相比,Python以一種非常強大又簡單的方式實現(xiàn)面向?qū)ο缶幊??;谝陨咸攸c與優(yōu)勢,Python目前在圖像解譯、科學(xué)計算、數(shù)據(jù)挖掘、人工智能等眾多領(lǐng)域應(yīng)用廣泛[4]。
OpenCV(Open Source Computer Vision Library)于1999年由Gary Bradsky在英特爾創(chuàng)立,是一個基于開源發(fā)行的跨平臺計算機視覺庫,第一個版本于2000年問世,目前已可以運行在Linux,Windows,Android和Mac OS操作系統(tǒng)上。它由一系列C函數(shù)和少量C++類構(gòu)成,具有C++,Python,Java和MATLAB接口,有超過500種算法和大約10倍組成或支持這些算法的函數(shù)。OpenCV實現(xiàn)了圖像處理和計算機視覺方面的很多通用算法,已成為計算機視覺領(lǐng)域最有力的研究工具[5]。
OpenCV由cv(核心函數(shù)庫)、cvaux(輔助函數(shù)庫)、cxcore(數(shù)據(jù)結(jié)構(gòu)與線性代數(shù)庫)、highgui(GUI函數(shù)庫)、ml(機器學(xué)習(xí)函數(shù)庫)等模塊構(gòu)成,主要用于解決圖像數(shù)據(jù)操作、圖像/視頻的輸入輸出、矩陣/向量數(shù)據(jù)操作及線性代數(shù)運算、基本圖像處理、結(jié)構(gòu)分析、目標(biāo)識別、圖像標(biāo)注等功能。
Mask勻光法是基于傳統(tǒng)光學(xué)像片的曬印方法而提出的[6]。其原理是選擇一張稱為Mask的密度或色彩隨位置緩慢變化的模糊的透明薄膜作為正片[7],與原始像片(稱為負(fù)片)按輪廓線疊加進(jìn)行曬像獲得一張色彩密度較為均勻的像片,隨后進(jìn)行曬印以增強像片總體反差。Mask勻光法的特點是消減影像中的大反差而增強影像中的小反差,從而使整張影像照度與色彩趨于一致[8]。Mask勻光法常用于單幅影像的勻光處理,具有較強的適應(yīng)性,是目前應(yīng)用最多的勻光方法。Mask勻光法的數(shù)學(xué)模型可表示為:
I′(x,y)=Ist(x,y)+Ibg(x,y)
(1)
其中,I′(x,y)為原始影像;Ist(x,y)為照度均勻的理想影像;Ibg(x,y)為背景影像。通常根據(jù)Mask勻光法獲取亮度均勻的理想影像的方法是將原始影像采用高斯低通濾波方法過濾掉其中的高頻分量即原始影像中亮度變化較為強烈的部分得到背景影像,兩者相減獲得剔除了高頻信息的光照分布均勻的圖像,同時為了保證圖像細(xì)節(jié)不丟失且勻光前后圖像亮度的一致性[9],將上面模型進(jìn)行如下修改:
Ist(x,y)=I′(x,y)-I′(x,y)×G(x,y)+offset
(2)
其中,G(x,y)為高斯低通濾波器;offset為原始影像灰度均值的偏移量。
試驗數(shù)據(jù)為山東省某縣級市地面分辨率為15 cm的SWDC-4航攝儀獲取的影像共1 000張,其單張像幅為970 Mb,航攝期間,攝區(qū)天氣良好、飛行穩(wěn)定、航攝儀工作正常。但由于航攝區(qū)域有大量易反光地物如建成建筑、河流等,因而存在大量的樓頂及水體反光問題需進(jìn)行勻光處理。
利用Mask方法進(jìn)行勻光處理的關(guān)鍵是獲取背景影像[10]。背景影像由原始影像經(jīng)高斯低通濾波獲取。由于背景影像為一張亮度隨位置變化的灰度圖,對影像地物細(xì)節(jié)的要求并不高,為提高處理速度,可對原始影像進(jìn)行重采樣降低分辨率作為制作背景影像的模板;針對高斯低通濾波器在圖像頻率譜中的良好應(yīng)用效果,需要對重采樣影像進(jìn)行傅里葉變換,獲得影像在頻率域中的高斯低通濾波表達(dá)形式H(μ,υ)=e-D2(μ,v)/2σ2,其中,D(μ,v)為頻率域原點到點(μ,v)的距離;σ為高斯模糊半徑,決定了高斯低通濾波器的勻光強度。對濾波后的影像頻率譜進(jìn)行傅里葉逆變換得到空間域影像;根據(jù)原始影像尺寸對經(jīng)過低通濾波的低分辨率影像進(jìn)行重采樣獲得與原始影像可疊加的背景影像,將原始影像與背景影像進(jìn)行相減處理,并加上原始影像灰度均值偏移量保證影像細(xì)節(jié)即得到最終的勻光后影像。其處理流程如圖1所示。
利用Python語言的便捷高效特點及OpenCV庫對圖像強大的分析處理功能,可以將Mask勻光法批量應(yīng)用于影像的快速勻光處理,以下提供了部分關(guān)鍵步驟的核心代碼:
1)影像重采樣功能。
Img_0001=cv2.imread(r"D:TestDataImg0001.tif",0)
Img_0001=cv2.resize(Img0001,(int(y/2),int(x/2)))
通過OpenCV庫的cv2.resize()函數(shù)可以實現(xiàn)圖像不同程度的重采樣功能。
2)影像傅里葉變換。
Img_f0001=cv2.imread(r"D:TestDataImg0001.tif",0)
dft=cv2.dft(np.float32(Img_f0001),flags=cv2.DFT_COMPLEX_OUTPUT)
dft_shift=numpy.fft.fftshift(dft)
OpenCV庫中的cv2.dft()方法接受一個灰度格式的圖像參數(shù),對其進(jìn)行頻譜轉(zhuǎn)換,輸出一個0頻率在圖像左上角的頻譜數(shù)組,為方便濾波分析,利用numpy模塊的fftshift()函數(shù)將其0頻率轉(zhuǎn)換到影像中心位置。
3)高斯低通濾波。
rows,cols=Img_f0001.shape
crow,ccol=int(rows/2),int(cols/2)
mask=numpy.zeros((rows,cols,2),numpy.uint8)
mask[crow-20:crow+20,ccol-20:ccol+20]=1
f=dft_shift*mask
設(shè)置一個參數(shù)名mask的濾波器,并通過調(diào)整濾波器的尺度確定其勻光效果,最終獲取濾波后的影像頻譜數(shù)組。
4)傅里葉逆變換。
ishift=numpy.fft.ifftshift(f)
iimg=cv2.idft(ishift)
類似于傅里葉變換,numpy模塊提供了iffshift()函數(shù),OpenCV庫提供了cv2.idft()函數(shù)實現(xiàn)了影像頻譜的傅里葉逆變換。
1)批量處理速度。
為保證對大量航空影像進(jìn)行批量勻光處理的計算效率,應(yīng)保證計算機硬件的配置要求,試驗選取計算機硬件為Inter(R)Core(TM)i7-4790k處理器,32GB內(nèi)存,2TB機械硬盤的處理平臺,通過對1 000張影像進(jìn)行批量勻光處理,總計用時約160 min,單張?zhí)幚頃r間約為10 s,相對于利用傳統(tǒng)圖片處理軟件進(jìn)行單張影像勻光所需20 s~40 s,整體效率提升了2倍~4倍。
2)勻光效果。
選擇實驗數(shù)據(jù)中的一張原始影像及勻光后影像進(jìn)行比較,如圖2所示。
從目視效果看,圖2a)原始影像中由于拍攝時的光照條件及相機參數(shù)設(shè)置等原因,水體呈現(xiàn)曝光過度狀態(tài),亮度較高且與周邊的農(nóng)用地反差較大,不利于后期影像的制作與使用;圖2b)是應(yīng)用Mask方法制作的該幅影像的背景影像,可以看到在水體部分明顯的高亮,村莊處白色屋頂反光較強也存在相對高亮;圖2c)為勻光處理后的影像,可見水體亮度明顯被減弱,水體細(xì)節(jié)得到了加強,與周邊地物的關(guān)系更加協(xié)調(diào)。進(jìn)一步將原始影像與勻光后影像進(jìn)行亮度統(tǒng)計分析得到表1。
表1 影像勻光前后亮度參數(shù)對比
通過對影像進(jìn)行分塊量化分析發(fā)現(xiàn),勻光后影像的總體亮度和亮度的離散值較原始影像均有下降,這主要是由該幅影像的下部1/3即水體部分進(jìn)行了大幅的勻光,其他色彩較好區(qū)域并未對照度進(jìn)行過多干預(yù),勻光尺度與影像的適應(yīng)性較好;各部分平均梯度在勻光前后變化量少,說明背景影像經(jīng)過兩次重采樣并未對原始影像細(xì)節(jié)造成影響,高亮區(qū)域或陰暗區(qū)域的勻光在一定程度上也會增加影像的細(xì)節(jié)表現(xiàn)。綜合看來影像總體勻光效果理想。
針對航空影像數(shù)據(jù)量日益增大的問題,本文基于Mask勻光原理,使用Python語言設(shè)計了一種批量快速勻光算法。經(jīng)過實驗與分析,發(fā)現(xiàn)該算法具有以下優(yōu)點:1)處理速度快。相較于單張?zhí)幚硇?,批量處理能夠基于腳本方式完成勻色,效率可提升2倍~4倍。2)勻光效果好。該算法能夠自動識別航空影像亮度的離散程度,重點計算過亮或過暗區(qū)域的曝光度,不會對亮度和色彩較為理想的區(qū)域造成過多的干擾。3)使用成本低、程序開發(fā)易。當(dāng)前基于Python語言和OpenCV數(shù)據(jù)庫的開放性資源較多,讀者可以根據(jù)本文的思想和方法,靈活設(shè)計適合自己需求的算法。上述優(yōu)點表明本文設(shè)計的算法適用于大批量航空影像的快速勻光處理,是一種切實可行的方法。在今后的研究中,筆者將會重點對圖像最優(yōu)分塊策略的自適應(yīng)性方面進(jìn)行研究,以便提高航空影像快速勻光流程的整體效率和勻光效果。