有关大气校正的代码在github上下了一些:https://github.com/zhaoguanhua/atmosphericcorrection/ 这里有多种数据(高分、landsat8、哨兵等)的大气校正代码。本文只是测试了landsat8:
1.代码
这是主文件(加了一些函数、方法的注解),还有部分文件就不一一显示了,在(https://github.com/zhaoguanhua/atmosphericcorrection/)直接下载即可。
# glob模块参考: https://blog.csdn.net/gufenchen/article/details/90723418
# glob是python自带的一个操作文件的相关模。用它可以查找符合特定规则的文件路径名。使用该模块查找文件,只需要用到: “*”, “?”, “[]”这三个匹配符;
import glob
import os
import sys
import tarfile
import re
from osgeo import gdal
import numpy
from Py6S import *
from osgeo import gdal
import pdb
import shutil
# argparse是一个Python模块:命令行选项、参数和子命令解析器。
import argparse
# 从base.py文件导入MeanDEM函数
from base import MeanDEM
def parse_arguments(argv):
# 此部分参考: https://blog.csdn.net/qq_36653505/article/details/83788460
# 此部分参考: https://blog.csdn.net/Rocky6688/article/details/104295574
# 使用argparse的第一步是创建一个ArgumentParser对象。ArgumentParser对象包含将命令行解析成Python数据类型所需的全部信息。
parser = argparse.ArgumentParser() # 创建一个解析对象
# parser.add_argument() 向该对象中添加你要关注的命令行参数和选项
# name or flags - 一个命名或者一个选项字符串的列表;type - 命令行参数应当被转换成的类型;
# help - 一个此选项作用的简单描述;default - 当参数未在命令行中出现时使用的值。
# parser.add_argument('--Input_dir', type=str, help=r'D:\ProfessionalProfile\LandsatImage\LC08_L1TP_134036_20170808_20170813_01_T1\.', default=None)
# parser.add_argument('--Output_dir', type=str, help=r'D:\ProfessionalProfile\LandsatImage\1_OutputPy-RadiationCalibration0414\.', default=None)
parser.add_argument('--Input_dir', type=str, help='Input dir', default=r'D:\ProfessionalProfile\LandsatImage\LC08_L1TP_134036_20170808_20170813_01_T1')
parser.add_argument('--Output_dir', type=str, help='Output dir', default=r'D:\ProfessionalProfile\LandsatImage\1_OutputPy-RadiationCalibration0414')
# parser.add_argument('--Input_dir', type=str, help='Input dir', default=None)
# parser.add_argument('--Output_dir', type=str, help='Output dir', default=None)
# parse_args(args=None, nampespace=None),args 参数名称,namespace 赋值。
return parser.parse_args(argv) # 进行解析
# 逐波段辐射定标
def RadiometricCalibration(BandId):
# LandSat8 TM辐射定标参数
global data2,ImgRasterData
parameter_OLI = numpy.zeros((9,2))
#计算辐射亮度参数
parameter_OLI[0,0] = float(''.join(re.findall('RADIANCE_MULT_BAND_1.+',data2)[0]).split("=")[1])
parameter_OLI[1,0] = float(''.join(re.findall('RADIANCE_MULT_BAND_2.+',data2)).split("=")[1])
parameter_OLI[2,0] = float(''.join(re.findall('RADIANCE_MULT_BAND_3.+',data2)).split("=")[1])
parameter_OLI[3,0] = float(''.join(re.findall('RADIANCE_MULT_BAND_4.+',data2)).split("=")[1])
parameter_OLI[4,0] = float(''.join(re.findall('RADIANCE_MULT_BAND_5.+',data2)).split("=")[1])
param