python气象学_Python中使用OpenCV库来进行简单的气象学遥感影像计算

本文介绍了如何使用Python的OpenCV库进行气象学遥感影像的计算,包括大气校正和反射率的计算。通过提供的代码示例,展示了从获取图像数据到计算反射率的过程,涉及日地距离、太阳天顶角等参数的计算。
摘要由CSDN通过智能技术生成

def computL(gain,Dn,bias):

return (gain*Dn+bias)

2、遥感影像的大气校正任何一种依赖大气物理模型的大气校正方法都需要先进行遥感器的辐射校准。

公式是这个咯(Chavez P S,Jr. Image -Based Atmospheric Correction Revisited and Improved Photogrammetric Engineering and Remote Sensing, 1996,62,1025 -1036)

205234dd5ebec0b84162ddef42849fea.png

其中:Lhazel——大气层光谱辐射值;LI,min——遥感器每一波段最小光谱辐射值;LI,1%——反射率为1%的黑体辐射值。

关于LI,min和LI,1%的计算公式就省略了啊,感兴趣的同学可以自己去查查论文~

而计算Lhazel需要的参数可以从遥感图像的头文件中获得一部分,还有一部分是固定的参数~这些都藏在ENVI的背后,不过自己写脚本的时候找出他们还是废了一番功夫的。

计算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、计算遥感影像的反射率根据太阳辐射和大气传输原理与过程,TM/ETM+数据地面反射率反演的数学模型可综合表达为:

2e5042361df312805d9a0db3cf052965.png

其中:ρ——地面相对反射率;D——日地天文单位距离;LsatI——传感器光谱辐射值,即大气顶层的辐射能量;LhazeI——大气层辐射值;ESUNl——大气顶层的太阳平均光谱辐射,即大气顶层太阳辐照度;SZ——太阳天顶角。

这里提一下其中两个参数的计算公式:

日地天文单位距离 D=1 -0.01674 cos(0.9856×(JD-4)×π/180);

(JD为遥感成像的儒略日(Julian Day),计算公式为:

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分别为年、月、日

有了这些,最后就能直接算出来反射率啦,粗糙代码如下,因为是写着玩的,也没怎么处理:

不过需要注意的是,遥感图像进行计算跟输出的时候,需要使用uint16类型的数组来存储的(uint8长度不够啊。。)

一些参数涉及到浮点数计算,如果对处理结果有极高要求的话,最好使用专门的科学运算库(像我这种渣学校才不介意这些)

import cv2

import numpy as np

import math

img1=cv2.imread('F:\L71121040_04020030220_B10.TIF')

#图像格式转换

img10=cv2.cvtColor(img1,cv2.COLOR_BGR2GRAY)

#计算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

#设置ESUNI值

ESUNI71=196.9

#计算日地距离D

D=1-0.01674*math.cos((0.9856*(JD-4)*math.pi/180))

#计算太阳天顶角

cos=math.cos(math.radians(90-41.3509605))

inter=(math.pi*D*D)/(ESUNI71*cos*cos)

#大气校正参数设置

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

#计算图像反射率

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)

本条技术文章来源于互联网,如果无意侵犯您的权益请点击此处反馈版权投诉

本文系统来源:php中文网

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值