一、前言
IDL 用于跨学科提取有意义的信息并从复杂的数字数据创建可视化。 IDL 的前身版本是为分析来自 NASA 任务(例如 Mariner 和国际紫外线探索者)的数据而编写的。 IDL 的这些前身版本是 20 世纪 70 年代在科罗拉多大学博尔德分校的大气和空间物理实验室 (LASP) 开发的。 IDL 的第一个正式版本于 1977 年由 Research Systems Inc. (RSI) 发布。 自 1970 年代首次创建以来,IDL 已经走过了漫长的道路。 我们的工程师不断地为 IDL 添加新功能,以保持它的现代性、灵活性和用户友好性。
由于 IDL 起源于一种面向科学家和工程师处理多维科学数据阵列的编程语言,因此它非常自然地适用于处理来自遥感系统的栅格数据。 1994 年,RSI 发布了 ENVI 的第一个版本。 从那时起,ENVI 和 IDL 就像形影不离的好朋友。 IDL 可以做什么,ENVI 也可以。 ENVI 有一个用 IDL 编写的 API,可用于创建自定义算法、自定义工作流以及遥感数据的批处理。
使用 IDL 扩展 ENVI 的能力是 ENVI 最强大的一个方面。 ENVI API 有一个快速的学习曲线,一旦你弄明白了,你可以用你的数据做什么。 这包括强大的地理数据可视化效果,例如我在下面使用 CONTOUR 函数创建的可视化效果。
![](https://i-blog.csdnimg.cn/blog_migrate/c69d731dbe318c1a4868090e1bbfd44e.png)
ENVI API 的一个更强大的方面是实现自定义算法的能力。这允许用户应用他们在科学文献中阅读过的算法或试验他们自己的图像分析算法。 让我们继续看看如何使用 IDL 在 ENVI 中实现自定义算法。 在这个例子中,我们将使用 Landsat 8 的缨帽变换 (TCT)。TCT 最初是为 1972 年发射的 Landsat 多光谱扫描仪 (MSS) 设计的。TCT 的后续改编已在科学杂志上发表 Landsat Thematic Mapper (TM)、Landsat Enhanced Thematic Mapper (ETM) 和 Landsat Enhanced Thematic Mapper Plus (ETM+) 传感器的文献。 在 Landsat MSS、TM、ETM 和 ETM+ 图像上执行 TCT 的能力是开箱即用的 ENVI。 然而,Landsat Operational Land Imager (OLI) 传感器的 TCT 算法最近才发布,尚未进入 ENVI 工具箱。 但是,由于该算法现已在科学文献中可用,我们可以使用 ENVI API 将此算法应用于 Landsat 8 数据。 该算法采用 Landsat 8 图像并计算包含 6 个波段的新图像文件,每个波段包含有关场景的唯一信息,例如反照率(亮度)、植被健康(绿度)和水分含量(湿度)。
下面的示例代码可以在 ENVI + IDL 中实现,以对 Landsat 8 数据执行 TCT:基于 Landsat 8 卫星反射率的穗帽变换的推导
二、代码过程
; Copyright (c) 1988-2015, Exelis Visual Information Solutions, Inc. All rights reserved.
pro tasseledcapidl
; Set compile options - this is a standard compatibility line that is recommended for use in all IDL code
compile_opt IDL2
; Use the current session of ENVI
e=envi(/current)
; Path and filename to a pre-calibrated Landsat 8 image file
; Input file should be radiometrically calibrated and optionally atmospherically corrected
inputRaster = e.OpenRaster('C:\Data\Naples\LC80160422015028LGN00_RadCal_MS_Subset.dat')
; Subset the input raster - only these 6 bands are needed for the TCT calculation
subsetRaster=ENVIsubsetRaster(inputRaster, BANDS=[1,2,3,4,5,6])
; Set up output raster file
outputRaster = ENVIRaster(URI=outputURI, INHERITS_FROM=subsetRaster)
; Create tiles - creating tiles allows ENVI + IDL to iterate through the tiles, which is a good idea
; when you want to minimize the impact of image processing on your computer's resources
tiles = subsetRaster.CreateTileIterator(MODE='spectral')
; Iterate through tiles
FOREACH tile, tiles DO BEGIN
; band 1
b1 = tile[*,0]
; band 2
b2 = tile[*,1]
; band 3
b3 = tile[*,2]
; band 4
b4 = tile[*,3]
; band 5
b5 = tile[*,4]
; band 6
b6 = tile[*,5]
dims= size(tile,/DIMENSIONS)
data = make_array(dims,/FLOAT)
; Use IDL to do the TCT calculations
; Calculate brightness
data[*,0] = (b1 * 0.3029) + (b2 * 0.2786)+ (b3*0.4733) + (b4*0.5599) + (b5*0.508) + (b6*0.1872)
; Calculate greenness
data[*,1] = (b1 * (-0.2941)) + (b2 * (-0.243))+ (b3 * (-0.5424)) + (b4 * 0.7276) + (b5 * 0.0713)
; Calculate wetness
data[*,2] = (b1 * 0.1511) + (b2 * 0.1973)+ (b3 * 0.3283) + (b4 * 0.3407) + (b5 * (-0.7117)) + (b6*(-0.4559))
; Calculate TCT4 (Haze)
data[*,3] = (b1 * (-0.8239)) + (b2 * 0.0849)+ (b3 * 0.4396) + (b4 * (-0.058)) + (b5 * 0.2013) + (b6*(-0.2773))
; Calculate TCT5
data[*,4] = (b1 * (-0.3294)) + (b2 * 0.0557)+ (b3 * 0.1056) + (b4 * 0.1855) + (b5 * (-0.4349)) + (b6 *0.8085)
; Calculate TCT6
data[*,5] = (b1 * 0.1079) + (b2 * (-0.9023))+ (b3 * 0.4119) + (b4 * 0.0575) + (b5 * (-0.0259)) + (b6 *0.0252)
; Write to ouput file
outputRaster.SetTile, data, tiles
ENDFOREACH
; Add appropriate Band Names to the HDR file
metadata = outputRaster.METADATA
metadata.UpdateItem, 'BAND NAMES', ['Brightness','Greenness','Wetness','TCT4','TCT5','TCT6']
; Save changes to output file
outputRaster.save
; Display output file in ENVI Display
view=e.getview()
layer=view.createlayer(outputRaster)
end
三、结果展示
此示例的输入文件由 Landsat 8 于 2015 年 1 月 28 日在佛罗里达州那不勒斯上空捕获。下面的 ENVI 显示屏屏幕截图显示了场景的彩色红外表示,以及计算出的亮度、绿色度和湿度带 流苏帽改造。 这只是 IDL 的强大功能如何使自定义算法的实现变得如此简单的一个例子。
![](https://i-blog.csdnimg.cn/blog_migrate/11424e2d1c3f8ac1b43c8c3973f4ade5.png)