ENVI与IDL二次开发教程.pdf
- 文档编号:18947999
- 上传时间:2024-09-13
- 格式:PDF
- 页数:94
- 大小:701.53KB
ENVI与IDL二次开发教程.pdf
《ENVI与IDL二次开发教程.pdf》由会员分享,可在线阅读,更多相关《ENVI与IDL二次开发教程.pdf(94页珍藏版)》请在冰点文库上搜索。
ENVI/IDL二次开发教程二次开发教程北京星图环宇科技有限公司王志成010-62054260-142主要内容主要内容IDL基础编写IDL程序ENVI/IDL二次开发介绍波段和波谱运算函数ENVI批处理模式用户函数ENVI提供的各种编程工具综合实例一、一、IDL基础基础IDL是进行数据分析、可视化及跨平台应用开发的最佳选择。
IDL集可视、交互分析、大型商业开发为一体,为您提供了最完善、最灵活最有效的开发环境。
IDL是美国RSI公司推出的面向矩阵的第四代计算机语言。
IDL语言的特性语言的特性高级图像处理能力高级图像处理能力交互式二维和三维图形技术交互式二维和三维图形技术面向对象的编程方式面向对象的编程方式OpenGL图形加速图形加速量化可视化表现量化可视化表现成数学与统计学算法成数学与统计学算法灵活的数据输入输出方式灵活的数据输入输出方式跨平台图形用户界面工具包跨平台图形用户界面工具包连接连接ODBC兼容数据库兼容数据库多种程序连接工具多种程序连接工具IDL的发展的发展在国外在国外IDL已经被列为大学的标准课程,其功能和应用效果完全可以替代如已经被列为大学的标准课程,其功能和应用效果完全可以替代如Matlab等其他同类科学计算应用软件。
等其他同类科学计算应用软件。
在国内在国内IDL要比国外稍微滞后,还处在推广和应用的初期。
许多科研单位和一些大学在与国外单位交流中,特别是一些留学归国人员,是要比国外稍微滞后,还处在推广和应用的初期。
许多科研单位和一些大学在与国外单位交流中,特别是一些留学归国人员,是IDL在国内应用的先行者和忠实用户。
在国内应用的先行者和忠实用户。
随着随着IDL应用和市场的广泛进入和从科研院所的高端应用到更广泛地民用化的接受过程,越来越多的人将了解和接受应用应用和市场的广泛进入和从科研院所的高端应用到更广泛地民用化的接受过程,越来越多的人将了解和接受应用IDL。
IDL程序示例:
程序示例:
Demo_tour本程序显示了本程序显示了IDL提供的丰富的提供的丰富的demo程序。
程序。
1.1、IDL变量变量变量定义变量定义变量在使用前,无需说明类型。
变量在使用前,无需说明类型。
变量的命名规则变量的命名规则变量名称必须以字母和下划线开头,可以包括字母、数字、下划线、美元符号变量名称必须以字母和下划线开头,可以包括字母、数字、下划线、美元符号正确:
正确:
reade6_$fileonly_8_bitComputerTypevariables_day_of_year错误:
错误:
name.lastthird%file4th_list$temp变量数据类型变量数据类型Byte字节型字节型Int有符号整数有符号整数Uint无符号整数无符号整数Long有符号长整型有符号长整型Ulong无符号长整型无符号长整型Long6464位长整型位长整型Float浮点型浮点型Double双精度浮点型双精度浮点型Complex复数复数Dcomplex双精度复数双精度复数String字符串字符串0-32767个字符个字符Struct结构结构Pointer指针指针Objref对象的引用对象的引用数据类型的转换数据类型的转换数据类型创建变量例子数据类型转换函数ByteVar=1BthisVar=Byte(variable)IntVar=1thisVar=Fix(variable)LongVar=1LthisVar=Long(variable)Long64Var=1LLthisVar=Long64(variable)UintVar=1UthisVar=Uint(variable)FloatVar=1.0thisVar=Float(variable)DoubleVar=1.0DthisVar=Double(variable)StringVar=thisVar=String(variable)PointerVar=ptr_new()ObjectVar=obj_new()1.2、IDL数组数组IDL数组运算简介数组运算简介IDL面向矩阵的特性保证数组运算时不用进行循环。
面向矩阵的特性保证数组运算时不用进行循环。
IDL中使用数组的两个最大优势体现在:
中使用数组的两个最大优势体现在:
(1)数组操作比循环操作快得多数组操作比循环操作快得多
(2)数组语法比相对的循环语法更加精练数组语法比相对的循环语法更加精练例子:
对数组元素求和例子:
对数组元素求和Npts=1000000LData=randomu(-1L,npts)Sum=total(data)IDL数组操作语句数组操作语句Sum=0.0Fori=0L,(npts-1L)dobeginsum=sum+datai循环语句循环语句数组的创建数组的创建
(1)利用利用创建。
创建。
(2)利用创建函数创建利用创建函数创建Bytebytarr()bindgen()Intintarr()indgen()longlonarr()lindgen()ulongulonarr()ulindgen()floatfltarr()findgen()doubledblarr()dindgen()stringstrarr()sindgen()make_arraymake_array(3,2,/byte)数组的存储格式数组的存储格式IDL中数组元素的存储是按列进行的。
按列存储的方式意味着连续的数组元素也将按顺序被存储,而且数组的第一维(列)变化的最快。
中数组元素的存储是按列进行的。
按列存储的方式意味着连续的数组元素也将按顺序被存储,而且数组的第一维(列)变化的最快。
数组的下标数组的下标数组的下标可以是标量也可以是矢量。
数组的下标可以是标量也可以是矢量。
进行下标操作时,如果下标超过了范围,则该下标被转换为在允许范围内的最小或最大的下标值。
进行下标操作时,如果下标超过了范围,则该下标被转换为在允许范围内的最小或最大的下标值。
1.3、表达式和运算法则、表达式和运算法则表达式的书写规则表达式的书写规则表达式结果的类型将由表达式右边变量的类型决定。
表达式结果的类型将由表达式右边变量的类型决定。
运算符运算符数学:
数学:
+-*/mod最大最大逻辑:
逻辑:
NotEqNeLeLtGeGtAndOrXor数组数组:
#数组乘数组乘(列乘行列乘行)#矩阵乘矩阵乘(行乘列行乘列)指针指针:
*运算符的优先级运算符的优先级()指针指针数组数组/mod+-Not逻辑逻辑1.4、数组运算、数组运算如果表达式中有一个变量是数组,结果也是数组如果表达式中有一个变量是数组,结果也是数组如果表达式左边是数组,右边是一个标量,则整个数组将被赋予该标量的值。
如果表达式左边是数组,右边是一个标量,则整个数组将被赋予该标量的值。
A=1,2,3,4B=3,4,5,6A+B,A*BA=10.0B=10.0,20.0,30.0,40.0A+B,A*B取大取大()、取小、取小(0a=2,4,6,7b=4,5,5,6print,ab关系运算符关系运算符eqneleltgegt返回一个数字结果,其中真值用返回一个数字结果,其中真值用1B表示,假用表示,假用0B表示。
表示。
关系运算符也可以作用于数组的自变量,如果两个自变量都是数组,那么关系运算符将依次作用于两个数组中每一对对应的元素。
关系运算符也可以作用于数组的自变量,如果两个自变量都是数组,那么关系运算符将依次作用于两个数组中每一对对应的元素。
a=1.0b=2.0help,agtbif(altb)thenprint,Truea=5b=bindgen(9)print,bc=bleaPrint,ca=2,4,6,8b=3,4,5,6print,agtb可以用于屏蔽数组中的某些值。
可以用于屏蔽数组中的某些值。
arr=indgen(9)mask=arrge5result=mask*arr1.5数组操作函数数组操作函数数组元素的数目数组元素的数目n_elements函数返回数组中所有元素的数目:
函数返回数组中所有元素的数目:
arr=findgen(32,32)print,n_elements(arr)数组的大小和类型数组的大小和类型size函数返回一个长整型的矢量结果,包含了输入数组的大小和类型信息。
可选关键字函数返回一个长整型的矢量结果,包含了输入数组的大小和类型信息。
可选关键字n_dimensions,dimensions,type,tname,n_elements分别返回维数、每维的大小、类型代码、类型名称和元素个数分别返回维数、每维的大小、类型代码、类型名称和元素个数arr=dist(256)help,arrprint,size(arr,/dimension)print,size(arr,/type)print,size(arr,/tname)print,size(arr,/n_elements)最大值和最小值最大值和最小值maxmin函数函数arr=dist(32)print,min(arr),max(arr)总和总和total函数返回数组元素的总和,也可以添加可选变量来计算特定维度的元素总和。
函数返回数组元素的总和,也可以添加可选变量来计算特定维度的元素总和。
total函数还可以使用可选的关键字函数还可以使用可选的关键字cumulative来计算累计的和。
来计算累计的和。
arr=indgen(3,3)print,total(arr)arr=indgen(9)print,total(arr,/cumulative)1.6数组中元素的定位数组中元素的定位查找符合条件的值查找符合条件的值where函数返回数组或数组表达式中非零元素的下标,使用函数返回数组或数组表达式中非零元素的下标,使用where函数和逻辑表达式可以查找符合条件的值。
函数和逻辑表达式可以查找符合条件的值。
where函数允许引入一个可选变量函数允许引入一个可选变量count来检查是否找到符合条件的值。
来检查是否找到符合条件的值。
使用使用where函数时,数组使用一维下标函数时,数组使用一维下标arr=indgen(9)*10index=where(arrgt35)print,arrindex1.7改变数组的维度和大小改变数组的维度和大小改变数组的大小改变数组的大小rebin()通过整数因子数组的大小通过整数因子数组的大小congrid()调整数组到任意大小调整数组到任意大小Arr=20,30,40resizeArr=rebin(arr,9,/sample)conArr=congrid(arr,9)conArr=congrid(arr,10)二、编写二、编写IDL程序程序2.1、定义和编译程序、定义和编译程序过程过程(pro)过程一般将几个相关的操作加到一个程序模块中。
过程一般将几个相关的操作加到一个程序模块中。
过程以过程以pro开头,开头,end结束结束函数函数(function)函数一般将一个操作加载到一个程序模块中,并返回结果函数一般将一个操作加载到一个程序模块中,并返回结果函数以函数以function开头,开头,end结束,并包括一个结束,并包括一个return语句返回结果语句返回结果命名和编译源文件命名和编译源文件命名一个命名一个IDL源文件的标志形式是在过程或函数名称后加上扩展名源文件的标志形式是在过程或函数名称后加上扩展名.pro过程和函数都可以通过过程和函数都可以通过.compile命令进行手动编译或是通过命令进行手动编译或是通过IDLIDE环境进行编译。
环境进行编译。
当需要时,过程和函数会在运行时自动编译,如果当需要时,过程和函数会在运行时自动编译,如果IDL调用的过程或函数之前未被编译过,则调用的过程或函数之前未被编译过,则IDL会搜索路径下所有的文件夹以搜索源文件的名称。
会搜索路径下所有的文件夹以搜索源文件的名称。
2.2控制语句控制语句If语句if条件then语句if条件thenbegin语句endifif条件then语句else语句if条件thenbegin语句endifelsebegin语句endelseCase语句语句case语句根据一个标量的表达式来选择某个语句或语句块运行。
语句根据一个标量的表达式来选择某个语句或语句块运行。
case表达式表达式of情况情况1:
情况情况2:
语句:
语句情况情况3:
begin语句语句endelse:
语句语句endcase当表达式和其中的某个情况匹配,相应的语句被执行,当表达式和其中的某个情况匹配,相应的语句被执行,case语句结束,如果没有匹配的情况,那么执行语句结束,如果没有匹配的情况,那么执行else下的语句,如果没有下的语句,如果没有else语句,将会发生错误,建议在语句,将会发生错误,建议在case语句中都加上语句中都加上elsetest_case.proFor语句语句for语句每次循环执行一个语句或语句块语句每次循环执行一个语句或语句块fori=v1,v2do语句语句fori=v1,v2incdo语句语句fori=v1,v2incdobegin语句语句endfor默认条件下增量为默认条件下增量为1,也可以设定增量,也可以设定增量While语句语句当特定的条件为真,当特定的条件为真,while语句执行单个语句或语句块语句执行单个语句或语句块while条件条件do语句语句while条件条件dobegin语句语句endwhileTest_for.proReturn语句语句return语句在当前程序单元中产生一个即时出口,并返回控制。
语句在当前程序单元中产生一个即时出口,并返回控制。
return,结果结果returnBreak语句语句break语句用来中断循环的执行语句用来中断循环的执行breakContinue语句语句continue语句终止本次循环的执行,执行下次循环语句终止本次循环的执行,执行下次循环continueTest_return.proTest_break.proTest_continue.pro2.3参数和关键字参数和关键字参数参数参数用来将变量和表达式传递到过程或函数中。
参数有时也被称为位置参数,因为它们在自变量中的位置决定了它们在调用的过程或函数中如何被使用。
参数通常作为输入参数用来将变量和表达式传递到过程或函数中。
参数有时也被称为位置参数,因为它们在自变量中的位置决定了它们在调用的过程或函数中如何被使用。
参数通常作为输入/输出自变量,因为这些自变量在过程或函数中不可缺少。
输出自变量,因为这些自变量在过程或函数中不可缺少。
关键字关键字关键字为可选自变量或表达式,它可以传递给调用程序,但不是强制性的。
输入关键字可以用来指定一个自变量,或者用来设置一个布尔标识。
关键字为可选自变量或表达式,它可以传递给调用程序,但不是强制性的。
输入关键字可以用来指定一个自变量,或者用来设置一个布尔标识。
使用参数和关键字使用参数和关键字在传递给过程或函数之前,输入的参数必须先定义。
一个合理的过程或函数,都必须先检测其中任何的强制性输入自变量是否已经定义,然后在进行其他操作。
在传递给过程或函数之前,输入的参数必须先定义。
一个合理的过程或函数,都必须先检测其中任何的强制性输入自变量是否已经定义,然后在进行其他操作。
输出位置参数和关键字通常在过程或函数中创建,因此不需要在调用过程或函数时定义。
输出位置参数和关键字通常在过程或函数中创建,因此不需要在调用过程或函数时定义。
检测参数和关键字检测参数和关键字n_params()返回传递的参数数目返回传递的参数数目n_elements()返回一个变量中元素的数目返回一个变量中元素的数目(零表示未定义零表示未定义)size()返回一个变量的类型和大小信息返回一个变量的类型和大小信息keyword_set用于检测布尔关键字,如果自变量定义则返回为真用于检测布尔关键字,如果自变量定义则返回为真Eplot.pro2.4全局变量全局变量只读的系统变量只读的系统变量保存了当前保存了当前IDL时间段的信息。
时间段的信息。
!
d.name当前图像设备的名称当前图像设备的名称!
d.window当前图形窗口的索引当前图形窗口的索引!
d.table_size当前颜色表的大小当前颜色表的大小可写的系统变量可写的系统变量可写的系统变量可以用来调整可写的系统变量可以用来调整IDL的默认设置。
如果用户改变了可写系统变量的值,那么这种改变在所有层次上都是有效的。
的默认设置。
如果用户改变了可写系统变量的值,那么这种改变在所有层次上都是有效的。
!
p.multi设置多面板成图设置多面板成图!
p.font为图形中的字符选择默认字体为图形中的字符选择默认字体!
order控制图像显示顺序控制图像显示顺序三、三、ENVI/IDL二次开发介绍二次开发介绍3.1如何进行如何进行ENVI的扩展的扩展ENVI的扩展的扩展ENVI是使用是使用IDL语言编写的优秀的遥感影像处理平台。
在语言编写的优秀的遥感影像处理平台。
在ENVI中,用户可以很方便的通过中,用户可以很方便的通过IDL语言以及语言以及ENVI提供的二次开发工具对提供的二次开发工具对ENVI的功能进行增强,添加新的功能函数。
的功能进行增强,添加新的功能函数。
通常通常ENVI的扩展,包括波段和光谱算术函数,自定义的空间,光谱,或是感兴趣区域(的扩展,包括波段和光谱算术函数,自定义的空间,光谱,或是感兴趣区域(ROI)的处理,用户函数,自定义文件输入程序,批处理,以及其它的报告和绘图工具。
一系列)的处理,用户函数,自定义文件输入程序,批处理,以及其它的报告和绘图工具。
一系列ENVI程序能够为程序员使用,将能够极大地简化用户定制程序的开发,并保持和程序能够为程序员使用,将能够极大地简化用户定制程序的开发,并保持和ENVI一样的外观。
一样的外观。
波段和波谱运算函数波段和波谱运算函数对于用户来说,扩展对于用户来说,扩展ENVI功能的最简单方法就是使用波段和波谱运算函数。
波段运算和波谱运算是功能的最简单方法就是使用波段和波谱运算函数。
波段运算和波谱运算是ENVI提供的两个功能,它们使得用户能够对波段或是波谱进行数学运算,或是使用用户编写的运算函数进行运算。
波段和波谱运算函数,不需要处理文件提供的两个功能,它们使得用户能够对波段或是波谱进行数学运算,或是使用用户编写的运算函数进行运算。
波段和波谱运算函数,不需要处理文件I/O,不需要进行事件控制,不需修改菜单,用户只需编写运算函数部分内容,其它由不需要进行事件控制,不需修改菜单,用户只需编写运算函数部分内容,其它由ENVI进行管理。
进行管理。
ENVI功能扩展功能扩展?
使用IDL编写代码,实现功能?
将自定义功能添加到ENVI菜单中,与ENVI系统无缝集成自定义去除双眼皮功能用户函数用户函数用户函数可以用用户函数可以用IDL、C、Fortran或者其它的高级语言编写,并集成到或者其它的高级语言编写,并集成到ENVI软件中,通过软件中,通过ENVI的菜单来执行。
用户函数可以通过的菜单来执行。
用户函数可以通过ENVI获得输入数据,并将结果直接输入到获得输入数据,并将结果直接输入到ENVI中。
中。
用户函数包括了部件的定义,事件的处理,以及处理程序。
用户函数和用户函数包括了部件的定义,事件的处理,以及处理程序。
用户函数和ENVI菜单的一个按钮联系起来,并像菜单的一个按钮联系起来,并像ENVI的其它函数一样执行。
的其它函数一样执行。
ENVI批处理模式批处理模式在批处理模式下,在批处理模式下,ENVI的非交互函数,可以通过用的非交互函数,可以通过用ENVI_DOIT函数来实现。
函数来实现。
ENVI_DOIT函数提供了处理部分,而不需用户交互就能够运行。
批处理模式可以通过菜单事件或是函数提供了处理部分,而不需用户交互就能够运行。
批处理模式可以通过菜单事件或是ENVI非交互模式来开始。
非交互模式来开始。
无用户交互下的复杂程序的控制无用户交互下的复杂程序的控制传统的传统的ENVI处理程序需要大量的用户交互来获取处理所必需的信息。
因此在编写无用户交互程序时,用户必须确定处理程序需要大量的用户交互来获取处理所必需的信息。
因此在编写无用户交互程序时,用户必须确定ENVI处理函数所必须的参数,处理函数所必须的参数,ENVI函数要比传统的函数要比传统的IDL程序拥有更多的参数。
程序拥有更多的参数。
3.2ENVI下编写程序的特点下编写程序的特点ENVI下的文件下的文件I/O和和IDL下下I/O区别区别在在IDL中,文件中,文件I/O需要获得该文件的逻辑单元号(需要获得该文件的逻辑单元号(LUN),并使用文件读写程序如,),并使用文件读写程序如,OPENR、READU、OPENW以及以及WRITEU等对文件进行读写。
等对文件进行读写。
在在ENVI程序中的所有文件程序中的所有文件I/O都是由都是由ENVI进行内部控制的,因此进行内部控制的,因此ENVI的程序员就没有必要获取的程序员就没有必要获取LUN。
相反,所有需要输入文件的。
相反,所有需要输入文件的ENVI程序要确定一个特定的文件程序要确定一个特定的文件ID,FID。
FID基本上类似数据文件的指针,但它不是基本上类似数据文件的指针,但它不是LUN。
当一个文件需要被访问,。
当一个文件需要被访问,ENVI内部获得该文件的内部获得该文件的LUN,读写需求的数据,然后释放,读写需求的数据,然后释放LUN。
这样。
这样ENVI无需使用或保存任何无需使用或保存任何LUN。
与使用与使用OPENR打开文件相反,打开文件相反,ENVI提供了几种不同的程序函数来打开文件。
当文件被打开时,这些函数都会返回一个文件提供了几种不同的程序函数来打开文件。
当文件被打开时,这些函数都会返回一个文件FID。
3.3ENVI程序中的通用关键字程序中的通用关键字FIDFID是一个长整型的标量。
是一个长整型的标量。
FID为为ENVI的程序员提供了一个命名变量,可以用于一个或几个的程序员提供了一个命名变量,可以用于一个或几个ENVI程序,来打开或选择文件。
所有对该文件进行操作的程序,来打开或选择文件。
所有对该文件进行操作的ENVI程序都是通过程序都是通过FID完成。
完成。
需要注意的是,需要注意的是,FID和和LUN是不同的。
如果文件打开失败,则是不同的。
如果文件打开失败,则FID返回为返回为-1R_FID和和M_FIDENVI处理程序产生结果一幅新图像也包括一个处理程序产生结果一幅新图像也包括一个R_FID,或者称为返回或者称为返回FID关键字。
如果结果是存在内存中的,设置关键字。
如果结果是存在内存中的,设置R_FID关键字是访问数据的唯一方法。
关键字是访问数据的唯一方法。
运行进行掩模的处理程序还包括一个运行进行掩模的处理程序还包括一个M_FID,或者称为掩模关键字用于确定用作掩模波段的文件。
,或者称为掩模关键字用于确定用作掩模波段的文件。
DIMSDIMS关键字是一个关键字是一个5个元素长整型数组。
它定义了处理数据的空间子集。
当需要确定个元素长整型数组。
它定义了处理数据的空间子集。
当需要确定FID的时候,你必须同时确定该文件的空间范围。
的时候,你必须同时确定该文件的空间范围。
DIMS0存储一个打开的存储一个打开的ROI区域的指针,仅在区域的指针,仅在ROI被定义的时候使用,其它时候设为被定义的时候使用,其它时候设为-1LDIMS1采样的起始位置采样的起始位置SamplestartDIMS2采样的终止位置采样的终止位置SampleendDIMS3行的起始位置行的起始位置LinestartDIMS4行的结束位置行的结束位置LineendPOSPOS关键字定义了用于处理的波段位置,是一个变长的长整型数组。
波段从关键字定义了用于处理的波段位置,是一个变长的长整型数组。
波段从0开始,例如,要处理第三波段和第四波段,开始,例如,要处理第三波段和第四波段,POS=2,33.4常用常用ENVI
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- ENVI IDL 二次开发 教程