Python中使用OpenCV库来进行简单的气象学遥感影像计算
作者:GISLU 发布时间:2021-02-02 09:45:49
OpenCV的全称是Open Source Computer Vision Library,是一个跨平台的计算机视觉库。OpenCV是由英特尔公司发起并参与开发,以BSD许可证授权发行,可以在商业和研究领域中免费使用。OpenCV可用于开发实时的图像处理、计算机视觉以及模式识别程序。该程序库也可以使用英特尔公司的IPP进行加速处理。
OpenCV用C++语言编写,它的主要接口也是C++语言,但是依然保留了大量的C语言接口。该库也有大量的Python, Java and MATLAB/OCTAVE (版本2.5)的接口。这些语言的API接口函数可以通过在线文档获得。现在也提供对于C#, Ch,Ruby的支持。
在Windows上编译OpenCV中与摄像输入有关部分时,需要DirectShow SDK中的一些基类。该SDK可以从预先编译的Microsoft Platform SDK (or DirectX SDK 8.0 to 9.0c / DirectX Media SDK prior to 6.0)的子目录Samples\Multimedia\DirectShow\BaseClasses获得。
下面我们就来看看OpenCV在Python编程下的应用,我们来处理一下简单的气象学计算,用python里面的opencv库写个脚本批处理图像反射率的计算试试~
核心步骤就是 遥感影像光谱辐射定标 →大气校正→计算反射率这三步了
1、遥感影像的光谱辐射定标
由遥感器的灵敏度特征引起的辐射畸变主要由其光学系统或光电转换系统的特征形成的,光电转换系统的灵敏性特征通常很重复,其校正一般是通过定期的地面测定值进行的。
遥感器光谱辐射定标时采用以下转换算式:
遥感器各波段偏移与增益值从论文找了找后,找到这么一张表~
那么这么个函数就能定标咯:
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)
其中: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+数据地面反射率反演的数学模型可综合表达为:
其中:ρ——地面相对反射率;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)


猜你喜欢
- 使用matplotlib绘图时,在弹出的窗口中默认是有工具栏的,那么这些工具栏是如何定义的呢?工具栏的三种模式matplotlib的基础配置
- 本文实例讲述了Go语言对字符串进行MD5加密的方法。分享给大家供大家参考。具体实现方法如下:package mainimport (&nbs
- 在网上查找删除重复数据保留id最小的数据,方法如下:DELETEFROM peopleWHERE peopleNam
- python中pass的作用?pass代表一个空的语句块Python中pass的作用:示例1,定义一个类,类中没有任何内容保存,运行之后,该
- function formatNum(num){ if
- 1、异常的传播当在函数中出现异常时,如果在函数中对异常进行了处理,则异常不会再继续传播。如果函数中没有对异常进行处理,则异常会继续向函数调用
- 同样,对事务日志进行备份也只会截断不活动事务的那部分事务日志,所以打开的事务会导致日志变多(甚至达到物理限制),直到事务被提交或回滚。要找到
- 假设三节点MGR某个节点异常,需要重新把这个节点加入到MGR集群中,具体操作过程如下:贡献者端执行(192.168.1.11)DROP US
- Pyinstaller库简介:简单来说,就是直接将python语言编写的py程序打包为exe可执行文件,对方不需要安装python环境即可直
- 1.C++ 代码Demo.h#pragma oncevoid GeneratorGaussKernel(int ksize, float s
- 定位色块常用到hsv色彩空间下的颜色阈值,笔者曾经用openmv时,其IDE有自带一个阈值编辑器,使用起来非常方便,现在在linux上跑cv
- 由于初学Django所以对于其特有的表单模板和models中的filefiled并不是特别熟悉。因此在本次开发中还是依照以往自己在html中
- 示例代码如下:#!/usr/bin/python#-*- coding: utf-8 -*-import matplotlib.pyplot
- 1、日期大小的比较,传到xml中的日期格式要符合'yyyy-MM-dd',这样才能走索引,如:'yyyy'改
- 修改MySQL密码:mysqladmin -u root -p password 123456mysqladmin -u用户名 -p旧密码
- 下午有同学Python学习群里说,使用pyinstaller打包源码时,因为代码中使用了图像、音频、视频等资源文件,无法将程序打包成单一的可
- 前言大家应该都有所体会,对于字符串型的IP存入数据库中,实在是个即浪费空间又浪费性能的家伙,所以可爱的人们想出来将IP转换为整型存储。MyS
- Radiobutton(单选按钮)组件用于实现多选一的问题。Radiobutton 组件可以包含文本或图像,每一个按钮都可以与一个 Pyth
- 题目描述:(1)模拟登陆界面,判别用户名和密码,给出合适的提示,如果超过三次,锁定输入。用代替密码;或者最新输入显示,前面的变成;安全性措施
- python内置模块collections介绍collections是Python内建的一个集合模块,提供了许多有用的集合类。1、named