




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、1前言envi (the environment for visualizing images) 遥感影像处置软件是美国itt公司推出的基于交互式数据语言idl 开发的一套功能壮大的遥感影像处置系统,envi 能够轻松的读取、 显示、分析各类类型的遥感数据并提供了从影像预处置、信息提取到与地理信息系统整合的完整处置流程。但对一些特殊需求, 如添加未知格式数据支持、 处置流程定制等可能都需要二次开发的模式。 envi 比较方便的进行二次开发,这是由于其底层壮大的idl语言支持,多种开发方式支持及200多个功能函数接口等因素决定的。2envi 二次开发的层次envi 的二次开发包括三个层次,env
2、i 的功能扩展、独立系统开发和其他语言集成开发。envi 的功能扩展是利用envi 的现有功能及底层idl 语言壮大的运算能力实现的功能模块的定制开发,在现有 envi 的主框架上扩展功能模块, 添加自系统功能补丁等方式。独立系统开发是在非交互式envi 环境下 (如 idl 构建系统框架), 利用 envi提供的函数接话柄现数据处置功能。其他语言集成开发指的是在其他语言如vc+、 visual 下挪用 envi 的功能。2.1 功能扩展2.1.1 波段、波谱运算与自概念功能扩展 envi 的功能最简单的方式确实是利用波段和波谱运算功能,通过该方式用户能够在波段和波谱运算表达式对话框输入运算函
3、数进行交互运算。波段、波谱运算功能的实现有两种方式:数学表达式和波段、 波谱运算函数。数学表达式:该方式充分利用idl 的数组处置能力,通过简单表达式输入方式实现复杂的功能。实例:两图像的波段b1 和 b2,波段 b1 中的云部份(以为象元值大于200为云)用波段 b2 的部份替代。实现的步骤1) 在 envi 主菜单下,选择basic toolsband math, 在弹出的 bandmath界面中,在 enter an expresion里面输入表达式2) 点击 add to list 按钮,然后在 previous band math expressions里面选择输入的表达式点击ok。
4、3) 在弹出的界面当选择表达式中变量赋需要计算的波段。波段、波谱运算函数编写波段运算函数跟数学表达式相较,在操作上更灵活, 函数中能够添加更多的操纵,如运算中的错误检测等。函数的编写超级简单,同意输入波段,处置数据,并返回结果。实例:以编写( b1+b2)/ (b1-b2)功能为例,步骤如下1) 编写函数并保留; 函数定义为两个输入波段b1和b2以及一个 check 关键字functionbm_ratio ,b1,b2,check=check ; 计算差值 den= float (b1)-b2 ; 如设置 check 关键字,检查被0除问题if (keyword_set(check) then
5、 ptr=where (den eq 0. ,count) $ else count= 0if (count gt 0) then den ptr= ; 继续计算比率结果 result=(float (b1)+b2)/den if (count gt 0) then resultptr= ; 返回结果return ,result end2) 加载函数加载函数的方式有两种。注意的是不同的文件需要注意下利用环境,假设是 sav文件,启动 envi 或 envi+idl都可,但假设是 pro 文件,必需要启动 envi+idl 。(1)直接编译文件,在envi 的主菜单下,选择 file compi
6、le idl module,选择 pro 或 sav文件进行编译;(2)把或 sav文件放入 envi 安装目录下的 . envi46save_add下,重启 envi 。3) 执行函数在 envi 主菜单下,选择 basic toolsband math,在弹出的 bandmath界面中,在 enter an expresion里面输入函数挪用点击 ok 执行。2.1.2 用户自概念功能用户自概念功能许诺用户为envi 添加新功能并通过envi 菜单进行访问。当用户通过菜单项选择择该函数对应的菜单项时,将会执行这些函数,就犹如envi 本身自带的功能一样。 分为两个步骤, 一是编写功能代码,
7、 二是修改菜单。1) 编写功能代码用户函数能够是pro 或 sav,如是 pro 那么与一般的 idl 程序无任何区别, 用户函数必需放入到envi 安装目录下的 save_add目录中, 在 envi启动时用户函数能够被自动编译或恢复。用户函数pro 代码能够随时进行修改, envi 只需从头编译函数而不需要重启。2) menu 文件修改envi 的菜单文件在系统中途径为ittidlxxproductsenvixxmenu ,利用记事本就能够打开。文件顶部有些介绍的注释文本,然后确实是文件的结构:前面以 ;开头的是注释文本,后面是菜单概念。菜单概念每一行开始的数据概念了菜单项的层次。0 表示
8、最顶层, 1 表示一级子菜单, 2 表示二级子菜单,如此类推。以 1级菜单为例说下内容概念:open image file概念了显示在菜单上的内容。open envi file 概念了为菜单项所赋给的用户值,在处置多个菜单项时有效。envi_menu_event概念了菜单项事件处置程序的名称。修改保留该文件然后重启envi 即可。3) 函数修改envi 提供函数 envi_define_menu_button来实现菜单的程序添加。用法如下:功能函数名称为my_function,event,成立一进程pro my_function_define_buttons, buttoninfo,添加工作在
9、那个进程中完成。envi_define_menu_button的挪用格式如下:envi_define_menu_button, buttoninfo , /, = string, /, =string, =long integer or string , = long integer , = variable , =string , =0 | 1 | -1 , /, =string关键字说明:display-是创建在主菜单仍是显示菜单;value - 菜单的显示信息;uvalue 菜单的 uvalue event_pro-程序事件名称;menu- 是不是为菜单ref_index- 若 ref_
10、value 不唯一那么可用此来设置;ref_value - 已存在菜单名;sibling - 是不是创建同级菜单。4) 实例编写 landsat-7 etm+的单影像去条带补丁背景: 由于 landsat-7 etm+机载扫描行校正器 (slc) 故障致使 2003 年 5 月 31 日以后获取的图像显现了数据条带丢失,见以下图。严峻阻碍了landsat etm 遥感影像的利用。针对该现象,实现一个对该传感器进行去条带的补丁。分析:由于数据中包括有同名的掩膜文件,该掩膜文件可将条带完全覆盖。基于此那么程序实现的时候只需依照掩膜文件进行判定即可,而无需再依照数据值进行。条带部份数据的填充方式采取
11、条带两边数据线性插值,尽管有些地址数据有些失真,该方式是速度比较快的容易实现方式。代码编写:依照前面的分析,代码函数名及功能如下。tm_destripe:主函数,数据的读取、挪用条带去除功能及存储;tm_destripe_define_buttons :创建 envi 主菜单按钮;stripfill :条带数据的赋值填充;pro tm_destripe, event ;读取掩膜数据maskdata= float(envi_get_data(fid= m_fid,dims= dims,pos = 0) ;波段循环for bandidx =0,n_elements(pos)-1 do begin
12、;读取原数据oridata = float(envi_get_data(fid= fid,dims= dims,pos = posbandidx) resdata = oridata ;列循环for i=0, ns-1 do begin envi_report_sta t, reportbase, bandidx*(ns+1)+i, n_elements(pos)*(ns+1), cancel=cancel if cancel eq 1 then break ;获取 0 索引部分zeroidx = where(maskdatai,* eq 0) ;处理resdatai,* = stripfil
13、l (oridatai,*, zeroidx,ns) endfor ;进度条end;添加菜单pro tm_destripe_define_buttons, buttoninfo envi_define_menu_button, buttoninfo, value = landsat-7 etm+ destripe, $ uvalue=landsat-7 etm+ destripe(改进 ), event_pro=tm_destripe, $ ref_value = destripe, $ position = after endfunction stripfill,data, zeroidx,
14、nlength num = n_elements(zeroidx) ;返回结果数据rdata = data startidx = 0 for i=0,num-2 do begin ;当不等于1 的时候if (zeroidxi+1 - zeroidxi) gt 1 then begin endidx = i if startidx ne 0 then begin ;两方向存在数据if zeroidxendidx ne nlength-1 then begin sdata = datazeroidxstartidx-1*1. edata = datazeroidxendidx+1*1. index
15、 = findgen(zeroidxendidx+1-zeroidxstartidx+1+1)0)/(zeroidxendidx+1-zeroidxstartidx+1+1)0 ;格网式插值并平滑rdatazeroidxstartidx-1:zeroidxendidx+1 =smooth(interpolate(sdata,edata,index, /grid),2) endif endif startidx =i+1 endif endfor return,rdata end程序运行将 pro或生成的 sav放在save_add 目录下, 重启 envi+idl 或envi , 在basic
16、 toolspreprocessing general purpose utilities 下会自显现 landsat-7 etm+ destripe 功能菜单,如图。处置后结果对条带数据进行处置后,关联显示后可发觉,条带去除成效很明显。2.2系统开发系统开发模式是离开envi 主界面的程序运行方式, 充分利用了 idl 语言的快速、简单等特点,能够轻松、方便的实现批处置数据转换等功能。系统开发模式与 envi 下的利用不同,需要进行该模式的初始化,在系统关闭时需要对模式进行关闭。 实现起来比较简单, 初始化和关闭就下面函数中的几行代码。;初始化 envi 系统开发模式envi,/restor
17、e_base_save_files envi_batch_init,log_file= ;关闭 envi 批处理模式envi_batch_exit实例:批量将多个多波段数据的3、二、 1 波段存为三通道的tif 文件,假设数据波段少于三那么全数存储。分析:实现如此的功能批处置模式最符合要求,因需求中波段固定3、二、1,故读取数据和存储tif 文件函数都可挪用envi 的函数来实现。代码编写:分两部份,一是界面构建与交互处置,二是数据的存储功能。界脸部份:tlb = widget_base(mbar= mbar, $ /column , $ title = 批处理转换为tiff, $ space
18、 = 0 , xpad = 0, ypad = 0 , $ /tlb_kill_request_events, $ tlb_frame_attr = 1, map = 0) ;创建菜单fmenu = widget_button(mbar, value =文件 ,/menu) fexit = widget_button(fmenu, value = 退出 , $ uname = exit,/sep) hmenu = widget_button(mbar, value =帮助 ,/menu) hhelp = widget_button(hmenu, value = 关于 , $ uname = a
19、bout,/sep) ;上面的输入base winputbase = widget_base(tlb, $ xsize =sz0, /column) ;下面的输出base woutputbase = widget_base(tlb, $ /row,xsize =sz0) ;中间的参数base wsetbase = widget_base(tlb, $ xsize =sz0, /row) wbutton = widget_button(winputbase,value =打开数据文件, $ uname = open) wlist = widget_list(winputbase, $ ysize
20、 = sz1/(2*15),$ xsize = sz0/8) ; values = 源文件路径 , $ 另选择路径 bgroup = cw_bgroup(woutputbase, values, $ /row, /exclusive, $ ;label_top= 输出路径 , $ /no_release, set_value=1, $ uname = filepathsele, $ /frame) outpath = widget_text(woutputbase, $ value = , $ xsize =35, $ /editable, $ uname = outroot) wsele =
21、 widget_button(woutputbase, $ value =选择路径 , $ uname =selepath) wbutton = widget_button(wsetbase,$ value =存为 tiff, $ uname = tiff)功能部份代码;文件信息envi_file_query , fid, dims=dims, nb=nb,bnames = bnames ; 如果波段小于3 个if nb le 3 then begin bandlist = indgen(nb) endif else begin bandlist = 3,2,1 ; endelse ;存储 t
22、iff 文件envi_output_to_external_format,fid = fid,$ dims = dims, out_name=out_name,pos = bandlist, $ out_bname=bnamesbandlist,/tiff运行主界面2.3 集成开发集成开发指的是在其他语言如vc+、visual 下挪用 envi 的功能。这种开发实现的方式跟idl 的集成开发一致, 只是在功能方式编写的时候采纳的envi的系统开发的形式,能够通过下面几种方式进行。callable 技术envi/idl函数能够作为动态链接库被外部程序挪用启动,称之为callable idl 技术
23、。利用 callable idl 技术,外部程序能够像在idl 环境中一样执行idl 的代码。下面以 visual c+ 为例,实现挪用envi 或 idl 函数的要紧步骤:1.成立 vc 的 mfc 工程,添加 ittidl70externalinclude的头文件;2.工程 设置 连接中的对象/库模块中添加;3.工具 选项 目录中的library files 添加 idl 的安装途径;4.我的电脑右键属性 高级 环境变量系统变量path 中添加idl的安装途径;5.idl 初始化执行代码“ idl_win32init(0,handle,null,0)”;6.执行 idl 的命令语句用“ i
24、dl_executestr(“ * ” ) ”;7.退出时清除idl 挪用命令: “ idl_cleanup(true)”。idldrawwidget 跟 callable 技术类似, idldrawwidget技术,能够将envi/idl函数作为com 组件被外部程序挪用启动。以c#为例,该方式挪用envi/idl函数的步骤:1.成立一个windows 应用程序;2.在工具箱上右键选择项 com 组件选中 idldrawwidget control 并拖动控件到窗体上;3.设定 idl 库文件目录;4.初始化 idl 控件: n = (int) ;5. ( “ * ”);执行 idl 命令。
25、对象导出利用对象导出向导能够将envi 或 idl 的功能添加到其他应用软件中,该种模式能够很容易地将envi 或 idl 对象输出到java 和 com 环境,进而直接缩短接口开发时刻。能够导出 envi 或 idl 的 pro 文件或 sav 文件, java 和 com 的实现步骤大体类似。导出 java 对象1在导出对象概念的进程后加_ define(以类的形式 );2在 idl 命令行中输入idlexbr_assistant 回车打开对象输出向导;3file new project java选择要输出的* 或*文件加载进输出向导;4设置对象要输出的进程、函数及其参数;5保留工程fil
26、e save project;6编译输出对象build build object ;7生成 *.java 和*.class 文件。导出 com 组件1在导出对象概念的进程后加_ define(以类的形式 );2我 的电脑右键属性 高级 环境变量 系统 变量path 中 添加: c:program filesmicrosoft visual studio 8common7ide;3在 idl 命令行中输入idlexbr_assistant 回车打开对象输出助手;4file new project com 选择要输出的*或*文件加载进输出向导;5设置对象要输出的进程、函数及其参数;6保留工程fil
27、e save project;7编译输出对象build build object ;8生成 *.dll 和*.tlb 文件 (或*.ocx 和*.tlb) ;9在运行顶用regsvr32 对 dll(ocx)注册。实例:以 com 组件的方式实现 2005 下 envi 非监督分类方式的功能挪用。第一编写 idl 代码实现非监督分类的方式代码; iso mean 分类算法function usingenvi:iso, inputfile,out_name compile_opt idl2 envi_open_file , inputfile, r_fid=fid if (fid eq - 1)
28、 thenbegin self-quitreturn , 0endifenvi_file_query , fid, dims=dims, nb=nb pos = lindgen (nb) envi_doit, class_doit , $ dims=dims, $ fid=fid, $ method= 4, $ ;| isodata (unsupervised) out_name=out_name, $ pos=pos, $ ; iterations=1, $ ; 迭代次数 change_thresh=, $ ; iso_merge_dist= 5, $ iso_merge_pairs= 2,
29、 $ iso_min_pixels=1, $ iso_split_std=iso_split_std, $ ; 此参数不必须 min_classes= 5, $ num_classes=10return , 1end; k-meanfunction usingenvi:kmean, inputfile,out_name compile_opt idl2 envi_open_file , inputfile, r_fid=fidif (fid eq - 1) thenbegin self-quitreturn , 0endif; get the spatial dimensions and #
30、of bands; for the input file.;envi_file_query , fid, dims=dims, nb=nb ; set the pos to classify all; data (spectrally) in the file. ; pos = lindgen (nb) envi_doit, class_doit , $ dims=dims, $ fid=fid, $ method= 7, $ ;| k-means (unsupervised) out_name=out_name, $ pos=pos, $ ; iterations=1, $ ; 迭代次数 change_thresh=, $ ; num_classes=5return , 1end; initialize envi and send all errorsfunction usingenvi:startenvi envi, /restore_base_save_files ;envi_batch_init, log_file=return , 1end; exit envi
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 国际贸易买卖合同模板
- 采购合同协议样本
- 机械租赁安全规范合同版
- 供热服务保障合同
- 工厂购销合同范本
- 城市户外广告投放工程合同
- 塔吊设备供应合同
- 采购与供应合同协议书范本
- 长期仓库租赁合同模板
- 宠物猫咪领养及养护合同2025
- 标准化机房改造方案
- 珠海市第三人民医院中医智能临床辅助诊疗系统建设方案
- 早产临床诊断与治疗指南
- 工程签证单完整版
- 《义务教育数学课程标准(2022年版)》初中内容解读
- 2025届高三化学一轮复习 原电池 化学电源(第一课时)课件
- 全院护理查房(食管裂孔疝)
- 川教版信息技术六年级下册全册教案【新教材】
- 2024-2025学年统编版语文九年级下册第7课《溜索》任务驱动型教学设计
- (国赛)5G组网与运维赛项备考试题库及答案
- 代写文章合同模板
评论
0/150
提交评论