您好,欢迎访问三七文档
当前位置:首页 > 机械/制造/汽车 > 机械/模具设计 > ENVI与IDL二次开发教程
ENVI/IDL二次开发教程北京星图环宇科技有限公司王志成zcwang@imagetekinfo.com010-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_$file•only_8_bit•ComputerType•variables•_day_of_year错误:•name.last•third%file•4th_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+data[i]循环语句•数组的创建(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,4]B=[3,4,5,6]A+B,A*BA=10.0B=[10.0,20.0,30.0,40.0]A+B,A*B•取大()、取小()操作分别返回自变量的昀大值和昀小值当自变量为数组时,取大、取小运算符将对数组对应的每一对元素依次操作。arr=[0,1,2,-9,5,6,-8,7,8]print,arr0a=[2,4,6,7]b=[4,5,5,6]print,ab•关系运算符eqneleltgegt返回一个数字结果,其中真值用‘1B’表示,假用’0B’表示。关系运算符也可以作用于数组的自变量,如果两个自变量都是数组,那么关系运算符将依次作用于两个数组中每一对对应的元素。a=1.0b=2.0help,agtbif(altb)thenprint,’True’a=5b=bindgen(9)print,bc=bleaPrint,ca=[2,4,6,8]b=[3,4,5,6]print,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,arr[index]1.7改变数组的维度和大小•改变数组的大小rebin()通过整数因子数组的大小congrid()调整数组到任意大小Arr=[20,30,40]resizeArr=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语句endelse•Case语句case语句根据一个标量的表达式来选择某个语句或语句块运行。case表达式of情况1:情况2:语句情况3:begin语句endelse:语句endcase当表达式和其中的某个情况匹配,相应的语句被执行,case语句结束,如果没有匹配的情况,那么执行else下的语句,如果没有else语句,将会发生错误,建议在case语句中都加上elsetest_case.pro•For语句for语句每次循环执行一个语句或语句块fori=v1,v2do语句fori=v1,v2incdo语句fori=v1,v2incdobegin语句endfor默认条件下增量为1,也可以设定增量•While语句当特定的条件为真,while语句执行单个语句或语句块while条件do语句while条件dobegin语句endwhileTest_for.pro•Return语句return语句在当前程序单元中产生一个即时出口,并返回控制。return,结果return•Break语句break语句用来中断循环的执行break•Continue语句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语言以及ENV
本文标题:ENVI与IDL二次开发教程
链接地址:https://www.777doc.com/doc-4519455 .html