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


Posted in Python onFebruary 19, 2016

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、遥感影像的光谱辐射定标
由遥感器的灵敏度特征引起的辐射畸变主要由其光学系统或光电转换系统的特征形成的,光电转换系统的灵敏性特征通常很重复,其校正一般是通过定期的地面测定值进行的。
遥感器光谱辐射定标时采用以下转换算式:

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

遥感器各波段偏移与增益值从论文找了找后,找到这么一张表~

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

那么这么个函数就能定标咯:

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)

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

其中: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+数据地面反射率反演的数学模型可综合表达为:

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

其中:ρ——地面相对反射率;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)
Python 相关文章推荐
python django集成cas验证系统
Jul 14 Python
Python实现扫描指定目录下的子目录及文件的方法
Jul 16 Python
python通过urllib2获取带有中文参数url内容的方法
Mar 13 Python
Python tkinter模块弹出窗口及传值回到主窗口操作详解
Jul 28 Python
python在ubuntu中的几种安装方法(小结)
Dec 08 Python
python使用tkinter实现简单计算器
Jan 30 Python
python+opencv识别图片中的圆形
Mar 25 Python
通过python的matplotlib包将Tensorflow数据进行可视化的方法
Jan 09 Python
Python 函数返回值的示例代码
Mar 11 Python
Python 3.6 -win64环境安装PIL模块的教程
Jun 20 Python
Python中openpyxl实现vlookup函数的实例
Oct 28 Python
python实现简单文件读写函数
Feb 25 Python
Python实现以时间换空间的缓存替换算法
Feb 19 #Python
Python使用爬虫猜密码
Feb 19 #Python
使用Python简单的实现树莓派的WEB控制
Feb 18 #Python
在Ubuntu系统下安装使用Python的GUI工具wxPython
Feb 18 #Python
以一个投票程序的实例来讲解Python的Django框架使用
Feb 18 #Python
使用Python生成随机密码的示例分享
Feb 18 #Python
使用Python的urllib2模块处理url和图片的技巧两则
Feb 18 #Python
You might like
PHP上传图片进行等比缩放可增加水印功能
2014/01/13 PHP
yii2带搜索功能的下拉框实例详解
2016/05/12 PHP
创建无限极分类树型结构的简单方法
2017/06/20 PHP
利用PHPStorm如何开发Laravel应用详解
2017/08/30 PHP
七种PHP开发环境搭建工具
2020/06/28 PHP
JavaScript方法和技巧大全
2006/12/27 Javascript
JavaScript 利用StringBuffer类提升+=拼接字符串效率
2009/11/24 Javascript
jsTree 基于JQuery的排序节点 Bug
2011/07/26 Javascript
javascript学习笔记(三) String 字符串类型介绍
2012/06/19 Javascript
JavaScript中使用Substring删除字符串最后一个字符
2013/11/03 Javascript
jquery中的$(document).ready()使用小结
2014/02/14 Javascript
JavaScript动态修改背景颜色的方法
2015/04/16 Javascript
javascript控制台详解
2015/06/25 Javascript
javascript检查浏览器是否已经启用XX功能
2015/07/10 Javascript
EasyUI闪屏EasyUI页面加载提示(原理+代码+效果图)
2016/02/21 Javascript
jQuery移动端日期(datedropper)和时间(timedropper)选择器附源码下载
2016/04/19 Javascript
AngularJS基础 ng-href 指令用法
2016/08/01 Javascript
jquery 判断selection range 是否在容器中的简单实例
2016/08/02 Javascript
Bootstrap Table 双击、单击行获取该行及全表内容
2018/08/31 Javascript
微信小程序实现多选功能
2018/11/04 Javascript
React精髓!一篇全概括小结(急速)
2019/05/23 Javascript
简述pm2常用命令集合及配置文件说明
2019/05/30 Javascript
微信小程序-可移动菜单的实现过程详解
2019/06/24 Javascript
基于ant design日期控件使用_仅月份的操作
2020/10/27 Javascript
Python 爬虫模拟登陆知乎
2016/09/23 Python
python找出一个列表中相同元素的多个索引实例
2019/06/11 Python
基于Python2、Python3中reload()的不同用法介绍
2019/08/12 Python
python 使用事件对象asyncio.Event来同步协程的操作
2020/05/04 Python
详解Python模块化编程与装饰器
2021/01/16 Python
施工材料员岗位职责
2014/02/12 职场文书
军训教官感言
2014/03/02 职场文书
助人为乐模范事迹材料
2014/06/02 职场文书
2015年打非治违工作总结
2015/04/02 职场文书
2015年司机工作总结
2015/04/23 职场文书
优秀大学生申请书
2019/06/24 职场文书
spring cloud eureka 服务启动失败的原因分析及解决方法
2022/03/17 Java/Android