Python中使用OpenCV庫來進(jìn)行簡單的氣象學(xué)遙感影像計(jì)算
OpenCV的全稱是Open Source Computer Vision Library,是一個跨平臺的計(jì)算機(jī)視覺庫。OpenCV是由英特爾公司發(fā)起并參與開發(fā),以BSD許可證授權(quán)發(fā)行,可以在商業(yè)和研究領(lǐng)域中免費(fèi)使用。OpenCV可用于開發(fā)實(shí)時的圖像處理、計(jì)算機(jī)視覺以及模式識別程序。該程序庫也可以使用英特爾公司的IPP進(jìn)行加速處理。
OpenCV用C++語言編寫,它的主要接口也是C++語言,但是依然保留了大量的C語言接口。該庫也有大量的Python, Java and MATLAB/OCTAVE (版本2.5)的接口。這些語言的API接口函數(shù)可以通過在線文檔獲得?,F(xiàn)在也提供對于C#, Ch,Ruby的支持。
在Windows上編譯OpenCV中與攝像輸入有關(guān)部分時,需要DirectShow SDK中的一些基類。該SDK可以從預(yù)先編譯的Microsoft Platform SDK (or DirectX SDK 8.0 to 9.0c / DirectX Media SDK prior to 6.0)的子目錄Samples\Multimedia\DirectShow\BaseClasses獲得。
下面我們就來看看OpenCV在Python編程下的應(yīng)用,我們來處理一下簡單的氣象學(xué)計(jì)算,用python里面的opencv庫寫個腳本批處理圖像反射率的計(jì)算試試~
核心步驟就是 遙感影像光譜輻射定標(biāo) →大氣校正→計(jì)算反射率這三步了
1、遙感影像的光譜輻射定標(biāo)
由遙感器的靈敏度特征引起的輻射畸變主要由其光學(xué)系統(tǒng)或光電轉(zhuǎn)換系統(tǒng)的特征形成的,光電轉(zhuǎn)換系統(tǒng)的靈敏性特征通常很重復(fù),其校正一般是通過定期的地面測定值進(jìn)行的。
遙感器光譜輻射定標(biāo)時采用以下轉(zhuǎn)換算式:
遙感器各波段偏移與增益值從論文找了找后,找到這么一張表~
那么這么個函數(shù)就能定標(biāo)咯:
def computL(gain,Dn,bias): return (gain*Dn+bias)
2、遙感影像的大氣校正
任何一種依賴大氣物理模型的大氣校正方法都需要先進(jìn)行遙感器的輻射校準(zhǔn)。
公式是這個咯(Chavez P S,Jr. Image -Based Atmospheric Correction Revisited and Improved Photogrammetric Engineering and Remote Sensing, 1996,62,1025 -1036)
其中:Lhazel——大氣層光譜輻射值;LI,min——遙感器每一波段最小光譜輻射值;LI,1%——反射率為1%的黑體輻射值。
關(guān)于LI,min和LI,1%的計(jì)算公式就省略了啊,感興趣的同學(xué)可以自己去查查論文~
而計(jì)算Lhazel需要的參數(shù)可以從遙感圖像的頭文件中獲得一部分,還有一部分是固定的參數(shù)~這些都藏在ENVI的背后,不過自己寫腳本的時候找出他們還是廢了一番功夫的。
計(jì)算Lhazel的代碼如下:
#ESUN ESUNI71=196.9 cos=math.cos(math.radians(90-41.3509605)) # Lmini=-6.2 Lmax=293.7 # Qcal=1 Qmax=255 LIMIN=Lmini+(Qcal*(Lmax-Lmini)/Qmax) LI=(0.01*ESUNI71*cos*cos)/(math.pi*D*D) Lhazel=LIMIN-LI
3、計(jì)算遙感影像的反射率
根據(jù)太陽輻射和大氣傳輸原理與過程,TM/ETM+數(shù)據(jù)地面反射率反演的數(shù)學(xué)模型可綜合表達(dá)為:
其中:ρ——地面相對反射率;D——日地天文單位距離;LsatI——傳感器光譜輻射值,即大氣頂層的輻射能量;LhazeI——大氣層輻射值;ESUNl——大氣頂層的太陽平均光譜輻射,即大氣頂層太陽輻照度;SZ——太陽天頂角。
這里提一下其中兩個參數(shù)的計(jì)算公式:
日地天文單位距離 D=1 -0.01674 cos(0.9856×(JD-4)×π/180);
(JD為遙感成像的儒略日(Julian Day),計(jì)算公式為:
JD=K-32075+1461*(I+4800+(J-14)/12)/4+367*(J-2-(J-14)/12*12)/12-3*((I+4900+(J-14)/12)/100)/4
I、J、K分別為年、月、日
有了這些,最后就能直接算出來反射率啦,粗糙代碼如下,因?yàn)槭菍懼娴?,也沒怎么處理:
不過需要注意的是,遙感圖像進(jìn)行計(jì)算跟輸出的時候,需要使用uint16類型的數(shù)組來存儲的(uint8長度不夠啊。。)
一些參數(shù)涉及到浮點(diǎn)數(shù)計(jì)算,如果對處理結(jié)果有極高要求的話,最好使用專門的科學(xué)運(yùn)算庫(像我這種渣學(xué)校才不介意這些)
import cv2 import numpy as np import math img1=cv2.imread('F:\L71121040_04020030220_B10.TIF') #圖像格式轉(zhuǎn)換 img10=cv2.cvtColor(img1,cv2.COLOR_BGR2GRAY) #計(jì)算JD I=2003 J=2 K=20 JD=K-32075+1461*(I+4800+ (J-14)/12)/4+367*(J-2-(J-14)/12*12)/12-3*((I+4900+(J-14)/12)/100)/4 #設(shè)置ESUNI值 ESUNI71=196.9 #計(jì)算日地距離D D=1-0.01674*math.cos((0.9856*(JD-4)*math.pi/180)) #計(jì)算太陽天頂角 cos=math.cos(math.radians(90-41.3509605)) inter=(math.pi*D*D)/(ESUNI71*cos*cos) #大氣校正參數(shù)設(shè)置 Lmini=-6.2 Lmax=293.7 Qcal=1 Qmax=255 LIMIN=Lmini+(Qcal*(Lmax-Lmini)/Qmax) LI=(0.01*ESUNI71*cos*cos)/(math.pi*D*D) Lhazel=LIMIN-LI def copy(img,new1): new1= np.zeros(img.shape,dtype='uint16') new1[:,:] = img[:,:] def computL(gain,Dn,bias): return (gain*Dn+bias) if __name__ == '__main__': print 'D=',D print 'cosZS=',cos print 'Lhazel=',Lhazel #計(jì)算圖像反射率 result=np.zeros(img.shape,dtype='uint16') for i in range(0,img.shape(1)): for j in range(0,img.shape(0)): Lsat=computL(1.18070871,img10[i,j],-7.38070852) result[i,j]=inter*(Lsat-Lhazel)*1000 #保存圖像 cv2.imwrite("F:\\result.tif", result) cv2.namedWindow("Image") cv2.imshow("Image", result) cv2.waitKey(0)
相關(guān)文章
Python實(shí)現(xiàn)結(jié)構(gòu)體代碼實(shí)例
這篇文章主要介紹了Python實(shí)現(xiàn)結(jié)構(gòu)體代碼實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-02-02詳解Bagging算法的原理及Python實(shí)現(xiàn)
Bagging算法(Bootstrap aggregating,引導(dǎo)聚集算法),又稱裝袋算法,是機(jī)器學(xué)習(xí)領(lǐng)域的一種團(tuán)體學(xué)習(xí)算法。最初由Leo Breiman于1996年提出。Bagging算法可與其他分類、回歸算法結(jié)合,提高其準(zhǔn)確率、穩(wěn)定性的同時,通過降低結(jié)果的方差,避免過擬合的發(fā)生2021-06-06對numpy下的軸交換transpose和swapaxes的示例解讀
今天小編就為大家分享一篇對numpy下的軸交換transpose和swapaxes的示例解讀,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-06-06Python實(shí)現(xiàn)GUI圖片瀏覽的小程序
這篇文章主要介紹了Python實(shí)現(xiàn)GUI圖片瀏覽程序,程序的實(shí)現(xiàn)需要pillow庫,pillow是 Python 的第三方圖像處理庫,需要安裝才能實(shí)用,文中通過代碼示例給大家介紹的非常詳細(xì),需要的朋友可以參考下2023-12-12淺談pandas中shift和diff函數(shù)關(guān)系
下面小編就為大家分享一篇淺談pandas中shift和diff函數(shù)關(guān)系,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-04-04