IDL基本操作介绍
课题名称:任课教师:
遥感图像处理及ENVIIDL操作实践
1
目录
一、 1.
IDL简介 .............................................................................................................. 3 IDL特殊符号说明 ......................................................................................................... 3 1.1. 1.2. 1.3. 2. 2.1. 2.2. 3. 3.1. 3.2. 3.3. 二、 1. 2.
大写 ..................................................................................................................... 3 注释符 ................................................................................................................. 3 续航符 ................................................................................................................. 3 变量 ..................................................................................................................... 3 数组 ..................................................................................................................... 5 定义和编译程序 ................................................................................................. 6 命名和编译源文件 ............................................................................................. 7 程序控制语句 ..................................................................................................... 7
IDL语法基础 ................................................................................................................ 3
IDL编程基础 ................................................................................................................ 6
IDL基本操作介绍 ................................................................................................ 9 题目及要求 .................................................................................................................. 9 解决方案 ...................................................................................................................... 9
2.1 2.2 2.3 2.4 2.5 三、
数据说明 ............................................................................................................. 9 二进制文件读取 ............................................................................................... 10 各像元的线性变化趋势及显著性概率计算 ................................................... 12 有效物候区返青期平均变化趋势统计 ........................................................... 14 制图输出线性变化趋势 ................................................................................... 17
总结 .................................................................................................................. 26
2
一、 IDL简介
IDL(Interactive Data Language)交互式数据语言是进行二维及多维数据可视化分析及应用开发的理想软件工具。作为面向矩阵、语法简单的第四代可视化语言,IDL 致力于科学数据的可视化和分析,是跨平台应用开发的最佳选择。它集可视、交互分析、大型商业开发为一体,为用户提供了完善、灵活、有效的开发环境。IDL为用户提供了可视化数据分析的解决方案,既可以让科学研究人员交互式浏览和分析数据,又为程序员提供了快速程序原型开发并跨平台发布的高级编程工具。IDL使科学家无需写大量的传统程序就可直接研究数据。IDL被广泛应用于地球科学、医学影像、图像处理、软件开发、大学教学、实验室研究、测试技术、天文、信号处理、防御工程、数学分析、统计等诸多领域。
1. IDL特殊符号说明
在IDL程序中,当在命令行中输入命令时,IDL将会识别大量的特殊字符。下面介绍几种较为重要的特殊符号。
1.1. 大写
IDL 对字母的大小写并不敏感,但与操作系统打交道的命令(例如:UNIX 操作系统对 IDL 所打开的文件名的大小写敏感)和执行字符串比较命令时除外。
1.2. 注释符
在 IDL 命令中,分号 “;”(英文半角符号)表示注释内容的开始,分号右边的任何文本都被视为是注释,IDL 解释器将忽略它。例如:
pro test
;A simple program
print,\"Hello World !\",$
\"LYT\";This line prints a message end
1.3. 续航符
IDL 中的续行符是表示美元的符号“$” 。这表示 IDL 语句延续到下一语句行(见上例)。
2. IDL语法基础
2.1. 变量
3
IDL提供了灵活的数据类型定义方法,在任何时候,IDL都允许用户创建新的变量,或重新定义已有的变量。
变量名必须以字母开头。它们可以包括其他字母、数字、下划线、美元符号。一个变量名最长可达 255 个字符。
变量有两个重要属性: 数据类型和组织结构。 数据类型指出属于数据类型中的哪一种。IDL 提供了非常丰富的数据类型,用户可以实际需求经行选择。表1显示了每一种数据类型及其描述,每种类型创建的变量的字节大小、变量创建方式、数据类型之间强制转换的 IDL 函数名称。 除了数据类型外,每一个变量有一个组织结构。有效的组织结构有标量(例如单个数值) 、矢量(真正的一维数组) 、数组(最高可达八维)和 IDL 结构(能包含各种数据类型的变量和组织结构,结构中独立的组成部分称为字段)。
表1 IDL基本数据类型
数字类型变量 数据类型 byte int long long64 uint ulong ulong64 float double complex dcomplex 描述 字节型 16位有符号整型 32位有符号长整型 64位有符号整型 16位无符号整型 32位无符号长整型 64位无符号整型 浮点型 双精度浮点型 复数 双精度复数 字节数 1 2 4 8 2 4 8 4 8 8 16 创建变量 Var=0B Var=0 Var=0L Var=0LL Var=0U Var=0UL Var=0ULL Var=0.0 Var=0.0D Var=Complex(0.0,0.0) Var=Dcomplex(0.0D,00D) 数据类型函数 thisVar=Byte(variable) thisVar=Fix(variable) thisVar=Long(variable) thisVar=Long64(variable) thisVar=UInt(variable) thisVar=ULong(variable) thisVar=Ulong64(variable) thisVar=Float(variable) thisVar=Double(variable) thisVar=Complex(variable) thisVar=DComplex(variable) 非数字类型变量 数据类型 string pointer objref stuct
描述 字符串 指针 对象 结构体 字节数 0-32767 4 4 — 创建变量 Var=’’或Var=”” Var=Ptr_New() Var=Obj_New() — 数据类型函数 thisVar=String(variable) None None — 4
2.2. 数组
IDL中可以为任何IDL数据类型创建1—8维的数组。数组操作的运行速度往往优于循环操作,且语法更为精炼。 在IDL中利用方括号“[ ]”创建数组。创建多维数组时可以使用嵌套的方括号。值的注意的是,IDL中数组元素的存储是按列进行的。按列存储的方式意味着连续的数组元素也将按顺序被存储,而且数组的第一维(列)变化的最快。下标的顺序先是列标,后是行标。IDL的数组下标是从零开始的正值。数组的下标可以是标量也可以是矢量。进行下标操作时,如果下标超过了范围,则该下标被转换为在允许范围内的最小或最大的下标值。例如,创建一维数组vector和多为数组array:
; 创建一维数组vector IDL> vector=[1,2,3] IDL> help,vector
VECTOR INT = Array[3] IDL> print,vector
; 输出IDL 输出窗口中将会如下所示: 1 2 3
; 创建多维数组array IDL> array=[[1,2,3],[4,5,6]] IDL> help,array
ARRAY INT = Array[3, 2] IDL> print, array 1 2 3 4 5 6
IDL的内建函数允许用户按指定的类型创建数组,同时数组中的每个元素都被初始化为灵活索引值(下标值)。创建和初始化零数组和索引数组的函数见表2所示。
表2 创建和初始化零数组和索引数组的函数
数据类型 byte int long long64 uint ulong ulong64
零数组 bytarr( ) intarr( ) lonarr( ) lon64arr( ) uintarr( ) ulonarr( ) ulon64arr( ) 索引数组 bindgen( ) indgen( ) lindgen( ) l64indgen( ) uindgen( ) ulindgen( ) ul64indgen( ) 5 float double complex dcomplex string fltarr( ) dblarr( ) Complex arr( ) Dcomplex arr( ) strarr( ) findgen( ) dindgen( ) cindgen( ) dcindgen( ) sindgen( )
例如,创建一个七元素的整型零数组和一个六元素的浮点型索引数组:
IDL> zeros=intarr(7) ; 创建一个七元素的整型零数组 IDL> index=findgen(6) ; 创建一个六元素的浮点型索引数组 IDL> print,zeros,index
0 0 0 0 0 0 0
0.000000 1.00000 2.00000 3.00000 4.00000 5.00000
3. IDL编程基础
结构化程序设计是 E.W.Dijikstra 在 1965 年提出的。它的主要观点是采用自顶向下、逐步求精的程序设计方法;使用三种基本控制结构构造程序,任何程序都可由顺序、选择、重复三种基本控制结构构造。编写 IDL 程序也需要对 IDL 中的相关控制语句进行简单介绍。
3.1. 定义和编译程序
IDL程序包括过程和函数两种:
(1). 过程(pro)
过程一般将几个相关的操作加到一个程序模块中。过程以pro开头,end结束。例如:
;过程名 test1, 参数 para1,para2,.. pro test1,para1,para2,... 过程语句块 end
(2). 函数(function)
函数一般将一个操作加载到一个程序模块中,并返回结果函数以function开头,end结束,并包括一个return语句返回结果。例如:
;函数名 test2,参数 para1,para2,..,返回值 para1 function test2,para1,para2,... 过程语句块 return ,para1 end
6
IDL 命令要么是过程,要么是函数。过程和函数的区别在于:在过程命令中,参数和关键字仅排列在一个命令行上;在函数命令中,位置参数和关键字参数放在一对圆括号中的。
但是,最重要的区别是IDL函数会返回一个值,等号左边的一个变量用于返回该值。这是IDL中函数命令和过程命令根本的区别。 函数命令总是返回一个值,这个数值必须赋给一个变量。函数返回值可能是任何一种IDL变量,包括数值、数组或结构。
3.2. 命名和编译源文件
命名一个IDL源文件的标志形式是在过程或函数名称后加上扩展名‘.pro’过程和函数都可以通过“.compile”命令进行手动编译或是通过IDL IDE环境进行编译。
当需要时,过程和函数会在运行时自动编译,如果IDL调用的过程或函数之前未被编译过,则IDL会搜索路径下所有的文件夹以搜索源文件的名称。
3.3. 程序控制语句
3.3.1. 条件语句 (1). IF 语句
当特定的条件为真时,if语句执行单个语句或单个语句模块: IF 条件 THEN 语句 IF 条件 THEN BEGIN
语句 ENDIF
IF 条件 THEN 语句 ELSE 语句 IF 条件 THEN BEGIN
语句
ENDIF ELSE BEGIN 语句
ENDELSE
在以上的所有行驶中,“条件”是一个标量表达式,其值为真或假。在前两种形式中,当条件为真时,执行单个语句或语句模块;在后面两种行驶中,当条件为假时,“else”语句将执行单个的语句或语句模块。
7
(2). CASE 语句
CASE语句根据一个标量的表达式来选择某个语句或语句块运行。 CASE 表达式 OF 情况1:
情况2:语句 情况3:BEGIN 语句 END ELSE: 语句 ENDCASE
当表达式和其中的某个情况匹配,相应的语句被执行, case 语句结束,如果没有匹配的情况,那么执行 else 下的语句,如果没有 else 语句,将会发生错误,建议在case 语句中都加上else。 (3). SWITCH语句
SWITCH跟CASE类似,但与CASE的不同在于它能执行到底。
3.3.2. 跳转语句 (1). BREAK
BREAK提供了一个从循环中(FOR,WHILE)或CASE、SWITCH等状态中快速退出的方法。 (2). CONTINUE
CONTINUE 提供了一个从循环中(FOR, WHILE,和 REPEAT)中进入下一步循环的方法。以FOR为例,学习下CONTINUE的用法。 3.3.3. 循环语句 (1). FOR 语句
FOR 循环运用计数器来多次执行一个或语句块 ,该循环按特定的步长从初始值上升或下降至结尾值。
FOR I=V1,V2 DO 语句 FOR I=V1,V2,INC DO 语句 FOR I=V1,V2,INC DO BEGIN 语句
8
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\est\\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
由北美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:\est\\greenup_trend';各像元的线性变化趋势及显著性概率 phenoregion_file='D:\\data\\phenoregion';物候区数据 state_file='D:\\data\\state_class';三个示例州的栅格图 out_file='D:\est\\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
(2). MEAN:计算一组数字型矢量的平均值的函数。 (3). WRITE_CSV:将数据写入.CSV文件中。 2.4.4
结果显示
执行2.4.2中IDL代码, 生成sta.csv文件,得到3个示例州内有效物候区中的返青期平均变化趋势,见表4。
表4 示例州内有效物候区中的返青期平均变化趋势
示例州编号 1 2 3 有效物候区中返青期平均变化趋势 -0.13067 -0.03432 0.53688
2.5 制图输出线性变化趋势
2.5.1
IDL的颜色运用
IDL的颜色由三种特殊值组成。我们称这些数值为一个三色组,将其写成(R,G,B)即红、绿、蓝,其中红、绿、蓝代表红光、绿光、蓝光作用于该显示颜色时的数量,每个值的范围都在0到255之间。这样,一种颜色可由256级的红色,256级绿色和256级蓝色组成。这就是说IDL能显示256*256*256,或者说超过167,000,000种颜色。举例来说,黄色由亮红和亮绿组成,但没有蓝色。代表黄色的三色组写作(255,255,0)。
IDL 里有两种颜色模式索引颜色模式和RGB颜色模式。索引颜色模式用于8位显示器,RGB颜色模式用24位显示器。
使用索引号通过查颜色查询表(简称为颜色表)可以获得颜色的三色值。一个颜色表由三列数组成,一列代表红色值,一列代表绿色值,一列代表蓝色值。典型地,这些数列被称为矢量。当用 IDL 装载颜色表时,所做的就是选择正确的数值放进这些列或矢量之中。请看这个概念的图解(图3)。
两种模式都能用一个颜色查找表来决定用于显示的特定颜色。(当颜色分解关键字关闭时,RGB颜色模式就用颜色查找表。否则,RGB颜色模式就用三色值直接指定颜色)。索引颜色模式将索引颜色号和颜色表中的特定位置联系起来,而RGB 颜色模式直接指定颜色。被链接到特定颜色表某个位置的颜色被称作动态颜色显示。直接显示的颜色常被称为静态颜色显示。在大多数情况下(有例外),8位显示是动态显示,24位显示是静态显示。
17
图3 索引颜色模式
颜色表可以由用户人为修改,颜色表控制函数有如下(表5)几种。TVLCT命令用来设置或获取颜色表的内容; LoadCT 命令装载IDL预定义过的41个颜色表中的一个。这些颜色表的定义在\\resource\\colors目录下colors1.tbl文件中。 XloadCT 和 Xpalette两个命令,可以修改和创建颜色表。XloadCT 允许用不同的方法扩展颜色。Xpalette命令允许通过设置滚动条的端点色和插入干涉值来修改和创造自己的颜色表。
表5 颜色表控制函数
名称 TVLCT LOADCT X LOADCT 功能 设置或获取颜色表的内容 装载一个预定义过的颜色表 装载和调整预定义过的颜色表 定制颜色表 XPALETTE 2.5.2
IDL绘图
(1). 直接图形法
直接图形法是IDL的图像或图形直接绘制在用户指定的图形设备上,可在很
18
短的时间内生长高质量的图形。执行内置直接图形程序,将会建立坐标系,创建 轴和边界。组成直接图形系统的例行程序,如Plot、Contour及 Surface等等,可以完成大部分关于图形输出的操作。直接绘图程序一旦生成直接图形,结果就会被输出到当前设备,并且删除掉所有相关数据。若要对已生成的直接图形做出改动或是将结果输出到另外的设备,就必须要重新执行。
直接图形法对内存有默认的管理方法,占用内存少, 用户不必自己释放内存,方便、简洁易用。
(2). 对象图形法
传统的开发方法开发的程序重用性、可修改性及可维护性都比较差,对象法
是IDL5.0引入面向对象编程概念后出现的,面向对象的基础也就是对象类的使用。
对象类允许编程者将数据和方法封装成一个包,称之为对象。一个对象类可以重复利用生成多个对象。
在IDL的虚拟图形构架体系中有一套对象显示结构对象,而且提供了很多的 对象图形原子,利用这些对象和对象图形原子之间可以进行互相的加载,相互作 用形成显示对象, 灵活的运用这些图形原子就可以在视图中得到丰富多彩的图形或图像,甚至可以制作三维的动画。 2.5.3
线性变化趋势图IDL程序实现
本例中,首先加载用户预先设定的颜色表,利用此表中的颜色显示线性变化趋势制图。然后通过观察图像数据值的分布情况,确定图像最终拉伸范围,并将背景值设为255。之后通过imap或iimage方式显示图像。具体代码如下:
;创建颜色表CT
;ctload为用户自定义函数,加载颜色表24号到内存中,并将颜色表颜色反转,取其中10个颜色赋值给变量cl
ctload, 24, /BREWER, /reverse, ncolors=10, rgb_table=cl ct=congrid(cl, 256,3, /center) ;调整数组大小 ct[255,*]=210 ;最后一列设为灰色,用于当做背景值
;读入用于作图的数据
data=read_binary(out_file, data_type=4, data_dims=[400,400])
;查看图像数据值的分布,用于确定线性拉伸到0—254的最小值和最大值。 index=where(data lt 998.0);选择非背景值的元素 hist=histogram(data[index], locations=x) iplot, x, hist, /histogram
;通过查看直方图,确定最小值为-2.5,最大值为2.5
19
;将数据-2.5—2.5线性拉伸到0—254
data1=bytscl(data, min=-2.5, max=2.5, top=254)
;将背景值设为255
index1=where(data gt 998.0) data1[index1]=255
;用imap显示图像
imap, data1, rgb_table=ct, /order ;将原数据data设定在将-2.5—2.5之间 data=data > (-2.5) data=data < 2.5 ;用iimage显示图像
iimage, data, rgb_table=ct, /order
2.5.4
IDL程序分析
上述程序中,主要用到用户自定义函数CTLOAD,函数CONGRID、READ_BINARY、WHERE、HISTOGRAM和BYTSCL,命令IPLOT 、IMAP、IIMAGE。下面对它们中的一些进行简单介绍,以方便程序理解。
(1). CTLOAD:用户自定义函数,作用与LOADCT相同,目的是加载颜色表到
内存中,用于显示颜色的控制。具体代码见IDL程序ctload.pro。
注意:在使用CTLOAD函数之前,需要将用户自定义的颜色表fsc_brewer.tbl拷贝到\\resource\\colors目录下(与IDL自带颜色表colors1.tbl同一目录)。
(2). CONGRID:可以调整数组为同维任意大小的数组的函数,默认在处理一维
或二维数组时默认是最近邻重采样方式,处理三维数组时默认是双线性内插值。 (3). HISTOGRAM:用于计算数组密度函数的函数。
(4). BYTSCL:对数据进行拉伸的函数。将数据范围在Min ≤ x ≤ Max 的数据拉
伸到0 ≤ x ≤ Top的范围。 (5). IPLOT:用于二维和三维图形的绘制。
(6). IMAP:用于图像数据的显示、研究,感兴趣图像区域的圈定和基本操作。 (7). IIMAGE:用于用户显示矢量和具有地理坐标的影像数据。 2.5.5
结果显示
20
如图所示,图4线性变化趋势直方图,图5线性变化趋势拉伸后直方图。
图4 线性变化趋势直方图
图5 线性变化趋势拉伸后直方图
iMap制图过程中,在弹出的操作步骤中设定投影及坐标参数如下:(1). 单位选择:meters
21
(2). 参数设置如下:
xmin: -412003.4403,xmax: 2787996.5597 ymin: -1571998.991,ymax: 1628001.0090 cell size: 8000
22
(3). 投影设置如下:
Projection: Albers Equal Area Ellipsoid: WGS 84
Center longitude (degrees): -103 Center latitude (degrees): 45 False easting (meters): 0 False northing (meters): 0 Standard parallel 1 (deg): 20 Standard parallel 2 (deg): 60
23
(4). 线性变化趋势图显示如下
24
(5). 添加Continents边界:选择Insert → Map Continents
(6). 在iImage窗口中添加颜色棒:Insert → Colorbar,并将其复制到iMap窗口
中。 (7). 保存iMap图像窗口中的文件,并另存为jpg图片,完成北美1982-2006年
每年的植被返青期线性变化趋势图,见图6。
25
图6 北美1982-2006年每年的植被返青期线性变化趋势图
三、 总结
根据以上IDL程序及操作,即可完成北美1982-2006年各像元的植被返青期线性变化趋势、显著性概率以及各个行政单元(州)内有效物候区中的返青期平均变化趋势的计算,并对各像元的植被返青期线性变化趋势制图输出。
综上所述,在IDL操作过程中,当打开的文件并读取文件后,要及时关闭文件以免出现意外的错误。当计算线性变化趋势及显著性概率的时候,可以巧妙的利用IDL数组操作将结果存储到一个文件中。在计算返青期平均变化趋势的时候注意使用WHERE函数,可以方便快捷的得到需要的结果。在制图输出的过程中,注意IDL制图命令的使用及相应参数的正确设置。
26
因篇幅问题不能全部显示,请点此查看更多更全内容