遥感图像处理及ENVI IDL操作实践(26P)_第1页
遥感图像处理及ENVI IDL操作实践(26P)_第2页
遥感图像处理及ENVI IDL操作实践(26P)_第3页
遥感图像处理及ENVI IDL操作实践(26P)_第4页
遥感图像处理及ENVI IDL操作实践(26P)_第5页
已阅读5页,还剩21页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、idl 基本操作介绍 课题名称: 遥感图像处理及 enviidl 操作实践 任课教师: 目录目录 一、一、idl 简介简介.3 1.idl特殊符号说明.3 1.1.大写.3 1.2.注释符.3 1.3.续航符.3 2.idl 语法基础.3 2.1.变量.3 2.2.数组.5 3.idl 编程基础.6 3.1.定义和编译程序.6 3.2.命名和编译源文件.7 3.3.程序控制语句.7 二、二、idl 基本操作介绍基本操作介绍.9 1.题目及要求.9 2.解决方案.9 2.1数据说明.9 2.2二进制文件读取.10 2.3各像元的线性变化趋势及显著性概率计算.12 2.4有效物候区返青期平均变化趋

2、势统计.14 2.5制图输出线性变化趋势.17 三、三、总结总结.26 一一、 idl 简简介介 idl(interactive data language)交互式数据语言是进行二维及多维数据可 视化分析及应用开发的理想软件工具。作为面向矩阵、语法简单的第四代可视 化语言,idl 致力于科学数据的可视化和分析,是跨平台应用开发的最佳选择。 它集可视、交互分析、大型商业开发为一体,为用户提供了完善、灵活、有效 的开发环境。idl 为用户提供了可视化数据分析的解决方案,既可以让科学研 究人员交互式浏览和分析数据,又为程序员提供了快速程序原型开发并跨平台 发布的高级编程工具。idl 使科学家无需写大

3、量的传统程序就可直接研究数据。 idl 被广泛应用于地球科学、医学影像、图像处理、软件开发、大学教学、实 验室研究、测试技术、天文、信号处理、防御工程、数学分析、统计等诸多领 域。 1. idl 特殊符号说明特殊符号说明 在 idl 程序中,当在命令行中输入命令时,idl 将会识别大量的特殊字符。 下面介绍几种较为重要的特殊符号。 1.1. 大大写写 idl 对字母的大小写并不敏感,但与操作系统打交道的命令(例如:unix 操作系统对 idl 所打开的文件名的大小写敏感)和执行字符串比较命令时除 外。 1.2. 注注释释符符 在 idl 命令中,分号 “;”(英文半角符号)表示注释内容的开始,

4、分号右边 的任何文本都被视为是注释,idl 解释器将忽略它。例如: pro test ;a simple program print,hello world !,$ lyt;this line prints a message end 1.3. 续续航航符符 idl 中的续行符是表示美元的符号“$” 。这表示 idl 语句延续到下一语句 行(见上例)。 2. idl 语法基础语法基础 变变量量 idl 提供了灵活的数据类型定义方法,在任何时候,idl 都允许用户创建 新的变量,或重新定义已有的变量。 变量名必须以字母开头。它们可以包括其他字母、数字、下划线、美元符 号。一个变量名最长可达 25

5、5 个字符。 变量有两个重要属性: 数据类型和组织结构。 数据类型指出属于数据类型中 的哪一种。idl 提供了非常丰富的数据类型,用户可以实际需求经行选择。表 1 显示了每一种数据类型及其描述,每种类型创建的变量的字节大小、变量创 建方式、数据类型之间强制转换的 idl 函数名称。除了数据类型外,每一个 变量有一个组织结构。有效的组织结构有标量(例如单个数值) 、矢量(真正 的一维数组) 、数组(最高可达八维)和 idl 结构(能包含各种数据类型的 变量和组织结构,结构中独立的组成部分称为字段)。 表表 1 idl 基本数据类型基本数据类型 数字类型变量数字类型变量 数据类型描述字节数创建变量

6、数据类型函数 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=0

7、ullthisvar=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=

8、”thisvar=string(variable) pointer指针4var=ptr_new()none objref对象4var=obj_new()none stuct结构体 2.2. 数数组组 idl 中可以为任何 idl 数据类型创建 18 维的数组。数组操作的运行速度 往往优于循环操作,且语法更为精炼。 在 idl 中利用方括号“ ”创建数组。创建多维数组时可以使用嵌套的方括 号。值的注意的是,idl 中数组元素的存储是按列进行的。按列存储的方式意 味着连续的数组元素也将按顺序被存储,而且数组的第一维(列)变化的最快。 下标的顺序先是列标,后是行标。idl 的数组下标是从零开始的正值

9、。数组的 下标可以是标量也可以是矢量。进行下标操作时,如果下标超过了范围,则该 下标被转换为在允许范围内的最小或最大的下标值。例如,创建一维数组 vector 和多为数组 array: ; 创建一维数组 vector idl vector=1,2,3 idl help,vector vector int = array3 idl print,vector ; 输出 idl 输出窗口中将会如下所示: 1 2 3 ; 创建多维数组array idl array=1,2,3,4,5,6 idl help,array array int = array3, 2 idl print, array 1 2

10、 3 4 5 6 idl 的内建函数允许用户按指定的类型创建数组,同时数组中的每个元素 都被初始化为灵活索引值(下标值)。创建和初始化零数组和索引数组的函数 见表 2 所示。 表表 2 创建和初始化零数组和索引数组的函数创建和初始化零数组和索引数组的函数 数据类型零数组索引数组 bytebytarr( )bindgen( ) intintarr( )indgen( ) longlonarr( )lindgen( ) long64lon64arr( )l64indgen( ) uintuintarr( )uindgen( ) ulongulonarr( )ulindgen( ) ulong64u

11、lon64arr( )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

12、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 中的相关控制语句进行简单介绍。 定定义义和和编编译译程程序序 idl 程序包括过程和函数两种: (1). 过程(pro) 过程一般将几个相关的操作加到一个程序模块中。过程以 pro 开头,end 结

13、束。例如: ;过程名 test1, 参数 para1,para2,. propro testtest1 1,para1,para2,. 过程语句块 endend (2). 函数(function) 函数一般将一个操作加载到一个程序模块中,并返回结果函数以 function 开 头,end 结束,并包括一个 return 语句返回结果。例如: ;函数名 test2,参数 para1,para2,.,返回值 para1 functionfunction test2test2,para1,para2,. 过程语句块 returnreturn ,para1 endend idl 命令要么是过程,要么是

14、函数。过程和函数的区别在于:在过程命令 中,参数和关键字仅排列在一个命令行上;在函数命令中,位置参数和关键字 参数放在一对圆括号中的。 但是,最重要的区别是 idl 函数会返回一个值,等号左边的一个变量用于 返回该值。这是 idl 中函数命令和过程命令根本的区别。 函数命令总是返回 一个值,这个数值必须赋给一个变量。函数返回值可能是任何一种 idl 变量, 包括数值、数组或结构。 3.2. 命命名名和和编编译译源源文文件件 命名一个 idl 源文件的标志形式是在过程或函数名称后加上扩展名.pro 过程和函数都可以通过“.compile”命令进行手动编译或是通过 idl ide 环境进 行编译。

15、 当需要时,过程和函数会在运行时自动编译,如果 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 在以上的所有行驶中,“条件”是一个标量表达式,其值为真或假。在前 两种形式中,当条

16、件为真时,执行单个语句或语句模块;在后面两种行驶中, 当条件为假时,“else”语句将执行单个的语句或语句模块。 (2). case 语句 case 语句根据一个标量的表达式来选择某个语句或语句块运行。 case 表达式 of 情况 1: 情况 2:语句 情况 3:begin 语句 end else: 语句 endcase 当表达式和其中的某个情况匹配,相应的语句被执行, case 语句结束, 如果没有匹配的情况,那么执行 else 下的语句,如果没有 else 语句,将会发 生错误,建议在 case 语句中都加上 else。 (3). switch 语句 switch 跟 case 类似,但

17、与 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

18、,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). 统计出各个行政单元(州)

19、内有效物候区中的返青期平均变化趋势。 (3). 对线性变化趋势制图输出。 2. 解决方案解决方案 数数据据说说明明 北美 19822006 年每年的植被返青期数据 greenup_1982_2006,共 25 个波 段,每个波段代表每年一景植被返青期数据,影像拍摄时间为每年的第 80 天或 第 100 天。影像头文件信息见图 1。 图图 1 北美北美 19822006 年每年的植被返青期数据年每年的植被返青期数据 greenup_1982_2006 头文件信息头文件信息 2.2 二二进进制制文文件件读读取取 2.2.1文文件件打打开开 (1). 利用 open 命令打开二进制文件 idl 中的

20、所有输入和输出都是通过逻辑设备号完成的。可以把一个逻辑设 备设想为一个管道,这个管道连接着 idl 和需要进行读写的数据文件。要从 一个文件中读写数据,必须首先把一个逻辑设备号连接到一个特定的文件。这 就是 idl 中三个 open 命令的作用。 openr (open read) :用只读方式打开一个现有的文件。 openw(open write) :打开一个新文件用于读写。如果文件已经存在, 则其原始文件内容将会被新内容所替代。 openu(open update) :打开一个已经存在的文件用于读写。 这三个命令的语法结构是完全相同的。首先是命令名,后面是一个逻辑设 备号和需要与该逻辑设备

21、号相连的文件名。 用法如下: openr, in_lun, in_filename , /get_lun 其中,in_lun 代表打开文件的逻辑设备号,可以用户手动赋值,也可以由计 算机随机赋值。in_filename 为要打开的文件路径。/get_lun 代表打开文件时,逻 辑设备号由计算机随机赋值,而不是用户手动赋值。当用户打开多个文件时, 使用/get_lun 可以避免文件号被重复使用而造成的错误。 (2). 利用 read_binary 函数打开二进制文件 read_binary:利用已有的模板或者命令行关键字的方式读取二进制文件。 用法如下: result = read_binary

22、 (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_

23、type,data_dims,endian 同时使用。若 使用了 template 关键字,则 read_binary 函数的返回值为一个与 template 结构 相同的结构体,否则为一个数组。data_start 用于表示数据的起始位置,类似于 偏移量。data_type 用于表示数据类型。data_dims 用于表示读入与返回的数据 的范围。endian 表示文件字节读取的顺序。 注意:如果需要打开的文件很大,无法全部读入内存中,则需要根据要求,注意:如果需要打开的文件很大,无法全部读入内存中,则需要根据要求, 考虑改变文件的数据排列方式,例如使用考虑改变文件的数据排列方式,例如使用 b

24、il、bip 方式。方式。 例如,本例中,目的是获取数据的纵向剖面,因此可以采用 bil、bip 数据 排列方式。由于 bil 方式处理数据不需要频繁的读写,因此采取 bil 方式更佳。 2.2.2文文件件读读入入 利用上述两种方式将文件打开后,利用 readu 命令可以将文件读入指定 的数组中。 readu:从文件中读取无格式二进制数据到一个 idl 变量中。 用法如下: readu, in_lun, data 其中,in_lun 为已经打开的逻辑设备号。data 为已定义的、与打开文件相同 数据类型的 idl 变量。 2.2.3文文件件写写出出 利用 writeu 命令可以将数据写入无格式

25、二进制文件中。 用法如下: writeu, out_lun, data 其中,out _lun 为已经打开的文件逻辑设备号。data 为要写入文件的 idl 变 量。 2.2.4文文件件关关闭闭 所有打开的文件,在将数据读入到 idl 变量后,都应该及时关闭,释放资 源。以避免不必要的错误出现。利用 free_lun 或 close 命令可以将打 开的文件关闭。 free_lun:关闭打开的文件,取消分配的逻辑设备号,回收内存资源。 用法如下: free_lun, in_lun 其中,in_lun 为逻辑设备号。 close:根据指定参数关闭逻辑设备号。 用法如下: close, , unit

26、1, ., 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_

27、envichapter04datagreenup_1982_2006 out_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_lun readu, in_lun, greenup free_lun, in_lun 2.3

28、 各各像像元元的的线线性性变变化化趋趋势势及及显显著著性性概概率率计计算算 2.3.1计计算算过过程程分分析析 由北美 19822006 年每年的植被返青期数据可知,每个像元都有 25 个像 元值,代表了其每年的返青日期。因此,用年份(时间)当自变量 x,像元值 (返青期)当因变量 y,则可以回归出每个像元的返青期线性变化曲线。曲线 的斜率代表了返青期的变化趋势:斜率小于 0 代表返青期提前,大于 0 代表返 青期推迟。对计算结果进行 f 检验,可以得到每个像元的显著性概率。 2.3.2idl 程程序序实实现现 利用 idl 程序可以实现上述分析内容,并将计算结果保存的到 envi 文件 中。

29、具体代码如下: ;创建输出变量,用来存储线性趋势和显著性概率数据 ;第一波段存储线性趋势,第二波段存储显著性概率,背景值为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=f

30、test) ;线性斜率 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=4 2.3.3idl 程程序序分分析析 上述程序中,主要用到的函数有 make_array、reform、regress 和 f_

31、pdf ,命令有 openw、writeu,用户自定义过程 zhu_write_envi_header。下面对它们进行简单介绍,以方便程序理解。 (1). make_array:在程序运行时,动态创建数组的函数。返回值为一个指 定类型、维度和初始值的数组。 (2). reform:可以使数组在固定元素个数的前提下,改变下标引用索引的函 数。当指定了返回维数时,函数返回与给定的维度相同的数组,不改变数 组总元素个数及元素值。若没有指定维度,则返回数组的一个副本,当数 组中有某一维维度为一时,则将这一维去掉。 (3). regress:执行多元线性回归的函数,返回归方程的系数组成的列向量。 其参数

32、 ftest 代表 f-检验的结果值。 (4). f_pdf: 利用 ftest 参数进行显著性概率计算的函数。 (5). openw:打开一个新文件用于读写。如果文件已经存在,则其原始文件内 容将会被新内容所替代。 (6). writeu:将数据写入无格式二进制文件中。 (7). zhu_write_envi_header:用户自定义的一个 idl 程序,用于编写一 个 envi 头文件。详细代码见 zhu_write_envi_ 。 2.3.4结结果果显显示示 图 1 是 idl 代码的执行结果,左边为各像元的线性变化趋势,右边为各像 元的显著性概率。 图图 2 各像元

33、的线性变化趋势及显著性概率各像元的线性变化趋势及显著性概率 2.4 有有效效物物候候区区返返青青期期平平均均变变化化趋趋势势统统计计 2.4.1计计算算过过程程分分析析 本文选取 3 个示例州如图 3 所示,计算其内有效物候区中的返青期平均变 化趋势。需要用到的数据有: (1). 各像元的线性变化趋势,文件 greenup_trend 的第一波段。 (2). 物候区文件 phenoregion_file,其中每种颜色代表一种物候。 (3). 示例州栅格文件 state_file,由三个示例州的 roi 文件 state_roi.roi 导出得到。 为了计算出示例州内有效物候区中的返青期平均变化

34、趋势,首先需要创建 输入变量来存储数据,并将数据读入到变量中(利用上述文件读取方法)。 同时,需要创建变量 result 存储输出数据。根据要求,result 变量应为一个 2 行 3 列的浮点型数组。第一列用于存储示例州的编号,第二列用于存储各示 例州内有效物候区中的返青期平均变化趋势。具体结构如表 3 result 变量结 构所示: 表表 3 result 变量结构变量结构 示例州编号示例州编号有效物候区中返青期平均变化趋势有效物候区中返青期平均变化趋势 1示例州 1 内有效物候区中的返青期平均变化趋势 2示例州 2 内有效物候区中的返青期平均变化趋势 3示例州 3 内有效物候区中的返青期

35、平均变化趋势 然后,找出各示例州内有效物候区像元,即同时位于各示例州和物候区内 的像元,并计算各示例州内有效物候区像元的平均线性变化趋势。将计算结果 写入文件,即可完成全部操作。 2.4.2idl 程程序序实实现现 利用 idl 程序可以实现上述分析内容,并将计算结果保存的到 csv 文件中。 具体代码如下: ;定义输入、输出文件名 trend_file=d:testgreenup_trend;各像元的线性变化趋势及显著性概率 phenoregion_file=d:dataphenoregion;物候区数据 state_file=d:datastate_class;三个示例州的栅格图 out_

36、file=d:teststa.csv ;创建输入变量,用来存储trend, phenoregion, state数据 ;通过查看各数据的头文件,获取相关信息 trend=fltarr(400,400) ;只存储第一波段(线性变化趋势) phenoregion=intarr(400,400) state=bytarr(400,400) ;创建输出变量,用来存储3个示例州的平均线性变化趋势 result=fltarr(2,3) result0,*=findgen(3)+1.0 ;第一列存储各个州的代码 ;读入数据 openr, in_lun1, trend_file, /get_lun readu

37、, 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) ;找出有

38、效像元 a=trendindex if count gt 0 then result1,i-1=mean(trendindex) endfor ;输出结果 write_csv, out_file, result 2.4.3idl 程程序序分分析析 上述程序中,主要用到的函数有 where 和 mean 以及命令 write_csv。下面对它们进行简单介绍,以方便程序理解。 (1). where:根据给定标准(数组或数组表达式)在一个数组中选择合适元素 的函数。返回值为一个矢量,矢量中的元素是根据给定标准(数组或数组 表达式)得到的非零元素的下标。矢量的长度为等于根据给定标准(数组 或数组表达式

39、)非零元素的个数。 用法如下: result = where( array_expression , count , complement=variable , /l64, ncomplement=variable ) 其中,result 为符合给定判断标准(array_expression)的非零元素的下标组 成的矢量。array_expression 为判断的标准(数组表达式)。count 为符合给 定判断标准(array_expression)的非零元素个数。complement 为不符合给定 判断标准(array_expression)的零元素个数。ncomplement 为不符合给定

40、判断 标准(array_expression)的零元素的下标组成的矢量。 (2). mean:计算一组数字型矢量的平均值的函数。 (3). write_csv:将数据写入.csv 文件中。 2.4.4结结果果显显示示 执行 2.4.2 中 idl 代码, 生成 sta.csv 文件,得到 3 个示例州内有效物候区 中的返青期平均变化趋势,见表 4。 表表 4 示例州内有效物候区中的返青期平均变化趋势示例州内有效物候区中的返青期平均变化趋势 示例州编号示例州编号有效物候区中返青期平均变化趋势有效物候区中返青期平均变化趋势 1-0.13067 2-0.03432 30.53688 2.5 制制图图

41、输输出出线线性性变变化化趋趋势势 2.5.1idl 的的颜颜色色运运用用 idl 的颜色由三种特殊值组成。我们称这些数值为一个三色组,将其写成 (r,g,b)即红、绿、蓝,其中红、绿、蓝代表红光、绿光、蓝光作用于该显示 颜色时的数量,每个值的范围都在 0 到 255 之间。这样,一种颜色可由 256 级 的红色,256 级绿色和 256 级蓝色组成。这就是说 idl 能显示 256*256*256, 或者说超过 167,000,000 种颜色。举例来说,黄色由亮红和亮绿组成,但没有蓝 色。代表黄色的三色组写作(255,255,0)。 idl 里有两种颜色模式索引颜色模式和 rgb 颜色模式。索

42、引颜色模式用于 8 位显示器,rgb 颜色模式用 24 位显示器。 使用索引号通过查颜色查询表(简称为颜色表)可以获得颜色的三色值。 一个颜色表由三列数组成,一列代表红色值,一列代表绿色值,一列代表蓝色 值。典型地,这些数列被称为矢量。当用 idl 装载颜色表时,所做的就是选 择正确的数值放进这些列或矢量之中。请看这个概念的图解(图 3)。 两种模式都能用一个颜色查找表来决定用于显示的特定颜色。(当颜色分 解关键字关闭时,rgb 颜色模式就用颜色查找表。否则,rgb 颜色模式就用 三色值直接指定颜色)。索引颜色模式将索引颜色号和颜色表中的特定位置联 系起来,而 rgb 颜色模式直接指定颜色。被

43、链接到特定颜色表某个位置的颜 色被称作动态颜色显示。直接显示的颜色常被称为静态颜色显示。在大多数情 况下(有例外),8 位显示是动态显示,24 位显示是静态显示。 图图 3 索引颜色模式索引颜色模式 颜色表可以由用户人为修改,颜色表控制函数有如下(表 5)几种。tvlct 命令用来设置或获取颜色表的内容; loadct 命令装载 idl 预定义过的 41 个 颜色表中的一个。这些颜色表的定义在resourcecolors 目录下 colors1.tbl 文件中。 xloadct 和 xpalette 两个命令,可以修改和创建颜色表。xloadct 允许用不同 的方法扩展颜色。xpalette

44、命令允许通过设置滚动条的端点色和插入干涉值来 修改和创造自己的颜色表。 表表 5 颜色表控制函数颜色表控制函数 名称名称功能功能 tvlct设置或获取颜色表的内容 loadct装载一个预定义过的颜色表 x loadct装载和调整预定义过的颜色表 xpalette定制颜色表 2.5.2idl 绘绘图图 (1). 直接图形法 直接图形法是 idl 的图像或图形直接绘制在用户指定的图形设备上,可在 很 短的时间内生长高质量的图形。执行内置直接图形程序,将会建立坐标系,创 建 轴和边界。组成直接图形系统的例行程序,如 plot、contour 及 surface 等等, 可以完成大部分关于图形输出的操

45、作。直接绘图程序一旦生成直接图形,结果 就会被输出到当前设备,并且删除掉所有相关数据。若要对已生成的直接图形 做出改动或是将结果输出到另外的设备,就必须要重新执行。 直接图形法对内存有默认的管理方法,占用内存少, 用户不必自己释放内 存,方便、简洁易用。 (2). 对象图形法 传统的开发方法开发的程序重用性、可修改性及可维护性都比较差,对象 法 是 idl5.0 引入面向对象编程概念后出现的,面向对象的基础也就是对象类的使 用。 对象类允许编程者将数据和方法封装成一个包,称之为对象。一个对象类 可以重复利用生成多个对象。 在 idl 的虚拟图形构架体系中有一套对象显示结构对象,而且提供了很多

46、的 对象图形原子,利用这些对象和对象图形原子之间可以进行互相的加载,相互 作 用形成显示对象, 灵活的运用这些图形原子就可以在视图中得到丰富多彩的图 形或图像,甚至可以制作三维的动画。 2.5.3线线性性变变化化趋趋势势图图 idl 程程序序实实现现 本例中,首先加载用户预先设定的颜色表,利用此表中的颜色显示线性变 化趋势制图。然后通过观察图像数据值的分布情况,确定图像最终拉伸范围, 并将背景值设为 255。之后通过 imap 或 iimage 方式显示图像。具体代码如下: ;创建颜色表ct ;ctload为用户自定义函数,加载颜色表24号到内存中,并将颜色表颜色反转,取其中10个颜 色赋值给

47、变量cl ctloadctload, 2424, /brewer, /reverse, ncolors=1010, rgb_table=cl ct=congridcongrid(cl, 256256,3 3, /center) ;调整数组大小 ct255255,*=210210 ;最后一列设为灰色,用于当做背景值 ;读入用于作图的数据 data=read_binaryread_binary(out_file, data_type=4 4, data_dims=400400,400400) ;查看图像数据值的分布,用于确定线性拉伸到0254的最小值和最大值。 index=wherewhere(d

48、ata ltlt 998.0998.0);选择非背景值的元素 hist=histogramhistogram(dataindex, locations=x) iplotiplot, x, hist, /histogram ;通过查看直方图,确定最小值为-2.5,最大值为2.5 ;将数据-2.52.5线性拉伸到0254 data1=bytsclbytscl(data, min=-2.52.5, max=2.52.5, top=254254) ;将背景值设为255 index1=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, /order 2.5.4idl 程程序序分分析析 上述程序中,主要用到用户自定义函数 ctload,函数 c

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论