基于IDL用户函数的波段运算

ENVI 提供对 IDL 程序的访问的功能,可以使用内置的IDL 函数或者用户自定义IDL函数。这些函数要求它们接受一个或多个图像阵列作为输入,并且输出一个与输入波段具有相同行列的单波段二维数组作为计算结果。如下为一个自定义函数的基本格式:

FUNCTION bm_func, b1, [b2,..., bn, parameters and keywords] 

    processing steps 

    RETURN, result

END

下面以一个简单的例子介绍用IDL自定义函数,后在Band Math中使用这个函数,自定义函数实现的功能是计算一个比值(b1+b2/b1-b2),并且检查分母为0的情况。

第一步、编写函数

用记事本编写以下代码:

FUNCTION bm_ratio, b1, b2, check=check  ;定义两个变量和一个关键字

den = float(b1) - b2                  ;计算分母

 IF (keyword_set(check)) THEN ptr = WHERE(den EQ 0., count)  ELSE count = 0 ;如果设置了check关键字,检查分母为0情况

IF (count GT 0) THEN den[ptr] = 1.0    ;如果分母为0,临时则将分母赋值1.0

result = (float(b1) + b2) / den           ;计算比值

IF (count GT 0) THEN result[ptr] = 0.0   ;分母为0时,直接将结果返回0.0

RETURN, result

END

 

保存文件为bm_ratio.pro

第二步、编译函数

有两种方式编译这个自定义函数:

1)       bm_ratio.pro文件拷贝到安装路径的save_add 目录下,启动ENVI + IDL模式,自动将bm_ratio.pro编译。

2)       启动 ENVI + IDL模式, 在主菜单中,选择File->Compile IDL Module,在Enter Module Filename对话框中选择bm_ratio.pro

第三步、应用函数

(1)          打开一个多波谱的图像文件。

(2)          ENVI主菜单中,选择Basic Tools->Band Math。在Enter an expression文本框中输入:

  bm_ratio(b1, b2)           ;不执行检查分母为0的情况

bm_ratio(b1, b2,/check)   ; 执行检查分母为0的情况

(3)          其他操作过程与Band Math工具一样。

如果编写的函数有错误或者没有启动ENVI + IDL模式,一般会出现图15.4情况。

15.4 自定义函数不能成功加载

如果熟悉IDL的可视化编译环境(IDL Workbench),在第一步编写函数时候可以在IDL Workbench环境中编写,并且可以编译为.sav文件。在第二步编译函数时候可以单独启动ENVI Runtime模式。

IDL编写自定义函数非常灵活,功能也非常强大,前提是需要IDL相关知识。

posted @ 2022-09-05 11:25  ENVI-IDL技术殿堂  阅读(526)  评论(0编辑  收藏  举报