ENVI 5的试用-更方便快捷的ENVI功能扩展

 

    ENVI5.0对ENVI启动、数据读取、显示窗口、处理函数API进行了更新,增加了工具箱扩展流程,更新的API函数更加简洁,使用更加方便。下面首先对ENVI启动、数据读取、显示窗口控制等功能进行代码示例展示,然后利用这些功能代码结合工具箱扩展流程编写一个ENVI扩展工具实例。

1     ENVI启动

代码简化了启动,使得在启动ENVI的代码更加简洁、直观。IDL的命令行下启动ENVI只需要输入代码:

e=ENVI()

二次开发模式下输入代码:

ENVI5.0代码

之前版本代码

e=ENVI(/Headless)

ENVI, /RESTORE_BASE_SAVE_FILES

ENVI_BATCH_INIT

2     数据读写

之前版本中,ENVI依靠文件的ID号即FIDs来进行栅格文件的操作。ENVI5.0下可以通过新的API接口返回值来进行直接处理。比如对栅格文件的读写操作示例代码:

ENVI5.0代码

;启动ENVI

e = ENVI(/HEADLESS)

 

;打开文件

file = FILEPATH(‘qb_boulder_msi’, ROOT_DIR = e.root_dir, $

   SUBDIR=[‘data’])

raster = e.OpenRaster(file)

;读取影像的第一个波段

data = raster.GetData(BANDS = 0)

 

;另存为新文件

resultFile = e.GetTemporaryFilename(‘.dat’)

newRaster = e.CreateRaster(resultFile, data, INHERITS_FROM = raster)

newRaster.Save

 

5.0之前版本代码

;启动ENVI

ENVI, /RESTORE_BASE_SAVE_FILES

ENVI_BATCH_INIT

 

;打开文件

file = FILEPATH(‘qb_boulder_msi’, ROOT_DIR=ENVI_GET_PATH(), $

   SUBDIR=[‘..’,’data’])

ENVI_OPEN_FILE, file, R_FID = fid

ENVI_FILE_QUERY, fid, DIMS = dims

 ;读取影像的第一个波段

data = ENVI_GET_DATA(FID = fid, DIMS = dims, pos = 0)

 

;另存为新文件

inherit = ENVI_SET_INHERITANCE(fid, dims)

resultFile = FILEPATH(‘qb_boulder_msi_classic_band0.dat’, /TMP)

ENVI_WRITE_ENVI_FILE, data, INHERIT = inherit, R_FID = r_fid, $

   OUT_NAME = resultFile

ENVI_BATCH_EXIT

3     窗口控制

在IDL下可以通过代码进行数据图层、显示窗口绘制等操控处理。

 ENVI5.0代码

;启动ENVI

e = ENVI()

 

;打开两个文件

file1 = FILEPATH(‘qb_boulder_pan’, ROOT_DIR = e.root_dir, $

   SUBDIRECTORY = [‘data’])

file2 = FILEPATH(‘qb_boulder_msi’, ROOT_DIR = e.root_dir, $

   SUBDIRECTORY = [‘data’])

raster1 = e.OpenRaster(file1)

raster2 = e.OpenRaster(file2)

 

;在两个独立的窗口中显示

view1 = e.GetView()

view1_layer = view1.CreateLayer(raster1)

view2 = e.CreateView()

view2_layer = view2.CreateLayer(raster2)

 

;在一个窗口中显示

view3 = e.CreateView()

view3_layer1 = view3.CreateLayer(raster1)

view3_layer2 = view3.CreateLayer(raster2)

portal = view3.CreatePortal()

 

;窗口进行关联显示

view1.GeoLink, /LINK_ALL

 

;窗口视图中心点移动到指定坐标位置

view1.GoToLocation,482234.9000d,4427500.7000D,/map

5.0之前版本代码

;启动ENVI

ENVI

 

;打开两个文件

file1 = FILEPATH(‘qb_boulder_pan’, ROOT_DIR = ENVI_GET_PATH(), $

   SUBDIRECTORY = [‘..’,’data’])

file2 = FILEPATH(‘qb_boulder_msi’, ROOT_DIR = ENVI_GET_PATH(), $

   SUBDIRECTORY = [‘..’,’data’])

ENVI_OPEN_FILE, file1, R_FID = fid1

ENVI_OPEN_FILE, file2, R_FID = fid2

 

;在两个独立的窗口中显示

ENVI_DISPLAY_BANDS, fid1, 0, /new

ENVI_DISPLAY_BANDS, fid2, [2,1,0], /new

 

;获取窗口的ID号 Get the display numbers

displays = ENVI_GET_DISPLAY_NUMBERS()

 

; 窗口视图中心点移动到指定坐标位置

ENVI_CONVERT_FILE_COORDINATES, fid1, XF, YF,482234.9000d,4427500.7000D

DISP_GOTO, displays[0], XF, YF

ENVI_CONVERT_FILE_COORDINATES, fid2, XF, YF,482234.9000d,4427500.7000D

DISP_GOTO, displays[1], XF, YF

4     数据处理

数据处理时,可以在现在的数据操控基础上转换调用ENVI的处理函数进行。

;启动ENVI

e = ENVI()

 

;打开一数据文件

file = FILEPATH(‘qb_boulder_msi’, ROOT_DIR = e.ROOT_DIR, $

   SUBDIRECTORY = [‘data’])

raster = e.OpenRaster(file)

 

;设置输出文件名

out_file = e.GetTemporaryFilename()

 

;转换为Fid(File ID)

fid = ENVIRasterToFID(raster)

 

;利用Fid进行处理,获取处理后的r_fid

ENVI_FILE_QUERY, fid, DIMS=dims

ENVI_DOIT,’CONV_DOIT’, FID=fid, $

   DIMS=dims, OUT_NAME=out_file, $

   METHOD=0, R_FID=r_fid

 

;转换r_fid为ENVI的栅格对象

out_raster = ENVIFIDToRaster(r_fid)

 

;在显示窗口中显示原图和处理后结果

view = e.GetView()

layer1 = view.CreateLayer(raster)

layer2 = view.CreateLayer(out_raster)

portal = view.CreatePortal()

5     工具箱扩展

基于ENVI提供的数据读写、窗口控制和数据处理函数可以方便的实现ENVI工具箱的扩展。IDL中提供了ENVI工具箱扩展向导来扩展工具箱。以在ENVI的工具箱下添加浮雕效果处理功能为例,扩展工具箱的基本步骤如下:

1)        新建ENVI扩展

单击IDL菜单文件-新建ENVI扩展,弹出如下界面,工程名称为“em_boss”,扩展名称为“em_boss”,IDL程序名称为“envi_em_boss_extension”,扩展路径为“ImageProcessing”。

点击完成后,会在当前工作空间中建立名为emboss的工程,并包含了一个完整的代码框架。框架内容如下:

; Add the extension to the toolbox. Called automatically on ENVI startup.

pro my_extension_extensions_init

  ; Set compile options

  compile_opt IDL2

 

  ; Get ENVI session

  e = ENVI(/CURRENT) 

  ; Add the extension to a subfolder

  e.AddExtension, ’emboss’, ‘my_extension’, PATH=’I:\program files\Exelis\ENVI50\extensions’

end

 

; ENVI Extension code. Called when the toolbox item is chosen.

pro my_extension

  ; Set compile options

  compile_opt IDL2

 

  ; General error handler

  CATCH, err

  if (err ne 0) then begin

    CATCH, /CANCEL

    if OBJ_VALID(e) then $

      e.ReportError, ‘ERROR: ‘ + !error_state.msg

    MESSAGE, /RESET

    return

  endif 

  ;Get ENVI session

  e = ENVI(/CURRENT) 

;******************************************

; Insert your ENVI Extension code here…

;******************************************

 

end

2)        编写处理功能代码

在框架代码的标识处、添加编写输入输出和处理图像的功能代码如下:

  ;打开输入文件

  inFile=DIALOG_PICKFILE(DIALOG_PARENT=e.WIDGET_ID, $

    TITLE=’Please select input file’,$

    /MUST_EXIST)

   

  ;选择输出文件

  outFile=DIALOG_PICKFILE(DIALOG_PARENT=e.WIDGET_ID, $

    TITLE=’Please select output file’)

   

  ;打开并显示

  raster = e.OpenRaster(inFile)

  view=e.GetView()

  layer1=view.CreateLayer(raster, BANDS=[0])

 

  ;创建文件输出

  rasterNew = e.CreateRaster(outFile, INHERITS_FROM=raster)

 

  ;获取栅格的分块数

  tiles = raster.CreateTileIterator(BANDS=[0])

  ;依次处理

  FOREACH tile, Tiles DO BEGIN

    data = EMBOSS(tile, /EDGE_WRAP)

    rasterNew.SetTile, Data, Tiles

  ENDFOREACH

 

;保存文件

  rasterNew.Save

  ;新增显示图层

  layer2 = view.CreateLayer(rasterNew)

 

  ;卷帘显示并动态切换

  portal = view.CreatePortal()

  portal.Animate

3)        生成sav文件

右击工程名称“em_boss”,弹出菜单中选择“构建工程”,会生成“envi_em_boss_extension.sav”文件。

 

4)        使用扩展

将生成的“envi_em_boss_extension.sav”文件拷贝到ENVI50安装目录的扩展目录下,默认为“c:\program files\Exelis\ENVI50\extensions”,启动ENVI,在工具箱下会发现新增加的扩展工具。

 

双击执行工具,选择输入文件和输出文件名,工具会对图像进行处理,并将原始图像与处理后图像动态叠加显示。

 

转载自:https://blog.csdn.net/esrichinacd/article/details/7750159

You may also like...