Python遥感影像定标


Python遥感tiff影像定标


作为一个遥感专业的学生,通常处理影像的第一步就是就是对遥感影像进行定标,使像元尽可能真实的反映地表情况,初学者我们通常是使用软件进行定标,随着学习的深入,我们会逐步地接触多种语言,如IDL、Python等。这篇博客的主要内容是使用python进行遥感tiff影像的定标,IDL语言进行定标语言类似。


文章目录

  • Python遥感影像定标
  • 辐射传输过程
  • 一、定标公式
  • 二、具体代码
  • 1.引入库
  • 2.读入数据
  • 运行结果



辐射传输过程


遥感器接收到的信号需要经过以下过程:

Python图像处理遥感数据 python 遥感影像_Python图像处理遥感数据


上图来自百度百科(画工太丑,不想动手),可以看到主要分为几个部分,首先是太阳辐射经过大气,收到大气影响(反射、散射、折射、吸收),透过大气的到达地面,与地表相互作用(吸收转化为热能,反射、散射等),地表反射的能量再经过大气,与大气发生第二次作用(反射、散射、吸收等),少部分能量透过大气被遥感器接收。

由于我们所用到的数据一般都经过了处理,所以只需要按照定标公式对各波段进行定标即可。



一、定标公式

Python图像处理遥感数据 python 遥感影像_读入数据_02


上图来自百度文库,而我们一般是使用一下公式定标

Radiance = gain*scale + offset

gain即为我们的像元值,scale和offset都可以在文件所带的MTL文件中获得

Python图像处理遥感数据 python 遥感影像_Python图像处理遥感数据_03


Python图像处理遥感数据 python 遥感影像_Python图像处理遥感数据_04

二、具体代码

1.引入库


import os
import numpy as np
from osgeo import gdal
import glob
import matplotlib.pyplot as plt

2.读入数据


input_path='E:/study/2018.4.09/2018.4.9/LC81300372018099LGN00/'
file_all=os.listdir(input_path)
out_path = 'E:/study/2018.4.09/2018.4.9/LC81300372018099LGN00/out_data/'
file_tail='.TIF'
radiance_scale=[1.2519E-02,3.3420E-04,3.3420E-04,1.2819E-02,1.1813E-02,9.9612E-03,6.0957E-03,1.5160E-03,5.1096E-04,1.1273E-02,2.3824E-03]
radiance_add=[-62.59278,0.10000,0.10000,-64.09577,-59.06370,-49.80584,-30.47869,-7.57977,-2.55479,-56.36651,-11.91176]#此处由于读取顺序为1,10,11,2,3,4...9,所以上面也按顺序调整
#
if not os.path.exists(out_path):
    os.mkdir(out_path)
i=0

for file_i in file_all:
    if file_i.endswith(file_tail):
        file_name=input_path + file_i
        (prename,suffix)=os.path.splitext(file_i)
        data=gdal.Open(file_name)
        band=data.ReadAsArray()*radiance_scale[i] + radiance_add[i]
        band=band.astype(np.float32)
        #将数据保存为GeoTiff格式
        gtiff_driver=gdal.GetDriverByName('GTiff')
        out_file=gtiff_driver.Create(
            out_path + prename + '_cal.tif',
            band.shape[1],band.shape[0],1,6
        )
        out_file.SetProjection(out_file.GetProjection())
        out_file.SetGeoTransform(out_file.GetGeoTransform())
        out_band=out_file.GetRasterBand(1)
        out_band.WriteArray(band)
        out_band.FlushCache()

        plt.imshow(band)
        plt.axis('off')
        plt.show()
        
        if i==10:
            break
        
        print(i+1)
        i=i+1



运行结果

Python图像处理遥感数据 python 遥感影像_IDL_05


Python图像处理遥感数据 python 遥感影像_python_06


左边定标,右边未定标

Python图像处理遥感数据 python 遥感影像_Python_07


使用定标公式计算

Python图像处理遥感数据 python 遥感影像_读入数据_08


Python图像处理遥感数据 python 遥感影像_python_09


如有错误,请大家指正。