
2010-10-28 22:11:19| 分类: 个人日记 |举报|字号 订阅
原文地址:如何应用IDL批处理图像大小 ———裁剪作者:mloyj
;This Function will Return the Start path
Function SourcePath
On_Error, 2
Help, Calls = Calls
UpperRoutine = (StrTok(Calls[1], ' ', /Extract))[0]
Skip = 0
Catch, ErrorNumber
If (ErrorNumber ne 0) then Begin
Catch, /Cancel
Message, /Reset
ThisRoutine = Routine_Info(UpperRoutine, /Functions, /Source)
Skip = 1
EndIf
If (Skip eq 0) then Begin
ThisRoutine = Routine_Info(UpperRoutine, /Source)
If (ThisRoutine.Path eq '') then Begin
Message, '', /Traceback
EndIf
EndIf
Catch, /Cancel
If (StrPos(ThisRoutine.Path, Path_Sep()) eq -1) then Begin
CD, Current = Current
SourcePath = FilePath(ThisRoutine.Path, Root = Current)
EndIf Else Begin
SourcePath = ThisRoutine.Path
EndElse
Root = StrMid(SourcePath, 0, $
StrPos(SourcePath, Path_Sep(), /Reverse_Search) + 1)
Return, Root
End
pro resize ;文件名必须与程序名相同,否则无法编译
startpath = SourcePath()
cd,startpath
compile_opt idl2
envi,/restore_base_save_files
envi_batch_init, log_file='batch.txt'
;=====定义输入文件路径=====
inpath=startpath
;=====定义输出文件路径=====
outpath= startpath+"result"
;定义批处理文件名列表
filename = findfile('*.tif')
n = N_ELEMENTS(filename) ;n_elements函数返回数组中所有元素的数目
;==========批处理=====================
FOR i=0,n-1 DO BEGIN
in_name=inpath+filename
envi_open_file, in_name, r_fid=fid
if (fid eq -1) then begin
envi_batch_exit
return
endif
envi_file_query, fid, ns=ns, nl=nl, nb=nb
dims = [-1, 0, ns-1, 0, nl-1]
pos = lindgen(nb)
out_name = outpath+filename
envi_doit,'resize_doit',$
fid=fid, pos=pos, dims=[0, 0,170,0,170], $
interp=0, rfact=[1,1],out_name=out_name, r_fid=r_fid
ENDFOR
;=============================退出批处理模式=======================
envi_batch_exit
end
1、什么是批处理?
批处理(Batch)顾名思义,就是对某对象进行批量的处理。在学习Windows的时候,大家可能会遇到以.bat为扩展名的文件,这个文件里面包括了一系列的DOS命令。当运行这个bat文件的时候,这些dos命令会依次进行,不需要手工的一遍一遍的在命令窗口中输入,这就是批处理的好处。
在ENVI中,我们常常需要对一系列的命令重复使用,我们就可以把这些命令组合起来,保存为一个IDL的批处理文件,方便我们日后使用
2、IDL批处理文件
批处理文件是以.pro结尾的一种包括了一系列的IDL命令的文件。运行这类文件和用户在IDL命令行中敲入的命令完全一样。
例如,在IDL命令
行中绘制正弦曲线图的时候,可以通过下面的几个命
令来实现:
[plain] view plaincopyprint?
IDL>arr = findgen(200)
IDL>data = sin(arr/20)
IDL>window,2,xsize = 400,ysize = 300,title = 'Plot Sin'
IDL>plot,data
如果需要多次调用上述代码,可以采用批处理模式,讲下面的几行代码保存在一个批处理文件中(注意:批处理文件中无需PRO、END等关键字)
[plain] view plaincopyprint?
data = sin(arr/20)
window,2,xsize = 400,ysize = 300,title = 'Plot Sin'
plot,data
假设批处理文件在C:\emp目录下,名称为batch_plot.pro,我们就可以在命令行中通过下面的方法调用
[plain] view plaincopyprint?
IDL>cd,'C:\emp'
IDL>arr = findgen(400)
IDL>@batch_plot
3、ENVI批处理模式
以批处理模式运行ENVI能够让用户在命令模式下使用ENVI。这种能力在以下几种情况下非常有用:
(1)用户主要使用IDL工作但偶尔需要用到ENVI的函数;
(2)用户希望创建定制的应用程序其中混合了IDL代码和ENVI函数;
(3)用户希望进行大量的ENVI处理而无需人工干预。
批处理模式的ENVI和正常模式下没有什么区别,只是通过一系列特定的函数库来执行ENVI的功能。为了使用这些函数,必须首先将它们恢复到IDL内存中。因此为了正确获取ENVI库函数,有必要了解一下ENVI程序的结构:
ENVI 功能函数分散在大约50个小的IDL save文件中,这些二进制的文件包括数据和编译后的程序。这些save文件存放在ENVI安装路径下的Save目录下。ENVI核心save文件包括ENVI的基本功能函数,动态运行函数以及ENVI运行所需的内部变量。在典型的Windows PC上这些文件存放在:C:\
si\\idlxx\\products\\envixx\\save 目录下。
(1)ENVI批处理初始化:
ENVI批处理初始化一般包括如下步骤:
ENVI的主菜单条上设置File ->Preferences->Miscellaneous->Exit IDL on Exit from ENVI->No
compile_opt idl2 ;严格编译器要求
ENVI, /restore_base_save_files ;加载核心save文件
ENVI_batch_init ;初始化批处理
(2)离开ENVI批处理模式:
使用ENVI_BATCH_EXIT命令即可,ENVI_BATCH_EXIT退出批处理的方式和通过ENVI主菜单上选择File-> Exit退出ENVI的效果一样。同样,使用该命令退出ENVI后,ENVI时段使用的License也被释放。
4、混合批处理模式
ENVI始终是一个IDL程序,如果用户使用运行ENVI的IDL时段,用户将能够访问所有ENVI程序和函数,这种状态通常称为混合批处理模式。
优点:
用户能够使用ENVI特有的库函数而无需初始化批处理模式
模拟了代码执行的最终环境
缺点:
如果IDL程序崩溃,那么当前的ENVI环境将会整个崩溃
5、关于ENVI_Doit
在调用ENVI空间处理函数的时候有以下面的区别:(这个是重点哦
)
如果在批处理模式在,调用的时候需要采用envi_doit, 'envi_stats_doit'
在混合批处理模式下,调用的时候直接采用envi_stats_doit
