ENVI具备了丰富的二次开发功能函数接口,基本涵盖了ENVI下所有的功能,且通过IDL语言有输出助手(导出为COM或JAVA类)、Callable、IDLDrawWidget和COM_IDL_CONNECT等多种方式与其他语言进行集成。
1.初始化ENVI
;+
;ENVI二次开发功能代码
;
;描述:
; 初始化ENVI
;
;调用方法:
;(1) ENVI的处理过程中不显示进度条
; startEnvi
;(2) ENVI的处理过程中显示进度条
; startEnvi,/ShowProcess
;-
PRO startENVI, showProcess = showProcess
compile_opt idl2
ENVI, /restore_base_save_files
ENVI_BATCH_INIT, NO_STATUS_WINDOW = 1-
keyWord_set(showProcess)
END
2.定标
;+
;ENVI二次开发功能代码
;
;描述:
; 定标
;
;调用方法:
; cal_Calibration,
'c:\temp\can_tmr.img','c:\temp\result.img',[[2,2,2,2,2,2],[1,1,1,1,1,1]]
;注意事项:
; gainoffset参数与波段个数一一对应
;
;-
Pro cal_calibration, infile, outFile, gainOffset,wl =
wv;(可选关键字,wv是定标后单位)
COMPILE_OPT idl2
CATCH, Error_status
errorshow = 'Sorry to see the error,'+ $
' please
send the error Information to "dongyq@esrichina-bj.cn"'
IF Error_status NE 0 THEN BEGIN
tmp =
DIALOG_MESSAGE(errorshow+STRING(13b)+$
!ERROR_STATE.MSG,/error,title = '错误提示!')
return
ENDIF
;获取ENVI的配置参数
cfg = envi_get_configuration_values()
tmppath = cfg.DEFAULT_TMP_DIRECTORY
;是否设置了输出文件名
IF N_ELEMENTS(outFile) EQ 0 THEN
out_name=tmppath+PATH_SEP()+'void.tmp'
ENVI_OPEN_FILE,infile,R_fid= fid
;获取信息
ENVI_FILE_QUERY, FID, $
dims = dims,
$
BNAMES =
BNAMEs, $
NB =
NB
;定标功能
ENVI_DOIT,'gainoff_doit', fid=fid,
pos=LINDGEN(nb), dims=dims, out_name=outFile, $
gain=1./gainOffset[*,0], offset=gainOffset[*,1], r_fid=r_fid,
in_memory=0,$
OUT_DT =
4
ENVI_FILE_QUERY, r_fid, $
dims = dims,
$
DATA_TYPE =
4, $
INTERLEAVE =
INTERLEAVE, $
NB = NB,
$
NL = NL,
$
NS=NS
,$
OFFSET =
OFFSET
map_info = ENVI_GET_MAP_INFO(fid=r_fid)
;先关掉文件
ENVI_FILE_MNG, id = fid,/Remove
ENVI_FILE_MNG, id = r_fid,/Remove
;再写入头文件
ENVI_SETUP_HEAD, $
DATA_TYPE =
DATA_TYPE, $
BNAMES =
'定标后:'+BNAMES, $
DESCRIP =
'定标公式 y=x/gain+offset', $
FNAME=outFile,$
INTERLEAVE =
INTERLEAVE, $
MAP_INFO =
map_info, $
wl = wv,
$
NB = NB,
$
NL = NL,
$
NS=NS
,$
OFFSET =
OFFSET,$
/Write
END
3.大气校正
;+
;ENVI二次开发功能代码
;
;描述:
; 大气校正
;
;调用方法:
;cal_QUAC,inputfile,outputfile
;
;-
PRO CAL_QUAC,inputfile,outputfile
COMPILE_OPT idl2
CATCH, Error_status
errorshow = 'Sorry to see the error,'+ $
' please
send the error Information to "dongyq@esrichina-bj.cn"'
IF Error_status NE 0 THEN BEGIN
tmp =
DIALOG_MESSAGE(errorshow+STRING(13b)+$
!ERROR_STATE.MSG,/error,title = '错误提示!')
return
ENDIF
ENVI_OPEN_FILE, inputfile, r_fid=fid
IF (fid EQ -1) THEN BEGIN
RETURN
ENDIF
ENVI_FILE_QUERY, fid, dims=dims, nb=nb,
sensor_type=sensor_type
pos = LINDGEN(nb)
sensor = envi_sensor_type(sensor_type)
; Perform QUick Atmospheric Correction
ENVI_DOIT, 'envi_quac_doit', $
fid=fid,
pos=pos, dims=dims, $
quac_sensor=sensor, $
out_name=outputfile,
r_fid=r_fid
;
END
4.融合
;+
;ENVI二次开发功能代码
;
;描述:
;图像融合
;
;调用方法:
;CAL_SHARPEN,inputfileMulti,inputfilePan,outputfile,method
;inputfileMulti是低分辨率的多光谱影像
;inputfilePan是高分全色影像
;
;Method : 0-HSV融合
;
1-color-normalized融合
;
2-Gram-Schmidt融合
;
3-主成份分析融合
;-
PRO CAL_SHARPEN,inputfileMulti,inputfilePan,outputfile,method
COMPILE_OPT idl2
CATCH, Error_status
errorshow = 'Sorry to see the error,'+ $
' please
send the error Information to "dongyq@esrichina-bj.cn"'
IF Error_status NE 0 THEN BEGIN
tmp =
DIALOG_MESSAGE(errorshow+STRING(13b)+$
!ERROR_STATE.MSG,/error,title = '错误提示!')
return
ENDIF
;打开全色影像
ENVI_OPEN_FILE, inputfilePan, r_fid=h_fid
IF (h_fid EQ -1) THEN BEGIN
ENVI_BATCH_EXIT
RETURN
ENDIF
;获取影像参数
;
ENVI_FILE_QUERY, h_fid, ns=h_ns, nl=h_nl,$
dims =
h_dims,nb = h_nb
; 打开多光谱影像
ENVI_OPEN_FILE, inputfileMulti,
r_fid=m_fid
IF (m_fid EQ -1) THEN BEGIN
ENVI_BATCH_EXIT
RETURN
ENDIF
;获取影像参数
ENVI_FILE_QUERY, m_fid, dims=m_dims, $
bnames=m_bnames,nb = m_nb
IF method LT 2 THEN BEGIN
; Set the
keywords
f_dims =
[-1l, 0, h_ns-1, 0, h_nl-1]
f_pos = [0]
;
rgb_fid =
[m_fid,m_fid,m_fid]
out_bname =
['3','2','1']
;ENVI的融合功能
ENVI_DOIT,
'sharpen_doit', $
fid=rgb_fid, pos=lindgen(m_nb), f_fid=h_fid, $
f_dims=f_dims, f_pos=f_pos, $
out_name=outputfile, method=1, $
interp=0, out_bname=out_bname
RETURN
ENDIF
CASE method OF
;
2:
BEGIN
out_bname = 'GS_Sharpen_band_'+STRTRIM(LINDGEN(m_nb),2)
ENVI_DOIT, 'ENVI_GS_SHARPEN_DOIT', $
DIMS= m_dims, $
fID = m_fid, $
HIRES_DIMS = h_dims, $
HIRES_FID = h_fid,$
HIRES_POS = LINDGEN(h_nb),$
INTERP =
2,[
DISCUZ_CODE_12
]nbsp;
METHOD = 0 ,$
OUT_BNAME = out_bname , $
OUT_NAME = outputfile,$
POS =LINDGEN(m_nb)
END
3:
BEGIN
out_bname = 'PC_Sharpen_band_'+STRTRIM(LINDGEN(m_nb),2)
ENVI_DOIT, 'ENVI_PC_SHARPEN_DOIT', $
DIMS= m_dims, $