
IDL下高分二号完整预处理代码
发布日期:2021-05-14 03:06:53
浏览次数:21
分类:精选文章
本文共 4972 字,大约阅读时间需要 16 分钟。
下面写的太LOW了,有好多值得修改的地方,修改更新后博客地址:
今天去不了Earth Engine,所以就写了一点IDL的代码。
主要包括对高分二号数据的正射校正,(裁剪),辐射定标,快速大气校正,影像自动配准和影像融合。
如果用ENVI来做如上预处理的话会产生一些临时文件需要自己删除,而且每个过程都需要自己亲自操作,处理时间过于碎片化。基于以上原因写了文末的代码,可以自己输入高分二号的文件夹名来一步直达最后的融合结果,减少了中间的人为干预,也不需要自己删中间文件,可以说是很大的优化了处理时间。结果图:
说明:代码中用到了很多ENVITask,每个Task引入IDL的版本都不一样,所以最低版本要求为ENVI5.2.1。16行dmfile为正射校正的DEM文件,代码中默认为ENVI自带的全球DEM文件,如果对精度有要求,可以自行修改。至于时间,1/64的影像耗时在半小时以下,如果未裁剪,保守估计所有步骤跑下来应该在一个小时以上。 实测中一景影像耗时为260分钟左右,测试电脑配置为i5-6200U,4GB内存。如下源码为处理整个一景。
;+; Description:; Pre-Treatment of GaoFen-2 Imagery;; Author: JAYTON TSUNG Nov 21 ,2018; CHENGDU UNIVERSITY OF INFORMATION TECHNOLOGY; DESERTSTSUNG@QQ.COMPRO PreTreat COMPILE_OPT IDL2 e = ENVI(/headless) t = SYSTIME(1) indir = 'H:\GF2_PMS2_E115.6_N38.4_20170628_L1A0002448743' dmfile = e.Root_Dir + 'data\GMTED2010.jp2' pos = STRSPLIT(indir, '\') outdir = STRMID(indir, pos[0], pos[-1]) CD,indir filelist = FILE_SEARCH('*.tiff') msfile = filelist[0] & pnfile=filelist[1] ;1_RPCOrthorectification PRINT,'Part1 of 5 Has Already Started, Please Wait' ort = ENVITask('RPCOrthorectification') ;ENVI5.1 Introduced ms = e.Openraster(msfile) & dm = e.Openraster(dmfile) ort.dem_raster = dm ort.input_raster = ms ort.Output_Raster_URI = e.GetTemporaryFilename() ort.EXECUTE ortpn = ENVITask('RPCOrthorectification') pn = e.Openraster(pnfile) & dm = e.Openraster(dmfile) ortpn.dem_raster = dm ortpn.input_raster = pn ortpn.Output_Raster_URI = e.GetTemporaryFilename() ortpn.EXECUTE PRINT,'Part1 of 5 Finished, Takes '$ + STRING((SYSTIME(1)-t)/60, format='(f7.2)') + ' Minutes' ;2_ApplyGainOffset PRINT,'Part2 of 5 Has Already Started, Please Wait' IF STRPOS(indir, 'PMS1') NE -1 THEN BEGIN ;;;;PMS1;;;; IF STRPOS(indir, '2015') NE -1 THEN BEGIN msgain = [0.1457, 0.1604, 0.155, 0.1731] pngain = [0.1538] msoffs = [0, 0, 0, 0] pnoffs = [0] ENDIF ELSE IF STRPOS(indir, '2016') NE -1 THEN BEGIN msgain = [0.1322, 0.155, 0.1477, 0.1613] pngain = [0.1501] msoffs = [0, 0, 0, 0] pnoffs = [0] ENDIF ELSE IF STRPOS(indir, '2017') NE -1 THEN BEGIN msgain = [0.1193, 0.153, 0.1424, 0.1569] pngain = [0.1503] msoffs = [0, 0, 0, 0] pnoffs = [0] ENDIF ENDIF ELSE BEGIN ;;;;PMS2;;;; IF STRPOS(indir, '2015') NE -1 THEN BEGIN msgain = [0.1761, 0.1843, 0.1677, 0.183] pngain = [0.1538] msoffs = [0, 0, 0, 0] pnoffs = [0] ENDIF ELSE IF STRPOS(indir, '2016') NE -1 THEN BEGIN msgain = [0.1762, 0.1856, 0.1754, 0.1980] pngain = [0.1863] msoffs = [0, 0, 0, 0] pnoffs = [0] ENDIF ELSE IF STRPOS(indir, '2017') NE -1 THEN BEGIN msgain = [0.1434, 0.1595, 0.1511, 0.1685] pngain = [0.1679] msoffs = [0, 0, 0, 0] pnoffs = [0] ENDIF ENDELSE rad = ENVITask('ApplyGainOffset') ;ENVI5.2.1 Introduced ms = ort.Output_Raster rad.Input_Raster = ms rad.Gain = msgain & rad.offset = msoffs rad.Output_Raster_URI = e.GetTemporaryFilename() rad.EXECUTE radpn = ENVITask('ApplyGainOffset') pn = ortpn.Output_Raster radpn.Input_Raster = pn radpn.Gain = pngain & radpn.offset = pnoffs radpn.Output_Raster_URI = e.GetTemporaryFilename() radpn.EXECUTE PRINT,'Part2 of 5 Finished, Takes '$ + STRING((SYSTIME(1)-t)/60, format='(f7.2)') + ' Minutes' ;3_QUAC PRINT,'Part3 of 5 Has Already Started, Please Wait' ms = rad.Output_Raster mtd = ms.Metadata ;ENVI5 Introduced mtd.AddItem, 'Wavelength', [492,555,665,822] mtd.AddItem, 'Wavelength Units', 'Nanometers' qac = ENVITask('QUAC') ;ENVI5.1 Introduced ms = rad.Output_Raster qac.Input_Raster = ms qac.Output_Raster_URI = e.GetTemporaryFilename() qac.EXECUTE PRINT,'Part3 of 5 Finished, Takes '$ + STRING((SYSTIME(1)-t)/60, format='(f7.2)') + ' Minutes' ;4_ImageToImageRegistration PRINT,'Part4 of 5 Has Already Started, Please Wait' tps = ENVITask('GenerateTiePointsByCrossCorrelation') ;ENVI5.2.1 Introduced ms = qac.Output_Raster pn = radpn.Output_Raster tps.Input_Raster1 = pn tps.Input_Raster2 = ms tps.EXECUTE flt = ENVITask('FilterTiePointsByGlobalTransform') ;ENVI5.2.1 Introduced TiePoints = tps.Output_Tiepoints flt.Input_Tiepoints = TiePoints flt.EXECUTE rgs = ENVITask('ImageToImageRegistration') ;ENVI5.2.1 Introduced TiePoints2 = flt.Output_Tiepoints rgs.Input_Tiepoints = TiePoints2 rgs.Warping = 'Triangulation' rgs.Output_Raster_URI = e.GetTemporaryFilename() rgs.EXECUTE PRINT,'Part4 of 5 Finished, Takes '$ + STRING((SYSTIME(1)-t)/60, format='(f7.2)') + ' Minutes' ;5_GramSchmidtPanSharpening PRINT,'Part5 of 5 Has Already Started, Please Wait' gsf = ENVITask('GramSchmidtPanSharpening') ;ENVI5.2 Introduced ms = rgs.Output_Raster pn = radpn.Output_Raster gsf.Input_Low_Resolution_Raster = ms gsf.Input_High_Resolution_Raster = pn gsf.Output_Raster_URI = outdir + 'GS_Fusion' gsf.EXECUTE PRINT,'Part5 of 5 Finished, Takes '$ + STRING((SYSTIME(1)-t)/60, format='(f7.2)') + ' Minutes' e.CloseEND
发表评论
最新留言
很好
[***.229.124.182]2025年04月23日 16时38分22秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
How2Heap笔记(三)
2021-05-14
go--microSocket服务端 php客户端
2021-05-14
如何修改Pspice元件库中元件的模型参数?
2021-05-14
51单片机汇编程序——查表
2021-05-14
小程序提交新数据后如何返回上一页并刷新数据?
2021-05-14
qt c++实现的ai贪吃蛇吃满屏幕,超详细!(二)ai的具体实现
2021-05-14
linux 查看log日志相关命令
2021-05-14
IDEA 2019 安装 mybatis-plus插件
2021-05-14
div 实现光标悬停变成手型
2021-05-14
layer.confirm 无效
2021-05-14
Java 回调机制
2021-05-14
7、回归和特征选择
2021-05-14
pycharm使用(新建工程、字体修改、调试)
2021-05-14
什么是Numpy、Numpy教程
2021-05-14
Python学习笔记——元组
2021-05-14
异常声音检测
2021-05-14
PCB学习笔记——AD17如何添加新的封装
2021-05-14
numpy版本问题
2021-05-14