遥感图像处理及ENVI IDL操作实践 下载本文

由北美1982-2006年每年的植被返青期数据可知,每个像元都有25个像元值,代表了其每年的返青日期。因此,用年份(时间)当自变量X,像元值(返青期)当因变量Y,则可以回归出每个像元的返青期线性变化曲线。曲线的斜率代表了返青期的变化趋势:斜率小于0代表返青期提前,大于0代表返青期推迟。对计算结果进行F检验,可以得到每个像元的显著性概率。 2.3.2

IDL程序实现

利用IDL程序可以实现上述分析内容,并将计算结果保存的到ENVI文件中。具体代码如下:

;创建输出变量,用来存储线性趋势和显著性概率数据

;第一波段存储线性趋势,第二波段存储显著性概率,背景值为999.0 trend=make_array(400,400,2, value=999.0);动态创建数组 ;创建x数据

x=findgen(25)+1982.0

;逐像元计算线性趋势和显著性概率

for i=0,399 do begin for j=0,399 do begin

y=reform(greenup[i,j,*]);重组

if y[0] eq 5000 then continue ;遇到背景值5000跳过 trend[i,j,0]=regress(x,y, ftest=ftest) ;线性斜率 trend[i,j,1]=1.0-f_pdf(ftest, 1, 23) ;显著性概率 endfor endfor

;输出结果

openw, out_lun, out_file, /get_lun writeu, out_lun, trend

free_lun, out_lun ;结果保存到指定文件中

;输出头文件

zhu_write_envi_header, greenup_file, out_file, bands=2, data_type=4

2.3.3 IDL程序分析

上述程序中,主要用到的函数有MAKE_ARRAY、REFORM、REGRESS和F_PDF ,命令有OPENW、WRITEU,用户自定义过程ZHU_WRITE_ENVI_HEADER。下面对它们进行简单介绍,以方便程序理解。

(1). MAKE_ARRAY:在程序运行时,动态创建数组的函数。返回值为一个指定

类型、维度和初始值的数组。

13

(2). REFORM:可以使数组在固定元素个数的前提下,改变下标引用索引的函数。

当指定了返回维数时,函数返回与给定的维度相同的数组,不改变数组总元素个数及元素值。若没有指定维度,则返回数组的一个副本,当数组中有某一维维度为一时,则将这一维去掉。 (3). REGRESS:执行多元线性回归的函数,返回归方程的系数组成的列向量。

其参数FTEST代表F-检验的结果值。 (4). F_PDF: 利用FTEST参数进行显著性概率计算的函数。

(5). OPENW:打开一个新文件用于读写。如果文件已经存在,则其原始文件内

容将会被新内容所替代。 (6). WRITEU:将数据写入无格式二进制文件中。

(7). ZHU_WRITE_ENVI_HEADER:用户自定义的一个IDL程序,用于编写一个

ENVI头文件。详细代码见zhu_write_envi_header.pro 。 2.3.4

结果显示

图1是IDL代码的执行结果,左边为各像元的线性变化趋势,右边为各像元的显著性概率。

图2 各像元的线性变化趋势及显著性概率

2.4 有效物候区返青期平均变化趋势统计

2.4.1

计算过程分析

本文选取3个示例州如图3所示,计算其内有效物候区中的返青期平均变化趋势。需要用到的数据有:

14

(1). 各像元的线性变化趋势,文件greenup_trend的第一波段。 (2). 物候区文件phenoregion_file,其中每种颜色代表一种物候。

(3). 示例州栅格文件state_file,由三个示例州的ROI文件state_roi.roi导出得到。 为了计算出示例州内有效物候区中的返青期平均变化趋势,首先需要创建输入变量来存储数据,并将数据读入到变量中(利用上述文件读取方法)。

同时,需要创建变量result存储输出数据。根据要求,result变量应为一个2行3列的浮点型数组。第一列用于存储示例州的编号,第二列用于存储各示例州内有效物候区中的返青期平均变化趋势。具体结构如表3 result变量结构所示:

表3 result变量结构

示例州编号 1 2 3 有效物候区中返青期平均变化趋势 示例州1内有效物候区中的返青期平均变化趋势 示例州2内有效物候区中的返青期平均变化趋势 示例州3内有效物候区中的返青期平均变化趋势

然后,找出各示例州内有效物候区像元,即同时位于各示例州和物候区内的像元,并计算各示例州内有效物候区像元的平均线性变化趋势。将计算结果写入文件,即可完成全部操作。 2.4.2

IDL程序实现

利用IDL程序可以实现上述分析内容,并将计算结果保存的到CSV文件中。具体代码如下:

;定义输入、输出文件名

trend_file='D:\\test\\greenup_trend';各像元的线性变化趋势及显著性概率 phenoregion_file='D:\\data\\phenoregion';物候区数据 state_file='D:\\data\\state_class';三个示例州的栅格图 out_file='D:\\test\\sta.csv'

;创建输入变量,用来存储trend, phenoregion, state数据 ;通过查看各数据的头文件,获取相关信息

trend=fltarr(400,400) ;只存储第一波段(线性变化趋势) phenoregion=intarr(400,400) state=bytarr(400,400)

;创建输出变量,用来存储3个示例州的平均线性变化趋势 result=fltarr(2,3)

result[0,*]=findgen(3)+1.0 ;第一列存储各个州的代码

15

;读入数据

openr, in_lun1, trend_file, /get_lun readu, in_lun1, trend free_lun, in_lun1

openr, in_lun2, phenoregion_file, /get_lun readu, in_lun2, phenoregion free_lun, in_lun2

openr, in_lun3, state_file, /get_lun readu, in_lun3, state free_lun, in_lun3

;计算3个示例州内有效物候区中的返青期平均变化趋势 for i=1,3 do begin

index=where((state eq i)*(phenoregion gt 0),count) ;找出有效像元 a=trend[index]

if count gt 0 then result[1,i-1]=mean(trend[index]) endfor

;输出结果

write_csv, out_file, result

2.4.3 IDL程序分析

上述程序中,主要用到的函数有WHERE和MEAN以及命令WRITE_CSV。下面对它们进行简单介绍,以方便程序理解。

(1). WHERE:根据给定标准(数组或数组表达式)在一个数组中选择合适元素

的函数。返回值为一个矢量,矢量中的元素是根据给定标准(数组或数组表达式)得到的非零元素的下标。矢量的长度为等于根据给定标准(数组或数组表达式)非零元素的个数。

用法如下:

result = where( array_expression [, count] [, complement=variable] [, /l64][, ncomplement=variable] )

其中,result 为符合给定判断标准(array_expression)的非零元素的下标组成的矢量。array_expression为判断的标准(数组表达式)。count为符合给定判断标准(array_expression)的非零元素个数。complement为不符合给定判断标准(array_expression)的零元素个数。ncomplement为不符合给定判断标准(array_expression)的零元素的下标组成的矢量。

16