根据文献查阅的一次线性反演方程来进行反演
大概思路就是通过Gdal读取TIF像素并进行计算操作之后再可视化。
网上下载12月22日杭州湾地区的Landsat8图像(冬季泥沙含量高,云量低)
from osgeo import gdal
import os
import numpy as np
import matplotlib.pyplot as plt
import math
class Inversion():
def __init__(self, type, pos, name):
self.type = type
os.chdir(pos) # 改变默认文件夹位置到对应文件夹
self.name = name # 文件名
# self.run()
def load_img(self): # 读入图片
img = gdal.Open(self.name)
return img
def ImgtoArray(self, img, band_num=1): # 读入图片并将像素值转换成对应矩阵
data_array = img.GetRasterBand(band_num).ReadAsArray()
return data_array
def SSC_INV_LANDSAT8(self, data1, data2, data3):
'''
1.此函数是反演悬浮泥沙浓度的
2.公式为
2.data1,data2,data3是反演算法当中使用的波段
'''
ssc = []
shape = np.shape(data1)
for i,v,w in zip(np.reshape(data1,-1),np.reshape(data2,-1),np.reshape(data3,-1)):
z = v+w
if z!=0:
# print(z)
calc = i/(v+w)
# print(calc)
calc = (0.9339*calc-0.3514)*100000
# calc = Decimal(calc).quantize(0.000000)
# calc ='%.6f'%calc
ssc.append(calc)
elif z==0:
ssc.append(14000)
ssc = np.asarray(ssc).reshape(shape)
print(ssc.shape)
return ssc
def Visualization(self, ssc): # 可视化经过反演处理过后的图像
# plt.figure(figsize=(16,9))
plt.imshow(ssc,cmap='BrBg',vmin = 14000,vmax = 17500)
plt.legend()
plt.title('Inversion of %s'%type)
plt.show()
# cv2.waitKey(0)
# if __name__ == "main":
os.chdir(r'G:/')
# img = gdal.Open('LC08_L1TP_118039_20201222_20201222_01_RT_B2.TIF')
# data_array = img.GetRasterBand(1).ReadAsArray()
ssc_landsat1 = Inversion('SSC', r'G:/', 'LC08_L1TP_118039_20201222_20201222_01_RT_B2.TIF')
ssc_landsat2 = Inversion('SSC', r'G:/', 'LC08_L1TP_118039_20201222_20201222_01_RT_B3.TIF')
ssc_landsat3 = Inversion('SSC', r'G:/', 'LC08_L1TP_118039_20201222_20201222_01_RT_B4.TIF')
# if ssc_landsat.type =='SSC':
img1 = ssc_landsat1.load_img()
dataset1 = ssc_landsat1.ImgtoArray(img1)
img2 = ssc_landsat2.load_img()
dataset2 = ssc_landsat2.ImgtoArray(img2)
img3 = ssc_landsat3.load_img()
dataset3 = ssc_landsat3.ImgtoArray(img3)
calc = ssc_landsat1.SSC_INV_LANDSAT8(dataset1, dataset2, dataset3)
ssc_landsat1.Visualization(calc)
反演重构出来(右上角羽状流很逼真)
换一个配色看看(感觉有点像沙画了)
跟原图(432真彩色)做一个对比
截取反演结果红区内的(双眼看比较)发现比较吻合