ENVI终于开放FLAASH二次开发接口

ENVI中的FLAASH模块(Fast Line-of-sight Atmospheric Analysis of Hypercubes,大气校正)的开发者本来是Spectral Sciences和Air Force Research Labs,被ITT公司收购后由ITTVIS整合到ENVI软件中并做了可视化界面,因此,虽然ENVI中大多数模块均已提供了二次开发接口,但是FLAASH模块的二次开发接口却迟迟没有放开(出于商业考虑?),ITT被ESRI收购后更是没了下文。终于,在广大用户们不断地敦促下(尤其是我们的于博士),官方终于在前天公开发布了二次开发接口的调用方式(查看原文),小伙伴们再也不用为批量操作时频繁地重输参数所头疼了。

不啰嗦了,下边引入原文中的接口代码示范:

——————————————分割线以下为引用内容———————————————

重要!!!

如果自己在调用时报错信息类似如下,需要在执行FLAASH之前,在ENVI中关闭输入的辐射亮度数据。

002ajk6hzy79EqP34M109&690

本文将提供两个示例代码,分别处理多光谱(Landsat 8)和高光谱(AVIRIS)。

  • 代码中使用的是相对路径,可直接运行。
  • 输入数据在data文件夹中,输出结果放在output文件夹中。
  • 虽然参数很多,但是和FLAASH面板中的参数是一一对应的。

源码和测试数据下载地址:http://pan.baidu.com/s/1kUETjX9

 把多光谱处理的代码贴上来,敬请欣赏。

大量中文注释,让您的调用畅通无阻。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
PRO test_flaash_object_class_multi
COMPILE_OPT idl2
e=envi()

;获取源码所在文件
Path = FILE_DIRNAME(ROUTINE_FILEPATH())+PATH_SEP()

;输入多光谱辐射亮度数据
radiance_file = FILEPATH('Landsat_8_OLI_Rad.dat', $
root_dir=Path, subdirectory=['data'])

;大气校正输出结果文件路径
reflect_file = FILEPATH('Landsat_8_OLI_Rad_flaash.dat', $
root_dir=Path, subdirectory=['output'])

;打开栅格数据,获取元数据信息
raster = e.OpenRaster(radiance_file)

;数据信息
nspatial = raster.nColumns ;列数
nlines = raster.nRows ;行数
fid = ENVIRasterToFID(raster)
ENVI_FILE_QUERY, fid, data_type=data_type ;数据类型

;获取输入文件后缀 (.dat)
exten = stregex(radiance_file, '\..+$', /extract)
;对应 Rootname for FLAASH files 参数,设置为 Landsat_8_OLI_Rad_
user_stem_name = FILE_BASENAME(radiance_file, exten)+'_'

;对应 Output Directory for FLAASH Files 参数
;使用输出路径作为临时路径(不建议使用系统临时路径)
modtran_directory = Path+'output'

;获取光谱响应函数路径
filter_func_filename = FILEPATH('landsat8_oli.sli', $
root_dir=e.root_dir, subdirectory=['resource','filterfuncs'])

;获取时间信息
IF OBJ_VALID(raster.Time) THEN BEGIN
;如果元数据中有时间信息,则自动获取
tmpTimes = STRSPLIT(raster.Time.ACQUISITION, '-T:Z', /extract)
year = FIX(tmpTimes[0])
month = FIX(tmpTimes[1])
day = FIX(tmpTimes[2])
gmt = DOUBLE(tmpTimes[3]) + $
DOUBLE(tmpTimes[4])/60D + DOUBLE(tmpTimes[5])/60D^2
ENDIF ELSE BEGIN
;如果元数据中没有,则手动设置
year = 2013
month = 10
day = 3
gmt = 2.923418
ENDELSE

;坐标信息
ref = raster.SPATIALREF
IF ref NE !NULL THEN BEGIN
;如果有坐标系,则自动获取经纬度、分辨率
pixel_size = (ref.pixel_size)[0]
ref.ConvertFileToMap, nspatial/2, nlines/2, MapX, MapY
ref.ConvertMapToLonLat, MapX, MapY, longitude, latitude
ENDIF ELSE BEGIN
;如果没有坐标系,则手动设置
pixel_size = 30.0
longitude = 117.08846
latitude = 40.506906
ENDELSE

;获取波长信息
metadata = Raster.Metadata
wavelength_units = metadata['WAVELENGTH UNITS']
lambda = metadata['WAVELENGTH']
;fwhm如果没有,可设置值全部为-1
;例如4个波段的多光谱数据,设置为[-1.0, -1.0, -1.0, -1.0]
IF metadata.HasTag('FWHM') THEN $
fwhm = metadata['FWHM'] $
ELSE fwhm = DBLARR(raster.nBands)-1.0
;缩放系数,如果定标时设置了FLAASH Setting,则设置value=1.0即可。
input_scale = MAKE_ARRAY(raster.nbands, value=1.0, /double)

;初始化FLAASH对象
;可选关键字如下:
; rad_remove FLAASH执行完毕后,自动关闭输入文件
; anc_remove FLAASH执行完毕后,自动关闭生成的辅助数据
; anc_delete FLAASH执行完毕后,自动关闭并删除辅助数据
flaash_obj = obj_new('flaash_batch', /anc_delete)

;设置大量的输入参数
flaash_obj->SetProperty, $
hyper = 0, $ ;设置为1,表示高光谱;设置为0,表示多光谱
;
; FLAASH工程参数----
radiance_file = radiance_file, $
reflect_file = reflect_file, $
filter_func_filename = filter_func_filename, $
filter_func_file_index = 0, $
water_band_choice = 1.13, $
red_channel = 4, $ ;0表示undefined,LC8红波段为第4波段
green_channel = 3, $ ;0表示undefined,LC8绿波段为第3波段
blue_channel = 2, $ ;0表示undefined,LC8蓝波段为第2波段

;水汽反演,没有所需波段,所以设置为0,表示undefined
;分别对应Multispectral Setting中Water Retrieval选项卡中的两个参数
water_retrieval = 0, $ ;Water Retrieval参数。0表示No,1表示Yes
water_abs_channel = 0, $
water_ref_channel = 0, $

;气溶胶反演----
;对应Multispectral Setting中Kaufman-Tanre Aerosol Retrieval选项卡中的参数
kt_upper_channel = 6, $ ;设置短波红外2(SWIR 2
kt_lower_channel = 4, $ ;设置红波段(Red)
kt_cutoff = 0.08, $ ;Maximum Upper Channel Reflectance
kt_ratio = 0.500, $ ;Reflectance Ratio
cirrus_channel = 0, $ ;0表示undefined

;前边已经定义
user_stem_name = user_stem_name, $
modtran_directory = modtran_directory, $
;
; MODTRAN参数---
visvalue = 40.0000, $ ;能见度,默认40km

;为了进行水汽反演,需要如下3个波段范围中的一个:
; 1050-1210nm, 770-870nm, 870-1020nm
; 而且要求此范围的波段光谱分辨率最低为15nm
f_resolution = 15.0000, $

;时间信息----
day = day, $
month = month, $
year = year, $
gmt = gmt, $
latitude = latitude, $
longitude = longitude, $
sensor_altitude = 705.0000, $ ;传感器高度
ground_elevation = 0.043, $ ;平均海拔,单位km

;分别对应 Advanced Setting 中的同名参数,默认即可
view_zenith_angle = 180.0000, $
view_azimuth = 0.0000, $

;大气模型:0-SAW;1-MLW;2-U.S. Standard;3-SAS;4-MLS;5-T
atmosphere_model = 4, $
;气溶胶模型:0-No Aerosol;1-Rural;2-Maritime;3-Urban;4-Tropospheric
aerosol_model = 3, $

;如下几个参数对应 Advanced Setting同名参数,默认即可。
multiscatter_model = 0, $
disort_streams = 8, $
co2mix = 390.0000, $
water_column_multiplier = 1.0000, $
;
;图像参数----
nspatial = nspatial, $
nlines = nlines, $
data_type = data_type, $
margin1 = 0, $
margin2 = 0, $
nskip = 0, $
pixel_size = pixel_size, $
sensor_name = 'Landsat-8 OLI', $

;分析参数----
;对应Advanced Setting中的 Aerosol Scale Height
aerosol_scaleht = 2.0000, $
;对应Advanced Setting中的 Use Adjacency Correction
;中高分辨率设置为1,低分辨率(如Modis)设置为0
use_adjacency = 1, $

;输出缩放系数,输出结果放大了10000倍,变为UINT数据类型。
;对应Advanced Setting中的Output Reflectance Scale Factor
output_scale = 10000.0000, $ ;输出结果缩放系数

;对应 Width (number of bands) 参数,多光谱设置0即可。
polishing_res = 0, $

;对应 Aerosol Retrieval 参数。
; 0 表示 None;1 表示 2-Band (K-T)2 表示 2-Band Over Water
aerosol_retrieval = 1, $

;对应FLAASH面板中的 Wavelength Recalibration,多光谱一般为0
calc_wl_correction = 0, $
reuse_modtran_calcs = 0, $
use_square_slit_function = 0, $
convolution_method = 'fft', $

;对应Advanced Setting中的 Use Tiled Processing
;1-Yes;0-No
use_tiling = 0, $
tile_size = 1024.0000, $

; Spectral Parameters
wavelength_units = wavelength_units, $
lambda = lambda, $
fwhm = fwhm, $
input_scale = input_scale

;重要!!!!!!重要!!!!!!重要!!!!!
;执行FLAASH之前,必须在ENVI中把输入文件关闭
Raster.Close

;开始执行FLAASH
flaash_obj->processImage

;获取输入输出文件的FID
flaash_obj->getResults, rad_fid=rad_fid, reflect_fid=reflect_fid
END