遥感图像处理及ENVI IDL操作实践(26P)

上传人:沈*** 文档编号:41369828 上传时间:2021-11-20 格式:DOC 页数:26 大小:728.01KB
返回 下载 相关 举报
遥感图像处理及ENVI IDL操作实践(26P)_第1页
第1页 / 共26页
遥感图像处理及ENVI IDL操作实践(26P)_第2页
第2页 / 共26页
遥感图像处理及ENVI IDL操作实践(26P)_第3页
第3页 / 共26页
点击查看更多>>
资源描述
1IDL 基本操作介绍课题名称: 遥感图像处理及 ENVIIDL 操作实践 任课教师: 2目录目录一、一、IDL 简介简介.31.IDL特殊符号说明.31.1.大写.31.2.注释符.31.3.续航符.32.IDL 语法基础.32.1.变量.32.2.数组.53.IDL 编程基础.63.1.定义和编译程序.63.2.命名和编译源文件.73.3.程序控制语句.7二、二、IDL 基本操作介绍基本操作介绍.91.题目及要求.92.解决方案.92.1数据说明.92.2二进制文件读取.102.3各像元的线性变化趋势及显著性概率计算.122.4有效物候区返青期平均变化趋势统计.142.5制图输出线性变化趋势.17三、三、总结总结.263一一、 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 messageend1.3. 续续航航符符IDL 中的续行符是表示美元的符号“$” 。这表示 IDL 语句延续到下一语句行(见上例)。2. IDL 语法基础语法基础4变变量量IDL 提供了灵活的数据类型定义方法,在任何时候,IDL 都允许用户创建新的变量,或重新定义已有的变量。变量名必须以字母开头。它们可以包括其他字母、数字、下划线、美元符号。一个变量名最长可达 255 个字符。变量有两个重要属性: 数据类型和组织结构。 数据类型指出属于数据类型中的哪一种。IDL 提供了非常丰富的数据类型,用户可以实际需求经行选择。表1 显示了每一种数据类型及其描述,每种类型创建的变量的字节大小、变量创建方式、数据类型之间强制转换的 IDL 函数名称。除了数据类型外,每一个变量有一个组织结构。有效的组织结构有标量(例如单个数值) 、矢量(真正的一维数组) 、数组(最高可达八维)和 IDL 结构(能包含各种数据类型的变量和组织结构,结构中独立的组成部分称为字段)。表表 1 IDL 基本数据类型基本数据类型数字类型变量数字类型变量数据类型描述字节数创建变量数据类型函数byte字节型1Var=0BthisVar=Byte(variable)int16 位有符号整型2Var=0thisVar=Fix(variable)long32 位有符号长整型4Var=0LthisVar=Long(variable)long6464 位有符号整型8Var=0LLthisVar=Long64(variable)uint16 位无符号整型2Var=0UthisVar=UInt(variable)ulong32 位无符号长整型4Var=0ULthisVar=ULong(variable)ulong6464 位无符号整型8Var=0ULLthisVar=Ulong64(variable)float浮点型4Var=0.0thisVar=Float(variable)double双精度浮点型8Var=0.0DthisVar=Double(variable)complex复数8Var=Complex(0.0,0.0)thisVar=Complex(variable)dcomplex双精度复数16Var=Dcomplex(0.0D,00D)thisVar=DComplex(variable)非数字类型变量非数字类型变量数据类型描述字节数创建变量数据类型函数string字符串0-32767Var=或 Var=”thisVar=String(variable)pointer指针4Var=Ptr_New()None5objref对象4Var=Obj_New()Nonestuct结构体2.2. 数数组组IDL 中可以为任何 IDL 数据类型创建 18 维的数组。数组操作的运行速度往往优于循环操作,且语法更为精炼。在 IDL 中利用方括号“ ”创建数组。创建多维数组时可以使用嵌套的方括号。值的注意的是,IDL 中数组元素的存储是按列进行的。按列存储的方式意味着连续的数组元素也将按顺序被存储,而且数组的第一维(列)变化的最快。下标的顺序先是列标,后是行标。IDL 的数组下标是从零开始的正值。数组的下标可以是标量也可以是矢量。进行下标操作时,如果下标超过了范围,则该下标被转换为在允许范围内的最小或最大的下标值。例如,创建一维数组vector 和多为数组 array:; 创建一维数组 vectorIDL vector=1,2,3IDL help,vectorVECTOR INT = Array3IDL print,vector; 输出 IDL 输出窗口中将会如下所示: 1 2 3 ; 创建多维数组arrayIDL array=1,2,3,4,5,6IDL help,arrayARRAY INT = Array3, 2IDL print, array1 2 34 5 6IDL 的内建函数允许用户按指定的类型创建数组,同时数组中的每个元素都被初始化为灵活索引值(下标值)。创建和初始化零数组和索引数组的函数见表 2 所示。表表 2 创建和初始化零数组和索引数组的函数创建和初始化零数组和索引数组的函数数据类型零数组索引数组bytebytarr( )bindgen( )intintarr( )indgen( )longlonarr( )lindgen( )long64lon64arr( )l64indgen( )uintuintarr( )uindgen( )6ulongulonarr( )ulindgen( )ulong64ulon64arr( )ul64indgen( )floatfltarr( )findgen( )doubledblarr( )dindgen( )complexComplex arr( )cindgen( )dcomplexDcomplex arr( )dcindgen( )stringstrarr( )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.000003. IDL 编程基础编程基础结构化程序设计是 E.W.Dijikstra 在 1965 年提出的。它的主要观点是采用自顶向下、逐步求精的程序设计方法;使用三种基本控制结构构造程序,任何程序都可由顺序、选择、重复三种基本控制结构构造。编写 IDL 程序也需要对 IDL 中的相关控制语句进行简单介绍。 定定义义和和编编译译程程序序IDL 程序包括过程和函数两种:(1). 过程(pro)过程一般将几个相关的操作加到一个程序模块中。过程以 pro 开头,end 结束。例如:;过程名 test1, 参数 para1,para2,.propro testtest1 1,para1,para2,. 过程语句块endend(2). 函数(function)函数一般将一个操作加载到一个程序模块中,并返回结果函数以 function 开头,end 结束,并包括一个 return 语句返回结果。例如:;函数名 test2,参数 para1,para2,.,返回值 para1functionfunction test2test2,para1,para2,. 过程语句块7 returnreturn ,para1endendIDL 命令要么是过程,要么是函数。过程和函数的区别在于:在过程命令中,参数和关键字仅排列在一个命令行上;在函数命令中,位置参数和关键字参数放在一对圆括号中的。但是,最重要的区别是 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 8在以上的所有行驶中,“条件”是一个标量表达式,其值为真或假。在前两种形式中,当条件为真时,执行单个语句或语句模块;在后面两种行驶中,当条件为假时,“else”语句将执行单个的语句或语句模块。(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 语句 9FOR I=V1,V2,INC DO 语句 FOR I=V1,V2,INC DO BEGIN 语句 ENDFOR 默认条件下增量为 1,也可以自定义增量。(2). WHILE 语句 当特定的条件为真,WHILE 语句执行单个语句或语句块 。WHILE 条件 DO 语句 WHILE 条件 DO BEGIN 语句 ENDWHILE二二、 IDL 基基本本操操作作介介绍绍下文以解决一个生态学问题为例,详细讲解 IDL 基本操作步骤。1. 题目及要求题目及要求问题:现有北美 19822006 年每年的植被返青期数据。要求:(1). 计算出各像元的线性变化趋势及显著性概率。(2). 统计出各个行政单元(州)内有效物候区中的返青期平均变化趋势。(3). 对线性变化趋势制图输出。2. 解决方案解决方案数数据据说说明明北美 19822006 年每年的植被返青期数据 greenup_1982_2006,共 25 个波段,每个波段代表每年一景植被返青期数据,影像拍摄时间为每年的第 80 天或第 100 天。影像头文件信息见图 1。10图图 1 北美北美 19822006 年每年的植被返青期数据年每年的植被返青期数据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_lun11其中,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, data12其中,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.5IDL 程程序序实实现现将数据 greenup_1982_2006 在 IDL 中打开的语句如下:定义输入、输出文件名greenup_file=E:RS_ENVIchapter04datagreenup_1982_2006out_file=E:RS_ENVIchapter04datatestgreenup_trend;通过查看greenup_1982_2006.hdr文件,获取相关信息;创建输入变量,用来存储 greenup_1982_2006 的数据greenup=intarr(400,400,25) ;将greenup_1982_2006文件打开并读入数组greenup中 openr, in_lun, greenup_file, /get_lunreadu, in_lun, greenupfree_lun, in_lun2.3 各各像像元元的的线线性性变变化化趋趋势势及及显显著著性性概概率率计计算算2.3.1计计算算过过程程分分析析13由北美 19822006 年每年的植被返青期数据可知,每个像元都有 25 个像元值,代表了其每年的返青日期。因此,用年份(时间)当自变量 X,像元值(返青期)当因变量 Y,则可以回归出每个像元的返青期线性变化曲线。曲线的斜率代表了返青期的变化趋势:斜率小于 0 代表返青期提前,大于 0 代表返青期推迟。对计算结果进行 F 检验,可以得到每个像元的显著性概率。2.3.2IDL 程程序序实实现现利用 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(greenupi,j,*);重组 if y0 eq 5000 then continue ;遇到背景值5000跳过 trendi,j,0=regress(x,y, ftest=ftest) ;线性斜率 trendi,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=42.3.3IDL 程程序序分分析析上述程序中,主要用到的函数有 MAKE_ARRAY、REFORM、REGRESS和 F_PDF ,命令有 OPENW、WRITEU,用户自定义过程ZHU_WRITE_ENVI_HEADER。下面对它们进行简单介绍,以方便程序理解。(1). MAKE_ARRAY:在程序运行时,动态创建数组的函数。返回值为一个指定类型、维度和初始值的数组。14(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 所示,计算其内有效物候区中的返青期平均变化趋势。需要用到的数据有:15(1). 各像元的线性变化趋势,文件 greenup_trend 的第一波段。(2). 物候区文件 phenoregion_file,其中每种颜色代表一种物候。(3). 示例州栅格文件 state_file,由三个示例州的 ROI 文件 state_roi.roi 导出得到。为了计算出示例州内有效物候区中的返青期平均变化趋势,首先需要创建输入变量来存储数据,并将数据读入到变量中(利用上述文件读取方法)。同时,需要创建变量 result 存储输出数据。根据要求,result 变量应为一个2 行 3 列的浮点型数组。第一列用于存储示例州的编号,第二列用于存储各示例州内有效物候区中的返青期平均变化趋势。具体结构如表 3 result 变量结构所示:表表 3 result 变量结构变量结构示例州编号示例州编号有效物候区中返青期平均变化趋势有效物候区中返青期平均变化趋势1示例州 1 内有效物候区中的返青期平均变化趋势2示例州 2 内有效物候区中的返青期平均变化趋势3示例州 3 内有效物候区中的返青期平均变化趋势然后,找出各示例州内有效物候区像元,即同时位于各示例州和物候区内的像元,并计算各示例州内有效物候区像元的平均线性变化趋势。将计算结果写入文件,即可完成全部操作。2.4.2IDL 程程序序实实现现利用 IDL 程序可以实现上述分析内容,并将计算结果保存的到 CSV 文件中。具体代码如下: ;定义输入、输出文件名 trend_file=D:testgreenup_trend;各像元的线性变化趋势及显著性概率 phenoregion_file=D:dataphenoregion;物候区数据 state_file=D:datastate_class;三个示例州的栅格图 out_file=D:teststa.csv ;创建输入变量,用来存储trend, phenoregion, state数据 ;通过查看各数据的头文件,获取相关信息 trend=fltarr(400,400) ;只存储第一波段(线性变化趋势) phenoregion=intarr(400,400) state=bytarr(400,400) ;创建输出变量,用来存储3个示例州的平均线性变化趋势 result=fltarr(2,3)16 result0,*=findgen(3)+1.0 ;第一列存储各个州的代码 ;读入数据 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=trendindex if count gt 0 then result1,i-1=mean(trendindex) endfor ;输出结果 write_csv, out_file, result2.4.3IDL 程程序序分分析析上述程序中,主要用到的函数有 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)的零元素的下标组成的矢量。17(2). MEAN:计算一组数字型矢量的平均值的函数。(3). WRITE_CSV:将数据写入.CSV 文件中。2.4.4结结果果显显示示执行 2.4.2 中 IDL 代码, 生成 sta.csv 文件,得到 3 个示例州内有效物候区中的返青期平均变化趋势,见表 4。表表 4 示例州内有效物候区中的返青期平均变化趋势示例州内有效物候区中的返青期平均变化趋势示例州编号示例州编号有效物候区中返青期平均变化趋势有效物候区中返青期平均变化趋势1-0.130672-0.0343230.536882.5 制制图图输输出出线线性性变变化化趋趋势势2.5.1IDL 的的颜颜色色运运用用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 位显示是静态显示。18图图 3 索引颜色模式索引颜色模式颜色表可以由用户人为修改,颜色表控制函数有如下(表 5)几种。TVLCT命令用来设置或获取颜色表的内容; LoadCT 命令装载 IDL 预定义过的 41 个颜色表中的一个。这些颜色表的定义在resourcecolors 目录下 colors1.tbl 文件中。XloadCT 和 Xpalette 两个命令,可以修改和创建颜色表。XloadCT 允许用不同的方法扩展颜色。Xpalette 命令允许通过设置滚动条的端点色和插入干涉值来修改和创造自己的颜色表。表表 5 颜色表控制函数颜色表控制函数名称名称功能功能TVLCT设置或获取颜色表的内容LOADCT装载一个预定义过的颜色表X LOADCT装载和调整预定义过的颜色表XPALETTE定制颜色表2.5.2IDL 绘绘图图(1). 直接图形法19直接图形法是 IDL 的图像或图形直接绘制在用户指定的图形设备上,可在很短的时间内生长高质量的图形。执行内置直接图形程序,将会建立坐标系,创建轴和边界。组成直接图形系统的例行程序,如 Plot、Contour 及 Surface 等等,可以完成大部分关于图形输出的操作。直接绘图程序一旦生成直接图形,结果就会被输出到当前设备,并且删除掉所有相关数据。若要对已生成的直接图形做出改动或是将结果输出到另外的设备,就必须要重新执行。 直接图形法对内存有默认的管理方法,占用内存少, 用户不必自己释放内存,方便、简洁易用。(2). 对象图形法 传统的开发方法开发的程序重用性、可修改性及可维护性都比较差,对象法是 IDL5.0 引入面向对象编程概念后出现的,面向对象的基础也就是对象类的使用。对象类允许编程者将数据和方法封装成一个包,称之为对象。一个对象类可以重复利用生成多个对象。 在 IDL 的虚拟图形构架体系中有一套对象显示结构对象,而且提供了很多的对象图形原子,利用这些对象和对象图形原子之间可以进行互相的加载,相互作用形成显示对象, 灵活的运用这些图形原子就可以在视图中得到丰富多彩的图形或图像,甚至可以制作三维的动画。2.5.3线线性性变变化化趋趋势势图图 IDL 程程序序实实现现本例中,首先加载用户预先设定的颜色表,利用此表中的颜色显示线性变化趋势制图。然后通过观察图像数据值的分布情况,确定图像最终拉伸范围,并将背景值设为 255。之后通过 imap 或 iimage 方式显示图像。具体代码如下:;创建颜色表CT ;ctload为用户自定义函数,加载颜色表24号到内存中,并将颜色表颜色反转,取其中10个颜色赋值给变量clctloadctload, 2424, /BREWER, /reverse, ncolors=1010, rgb_table=clct=congridcongrid(cl, 256256,3 3, /center) ;调整数组大小ct255255,*=210210 ;最后一列设为灰色,用于当做背景值;读入用于作图的数据data=read_binaryread_binary(out_file, data_type=4 4, data_dims=400400,400400)20;查看图像数据值的分布,用于确定线性拉伸到0254的最小值和最大值。index=wherewhere(data ltlt 998.0998.0);选择非背景值的元素hist=histogramhistogram(dataindex, locations=x)iplotiplot, x, hist, /histogram;通过查看直方图,确定最小值为-2.5,最大值为2.5;将数据-2.52.5线性拉伸到0254data1=bytsclbytscl(data, min=-2.52.5, max=2.52.5, top=254254);将背景值设为255index1=wherewhere(data gtgt 998.0998.0)data1index1=255255;用imap显示图像imapimap, data1, rgb_table=ct, /order;将原数据data设定在将-2.52.5之间data=data (-2.52.5)data=data 2.52.5;用iimage显示图像iimageiimage, data, rgb_table=ct, /order2.5.4IDL 程程序序分分析析上述程序中,主要用到用户自定义函数 CTLOAD,函数CONGRID、READ_BINARY、WHERE、HISTOGRAM 和 BYTSCL,命令IPLOT 、IMAP、IIMAGE。下面对它们中的一些进行简单介绍,以方便程序理解。(1). CTLOAD:用户自定义函数,作用与 LOADCT 相同,目的是加载颜色表到内存中,用于显示颜色的控制。具体代码见 IDL 程序 ctload.pro。注意:在使用注意:在使用 CTLOAD 函数之前,需要将用户自定义的颜色表函数之前,需要将用户自定义的颜色表fsc_brewer.tbl 拷贝到拷贝到resourcecolors 目录下(与目录下(与 IDL 自带颜色表自带颜色表colors1.tbl 同一目录)。同一目录)。(2). CONGRID:可以调整数组为同维任意大小的数组的函数,默认在处理一维或二维数组时默认是最近邻重采样方式,处理三维数组时默认是双线性内插值。(3). HISTOGRAM:用于计算数组密度函数的函数。(4). BYTSCL:对数据进行拉伸的函数。将数据范围在 Min x Max 的数据拉伸到 0 x Top 的范围。21(5). IPLOT:用于二维和三维图形的绘制。(6). IMAP:用于图像数据的显示、研究,感兴趣图像区域的圈定和基本操作。(7). IIMAGE:用于用户显示矢量和具有地理坐标的影像数据。2.5.5结结果果显显示示如图所示,图 4 线性变化趋势直方图,图 5 线性变化趋势拉伸后直方图。图图 4 线性变化趋势直方图线性变化趋势直方图22图图 5 线性变化趋势拉伸后直方图线性变化趋势拉伸后直方图iMap 制图过程中,在弹出的操作步骤中设定投影及坐标参数如下:(1). 单位选择:meters(2). 参数设置如下:xmin: -412003.4403,xmax: 2787996.5597 ymin: -1571998.991,ymax: 1628001.0090cell size: 800023(3). 投影设置如下:Projection: Albers Equal AreaEllipsoid: WGS 84Center longitude (degrees): -103Center latitude (degrees): 45False easting (meters): 0False northing (meters): 0Standard parallel 1 (deg): 20Standard parallel 2 (deg): 6024(4). 线性变化趋势图显示如下25(5). 添加 Continents 边界:选择 Insert Map Continents(6). 在 iImage 窗口中添加颜色棒:Insert Colorbar,并将其复制到 iMap 窗口中。(7). 保存 iMap 图像窗口中的文件,并另存为 jpg 图片,完成北美 19822006年每年的植被返青期线性变化趋势图,见图 6。26图图 6 北美北美 19822006 年每年的植被返青期线性变化趋势图年每年的植被返青期线性变化趋势图三三、 总总结结根据以上 IDL 程序及操作,即可完成北美 19822006 年各像元的植被返青期线性变化趋势、显著性概率以及各个行政单元(州)内有效物候区中的返青期平均变化趋势的计算,并对各像元的植被返青期线性变化趋势制图输出。综上所述,在 IDL 操作过程中,当打开的文件并读取文件后,要及时关闭文件以免出现意外的错误。当计算线性变化趋势及显著性概率的时候,可以巧妙的利用 IDL 数组操作将结果存储到一个文件中。在计算返青期平均变化趋势的时候注意使用 WHERE 函数,可以方便快捷的得到需要的结果。在制图输出的过程中,注意 IDL 制图命令的使用及相应参数的正确设置。
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 办公文档


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!