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

ENDFOR

默认条件下增量为1,也可以自定义增量。 (2). WHILE 语句

当特定的条件为真,WHILE语句执行单个语句或语句块 。 ? WHILE 条件 DO 语句 ? WHILE 条件 DO BEGIN 语句 ENDWHILE

二、 IDL基本操作介绍

下文以解决一个生态学问题为例,详细讲解IDL基本操作步骤。

1. 题目及要求

问题:现有北美1982-2006年每年的植被返青期数据。 要求:

(1). 计算出各像元的线性变化趋势及显著性概率。

(2). 统计出各个行政单元(州)内有效物候区中的返青期平均变化趋势。 (3). 对线性变化趋势制图输出。

2. 解决方案

2.1 数据说明

北美1982-2006年每年的植被返青期数据greenup_1982_2006,共25个波段,每个波段代表每年一景植被返青期数据,影像拍摄时间为每年的第80天或第100天。影像头文件信息见图1。

9

图1 北美1982-2006年每年的植被返青期数据

greenup_1982_2006头文件信息

2.2 二进制文件读取

2.2.1

文件打开

(1). 利用OPEN命令打开二进制文件

IDL 中的所有输入和输出都是通过逻辑设备号完成的。可以把一个逻辑设备设想为一个管道,这个管道连接着 IDL 和需要进行读写的数据文件。要从一个文件中读写数据,必须首先把一个逻辑设备号连接到一个特定的文件。这就是 IDL 中三个OPEN命令的作用。

OPENR (OPEN READ) :用只读方式打开一个现有的文件。

OPENW(OPEN WRITE) :打开一个新文件用于读写。如果文件已经存在,

则其原始文件内容将会被新内容所替代。

OPENU(OPEN UPDATE) :打开一个已经存在的文件用于读写。 这三个命令的语法结构是完全相同的。首先是命令名,后面是一个逻辑设备号和需要与该逻辑设备号相连的文件名。

用法如下:

openr, in_lun, in_filename [, /get_lun]

10

其中,in_lun代表打开文件的逻辑设备号,可以用户手动赋值,也可以由计算机随机赋值。in_filename为要打开的文件路径。/get_lun代表打开文件时,逻辑设备号由计算机随机赋值,而不是用户手动赋值。当用户打开多个文件时,使用/get_lun可以避免文件号被重复使用而造成的错误。

(2). 利用Read_Binary函数打开二进制文件

Read_Binary:利用已有的模板或者命令行关键字的方式读取二进制文件。 用法如下:

result

=

read_binary

([in_filename]|

fileunit

, [template

=template]

|

[data_start=value],[data_type=typecodes], [data_dims=array], [endian=string ])

其中,result 为读取的数据,in_filename代表输入文件路径, fileunit代表输入文件的文件号,in_filename, fileunit二者选一个输入即可。template为一个已定义(利用Binary_Template函数创建)的用于描述输入文件类型的模板结构体。 template不可与data_start,data_type,data_dims,endian同时使用。若使用了template关键字,则Read_Binary函数的返回值为一个与template结构相同的结构体,否则为一个数组。data_start用于表示数据的起始位置,类似于偏移量。data_type 用于表示数据类型。data_dims用于表示读入与返回的数据的范围。endian表示文件字节读取的顺序。

注意:如果需要打开的文件很大,无法全部读入内存中,则需要根据要求,考虑改变文件的数据排列方式,例如使用BIL、BIP方式。

例如,本例中,目的是获取数据的纵向剖面,因此可以采用BIL、BIP数据排列方式。由于BIL方式处理数据不需要频繁的读写,因此采取BIL方式更佳。 2.2.2

文件读入

利用上述两种方式将文件打开后,利用READU命令可以将文件读入指定的数组中。

READU:从文件中读取无格式二进制数据到一个IDL变量中。

用法如下:

readu, in_lun, data

其中,in_lun为已经打开的逻辑设备号。data为已定义的、与打开文件相同数据类型的IDL变量。 2.2.3

文件写出

利用WRITEU命令可以将数据写入无格式二进制文件中。 用法如下:

writeu, out_lun, data

11

其中,out _lun为已经打开的文件逻辑设备号。data为要写入文件的IDL变量。 2.2.4

文件关闭

所有打开的文件,在将数据读入到IDL变量后,都应该及时关闭,释放资源。以避免不必要的错误出现。 利用FREE_LUN或CLOSE命令可以将打开的文件关闭。

FREE_LUN:关闭打开的文件,取消分配的逻辑设备号,回收内存资源。 用法如下:

free_lun, in_lun

其中,in_lun为逻辑设备号。

CLOSE:根据指定参数关闭逻辑设备号。 用法如下:

close, [, unit1, ..., unitn] [, /all] [, exit_status=variable] [, /file] [, /force]

其中,uniti为指定逻辑设备号。/all代表关闭所有打开程序。 exit_status代表用已命名的变量variable设置退出状态,不可以和/all、/file联用。/file代表关闭逻辑设备号为0-99的文件,逻辑设备号大于99的文件将不被影像。 /force代表强制关闭文件。 2.2.5

IDL程序实现

将数据greenup_1982_2006在IDL中打开的语句如下:

定义输入、输出文件名

greenup_file='E:\\RS_ENVI\\chapter04\\data\\greenup_1982_2006' out_file='E:\\RS_ENVI\\chapter04\\data\\test\\greenup_trend'

;通过查看greenup_1982_2006.hdr文件,获取相关信息 ;创建输入变量,用来存储greenup_1982_2006的数据 greenup=intarr(400,400,25)

;将greenup_1982_2006文件打开并读入数组greenup中 openr, in_lun, greenup_file, /get_lun readu, in_lun, greenup free_lun, in_lun

2.3 各像元的线性变化趋势及显著性概率计算

2.3.1

计算过程分析

12