井管价格:envi二次开发中批处理的运算函数-envi

来源:百度文库 编辑:偶看新闻 时间:2024/04/29 23:42:25
envi二次开发中批处理的运算函数-envi_doit
(2011-06-09 20:03:08)转载
标签: 杂谈
分类: ENVI/IDL学习
在envi二次开发时,当文件的fid被读入以后,我们需要对其进行处理,那么该如何操作呢?
下面的例子是一个批处理的例子,
其实批处理和正常模式下没有什么区别,只是通过一系列特定的函数库来执行ENVI的功能。
为了使用这些函数,必须首先将它们恢复到IDL内存中。
ENVI始终是一个IDL程序,如果用户使用运行ENVI的IDL时段,用户将能够访问所有ENVI程序和函数。
这种状态通常称为混合批处理模式,因为用户能够使用ENVI特有的库函数而无需初始化批处理模式.这种状况既带来了便利,也带来了问题。举例来说,如果用户在IDL命令行下运行的程序产生了新的影像波段,能够通过ENVI_ENTER_DATA直接将这些数据输入到可用波段列表中。但如果IDL程序崩溃,那么当前的ENVI环境将会整个崩溃。在编写ENVI用户函数的时候混合批处理模式非常有用,因为它模拟了代码执行的最终环境。但是在真正运行批处理程序时,推荐用户开启一个单独的IDL时段,并进行批处理的初始化
在批处理模式下运行ENVI需要先恢复核心的save文件,而后,一个称为ENVI_BATCH_INIT的特定ENVI函数被调用,该函数开启批处理模式。该步处理称为初始化批处理。ENVI_BATCH_EXIT退出批处理的方式和通过ENVI主菜单上选择File-> Exit退出ENVI的效果一样。同样,使用该命令退出ENVI后,ENVI时段使用的License也被释放。
如果ENVI中已经有了您想要实现的功能,为什么不使用它呢?
当然为了获取envi的这些库函数,运行程序的IDL时段必须在批处理模式下(试验发现,也可以不用),但是最好使用
如果运行程序在envi时段,则不必要在批处理模式下(批处理最好不要在envi时段运行)
结论,envi的库函数在任何条件下都可以调用,但是在批处理模式下和非批处理模式下,调用的方式不一样
如果在批处理模式在,那么调用的时候需要采用envi_doit, 'envi_stats_doit'
在非处理模式下,调用的时候直接采用envi_stats_doit
当在idl时段时,系统不认envi_pickfile(),如果打算采用该函数获取文件的话,需要首先envi, /restore_base_save_files
但是有的时候也可以(不稳定)
pro example_envi_doit
cd,'d:\test
;
; First restore all the base save files.
;
envi, /restore_base_save_files
;在批处理模式下运行ENVI需要先恢复核心的save文件
;如果不设置restore_base_save_files关键字,则会启动envi
;
; Initialize ENVI and send all errors
; and warnings to the file batch.txt
;
envi_batch_init, log_file='batch.txt'
;
; Open the input file
;
envi_open_file, 'huaihe.img', r_fid=fid
if (fid eq -1) then begin
envi_batch_exit
return
endif
;
; Get the dimensions and # bands
; for the input file.
;
envi_file_query, fid, dims=dims, nb=nb
;
; Set the pos to calculate
; statistics for all spectral data in the file.
;
pos  = lindgen(nb)
;
; Calculate the basic statistics and the
; histogram for the input data file. Print
; out the calculated information.
;
envi_doit, 'envi_stats_doit', fid=fid, pos=pos,  dims=dims, comp_flag=1, mean=mean
;
print, 'Mean' , mean
;
; Exit ENVI
;
envi_batch_exit
end
在批处理模式下,envi提供的功能函数可以通过envi_doit函数来实现,该函数提供类似于用户函数的处理部分,但不需要用户交互
ENVI_DOIT, 'Routine_Name' [, /NO_CATCH] [, /NO_REALIZE]
'Routine_Name' 是envi中内部的处理函数,具体每个函数的定义和使用请参考ENVI Reference Guide.
如对文件信息进行统计的话,采用'envi_stats_doit'
envi_doit, 'envi_stats_doit', fid=fid, pos=pos, dims=dims, comp_flag=1, mean=mean
对RGB影像进行2%线性拉伸'STRETCH_DOIT’