microproduct-l-sar/landcover-L-SAR/tool/LAI/LAIProcess.pyx

166 lines
5.5 KiB
Cython
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

#
# 模型计算的库
#
import cython
cimport cython # 必须导入
import numpy as np
cimport numpy as np
from libc.math cimport pi
from scipy.optimize import leastsq
import random
import logging
logger = logging.getLogger("mylog")
def WMCModel(param_arr,sample_lai,sample_soil,sample_inc,sample_sigma):
""" WMC模型 增加 归一化植被指数
Args:
param_arr (np.ndarray): 参数数组
sample_lai (double): 叶面积指数
sample_soil (double): 土壤含水量
sample_inc (double): 入射角(弧度值)
sample_sigma (double): 后向散射系数(线性值)
Returns:
double: 方程值
"""
# 映射参数,方便修改模型
A,B,C,D,M,N=param_arr # 在这里修改模型
V_lai=sample_lai
#V_lai=E*sample_lai+F
exp_gamma=np.exp(-2*B*((V_lai*D+C))*(1/np.cos(sample_inc)))
sigma_soil=M*sample_soil+N
sigma_veg=A*((V_lai))*np.cos(sample_inc)
f_veg=1
result=sigma_veg*(1-exp_gamma)+sigma_soil*exp_gamma-sample_sigma
return result
def train_WMCmodel(lai_water_inc_sigma_list,params_X0,train_err_image_path,draw_flag=True):
""" 训练模型参数
Args:
lai_waiter_inc_sigma_list (list): 训练模型使用的样本呢
"""
def f(X):
eqs=[]
for lai_water_inc_sigma_item in lai_water_inc_sigma_list:
sample_lai=lai_water_inc_sigma_item[4]
sample_sigma=lai_water_inc_sigma_item[5] # 5: csv_sigma, 8:tiff_sigma
sample_soil=lai_water_inc_sigma_item[6]
sample_inc=lai_water_inc_sigma_item[7]
FVC=lai_water_inc_sigma_item[8]
eqs.append(WMCModel(X,sample_lai,sample_soil,sample_inc,sample_sigma))
return eqs
X0 = params_X0 # 初始值
# logger.info(str(X0))
h = leastsq(f, X0)
# logger.info(h[0],h[1])
err_f=f(h[0])
x_arr=[lai_waiter_inc_sigma_item[4] for lai_waiter_inc_sigma_item in lai_water_inc_sigma_list]
# 根据误差大小进行排序
# logger.info("训练集:\n根据误差输出点序\n数量{}\n点序\t误差值\t 样点信息".format(str(np.array(err_f).shape)))
# for i in np.argsort(np.array(err_f)):
# logger.info('{}\t{}\t{}'.format(i,err_f[i],str(lai_water_inc_sigma_list[i])))
# logger.info("\n误差点序输出结束\n")
if draw_flag:
# logger.info(err_f)
# logger.info(np.where(np.abs(err_f)<10))
from matplotlib import pyplot as plt
plt.scatter(x_arr,err_f)
plt.title("equation-err")
plt.savefig(train_err_image_path,dpi=600)
plt.show()
return h[0]
def test_WMCModel(lai_waiter_inc_sigma_list,param_arr,lai_X0,test_err_image_path,draw_flag=True):
""" 测试模型训练结果
Args:
lai_waiter_inc_sigma_list (list): 测试使用的样本集
A (_type_): 参数A
B (_type_): 参数B
C (_type_): 参数C
D (_type_): 参数D
M (_type_): 参数M
N (_type_): 参数N
lai_X0 (_type_): 初始值
Returns:
list: 误差列表 [sample_lai,err,predict]
"""
err=[]
err_f=[]
x_arr=[]
err_lai=[]
for lai_waiter_inc_sigma_item in lai_waiter_inc_sigma_list:
sample_time,sample_code,sample_lon,sample_lat,sample_lai,csv_sigma,sample_soil,sample_inc,sample_sigma=lai_waiter_inc_sigma_item
def f(X):
lai=X[0]
eqs=[WMCModel(param_arr,lai,sample_soil,sample_inc,csv_sigma)]
return eqs
X0=lai_X0
h = leastsq(f, X0)
temp_err=h[0]-sample_lai
err_lai.append(temp_err[0]) # lai预测的插值
err.append([sample_lai,temp_err[0],h[0][0],sample_code])
err_f.append(f(h[0])[0]) # 方程差
x_arr.append(sample_lai)
# 根据误差大小进行排序
# logger.info("测试集:\n根据误差输出点序\n数量{}\n点序\t误差值\t 方程差\t样点信息".format(str(np.array(err_lai).shape)))
# for i in np.argsort(np.array(err_lai)):
# logger.info('{}\t{}\t{}\t{}'.format(i,err_lai[i],err_f[i],str(lai_waiter_inc_sigma_list[i])))
# logger.info("\n误差点序输出结束\n")
if draw_flag:
from matplotlib import pyplot as plt
plt.scatter(x_arr,err_lai)
plt.title("equation-err")
plt.savefig(test_err_image_path,dpi=600)
plt.show()
return err
def processs_WMCModel(param_arr,lai_X0,sigma,inc_angle,soil_water):
if(sigma<0 ):
return np.nan
def f(X):
lai=X[0]
eqs=[WMCModel(param_arr,lai,soil_water,inc_angle,sigma )]
return eqs
h = leastsq(f, [lai_X0])
return h[0][0]
# Cython 的扩展地址
cpdef np.ndarray[double,ndim=2] process_tiff(np.ndarray[double,ndim=2] sigma_tiff,
np.ndarray[double,ndim=2] inc_tiff,
np.ndarray[double,ndim=2] soil_water_tiff,
np.ndarray[double,ndim=1] param_arr,
double lai_X0):
cdef np.ndarray[double,ndim=2] result=sigma_tiff
cdef int param_arr_length=param_arr.shape[0]
cdef int height=sigma_tiff.shape[0]
cdef int width=sigma_tiff.shape[1]
cdef int i=0
cdef int j=0
cdef double temp=0
while i<height:
j=0
while j<width:
temp = processs_WMCModel(param_arr,lai_X0,sigma_tiff[i,j],inc_tiff[i,j],soil_water_tiff[i,j])
temp=temp if temp<10 and temp>=0 else np.nan
result[i,j]=temp
j=j+1
i=i+1
return result