最近把IDL编写的FLAASH大气校正模块嵌到了项目里,今天几类卫星的测试数据收到了,就着手测试了大气校正功能是否正常。测试了GF1(高分一号)、GF2(高分二号)、ZY3(资源三号-01a)数据都没有问题,可是到了BJ2(北京二号)大气校正界面弹出了几秒就莫名其妙的关闭了,百思不得其解,于是记录下排除错误和解决问题的方法。
在ENVI中打开BJ2辐射定标数据,发现BJ2缺少半宽高度值fwhm,但是我的代码里明确的处理这样的情况,即每个波段都设为-1,因此可以排除是因为缺少fwhm而产生的错误。(但我还是编辑了头文件,把每个波段的FWHM设置下,结果还是报错)
把同样的参数在ENVI中设置好,进行大气校正,结果ENVI正常运行,并没有报错。。。看来还是我的IDL程序有问题,立即查看大气校正文件输出目录(就是Flaash中的modtran_directory)。在这里,我觉得大家不管是用IDL调用FLAASH,还是直接在ENVI中操作FLAASH这个目录都可以保留,这里面包含大气校正参数信息及大气校正日志信息,方便出错查看,毕竟有的错误不会在界面中显示。
输出目录中_journal.txt就是日志信息,_template.txt就是模板信息,我打开日志信息,发现报了如下的错误:
字面意思就是一些通道超出了范围,难道是BJ2辐射定标后的结果有异常值,超出了MODTRAN模型接受的范围,我立即统计了下各波段的信息。
可以看出辐射定标结果是正常的,都在常见的值范围。现在只可能出错在大气校正参数设置上了,打开两份模板txt文件对比下看区别在哪,翻了半天。。。发现了只有一个地方不一样,就是一个是nanometer,一个是Nanometers。(左边是ENVI下大气校正参数模板)
这个wavelength_units意思就是光谱长度单位,一般来说正常的影像光谱范围都会用微米或者纳米作为光谱长度单位,ENVI帮助文档中也曾写过,一般影像头文件中会包含这个参数,当然我的代码就是直接从头文件中读取出来:
metadata = Raster.Metadata
wavelength_units = metadata['WAVELENGTH UNITS']
不会是这个单位问题导致的吧,赶紧加了一句代码
wavelength_units = wavelength_units EQ 'Micrometers'?'Micrometers':'nanometer'
(这句话只考虑了两种情况,你们可以自己多加一些判断)
编译一下,再次运行一下,没有报错,正确的完成了大气校正,查看结果也是正确的。看来错误就是出在这里。。。
那之前的GF1、GF2、ZY3怎么没有出错,我打开GF2的ENVI执行的大气校正参数模板与我程序生成的大气校正参数模板对比下,发现它的光谱范围是μm即Micrometers,微米。(左边是ENVI下大气校正参数模板)
那么问题来了,为什么这个不一样不报错,能执行。。。有点让人摸不清头脑