ASTER光谱数据介绍
ASTER光谱库包含三个子库,分别是 Johns Hopkins University (JHU) 光谱库、Jet Propulsion Laboratory (JPL) 光谱库和 United States Geological Survey (USGS) 光谱库。ASTER 光谱库包含多达 2300 余种典型地物的光谱,包括矿物质、岩石、土壤、植被、水体、冰雪等各类自然地物以及人造地物等类别,其波谱范围从 0.4 μm 到 15.4 μm。
问题描述
但由于ASTER测量的光谱是400到15400nm波段范围的地表连续反射,而我们的目的是获得宽波段传感器通道的反射率或者发射率,因此需要进行由连续反射率向宽通道反射率/发射率的转换。
传感器通道反射率转换公式为:
其中ρ,S分别代表光谱反射率和通道光谱响应函数,λ1,2则是传感器通道起止波长。
因为 Incident Energy = Emitted Energy + Transmitted Energy + Reflected Energy。但一般地物的透射率为0。
所以100% = Emissivity + Reflectivity,传感器通道发射率转换公式如下。
传感器通道发射率转换公式为:
ps:关于通道发射率的转换,查阅了不少论文都没有贴出明确的公式,理论推导上来说公式应该是这样的。但最后计算结果有点不符合实际,欢迎有了解的老师们留言指教。
2020-5-27 更新: 在文献中找到了相关公式,验证了上面的通道比辐射率推导没错。
ε i 为通道 i 的加权平均比辐射率, ε λ 为 地物光谱比辐射率,fi ( λ )为通道 i 的光谱响应函数
数据格式
ASTER光谱数据,以一个海水的光谱为例,植被,土壤,水,人造物总共2300+条。
MERSI2 Band25光谱响应,以波数(cm-1)为单位,所以还要做一个向波长(nm)单位的转换处理。
单位的转换关系在之前的博客中讲过。
IDL实现
pro aster_intergral
compile_opt idl2
fn = dialog_pickfile(title = '选择光响应函数文件', filter = ['*.txt'])
openr, lun, fn, /get_lun
;逐行读取 读到Wavenumber的时候 新建数组 逐行读取响应函数值
str_line = ' '
flag = 0
while flag eq 0 do begin
readf, lun, str_line
if strpos(str_line, 'Wavenumber') ne -1 then begin
flag = 1
i = 0
sensor = fltarr(2,1000)
temp = fltarr(2)
while eof(lun) ne 1 do begin
readf, lun, temp
sensor[*,i] = temp
i = i + 1
endwhile
endif
endwhile
free_lun, lun
;10nm间隔
sensor = sensor[*,0:i-1]
sensor = transpose(sensor)
sensor = reverse(sensor)
sensor[*,0] = 10e6 / sensor[*,0]
;插值到1nm间隔
start_wl = sensor[0,0]
end_wl = sensor[-1,0]
interpol_wl = [0:round(end_wl - start_wl):1] + start_wl
wl = sensor[*,0]
re = sensor[*,1]
sensor_interpol_re = interpol(re, wl, interpol_wl)
;逐行读取ASTER光谱数据,读到‘Additional Information’新建数组
fn = dialog_pickfile(title = '选择ASTER光谱数据', filter = ['*.txt'])
openr, lun, fn, /get_lun
str_line = ' '
flag = 0
while flag eq 0 do begin
readf, lun, str_line
if strpos(str_line, 'Additional Information') ne -1 then begin
flag = 1
i = 0
aster = fltarr(2,5000)
temp = fltarr(2)
while eof(lun) ne 1 do begin
readf, lun, temp
aster[*,i] = temp
i = i + 1
endwhile
endif
endwhile
free_lun, lun
aster = aster[*,0:i-1]
aster = transpose(aster)
aster = reverse(aster)
aster[*,0] = aster[*,0] * 10^3
aster[*,1] = 100 - aster[*,1]
;插值到和传感器同样波段范围的1nm间隔
wl = aster[*,0]
re = aster[*,1]
aster_interpol_re = interpol(re, wl, interpol_wl)
;计算积分
up = int_tabulated(interpol_wl, sensor_interpol_re * aster_interpol_re)
down = int_tabulated(interpol_wl, aster_interpol_re)
fashelv = up / down
print,up,down,fashelv
end
转换结果:
984.210 993.957 0.990194