ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

ENVI多TIF整合:镶嵌与图层堆叠全流程实操指南

ENVI多TIF整合:镶嵌与图层堆叠全流程实操指南 做遥感数据处理的人十有八九都遇到过同样的问题手里一堆TIF文件比如2003年到2011年每年一景想最终整合成一个完整的TIF在ENVI里却不知道该点哪个工具甚至有人把镶嵌和堆叠混为一谈折腾一整天出来的文件既不是想要的空间范围也不是想要的波段结构。这篇文章就把ENVI处理多TIF整合这件事讲透分别说清楚什么时候用镶嵌Mosaic、什么时候用图层堆叠Layer Stacking然后给出可复现的操作步骤、批量处理方案以及我实际踩过的一些坑。无论你是刚开始接触遥感数据的新手还是被多年存档数据搞得头大的从业者只要你手里的TIF需要合并这篇都值得看完。最后一部分还补充了几个整合完成后的扩展玩法让你不白费这份整理功夫。1. 拿到一批TIF先别急三步判断你要镶嵌还是堆叠多个TIF整合到一个完整的TIF这句话本身有歧义。我在项目沟通里见过很多次数据提供方说要整合实际要的东西千差万别。最常见的三种需求是空间拼接一批TIF分幅覆盖不同位置比如标准景、按格网裁剪的分块需要拼成一张覆盖全部范围的大影像。时间堆叠一批TIF覆盖同一范围但来自不同年份比如2003、2004……一直到2011需要放进同一个文件里做时间序列分析。先拼后叠每年有多个分割的TIF先把每一年拼成一张年度影像再把多年年度影像堆叠成一个多波段TIF。如果第一步不加区分后续所有操作都可能白费。下面这张表是我经常用来跟同事对齐需求的也分享出来需求类型输入数据形态输出结果对应ENVI工具空间拼接多幅相邻图幅单幅无缝大影像Seamless Mosaic时间堆叠同范围多时相影像单文件多波段Layer Stacking先拼后叠每年多幅相邻图幅单文件多波段年度序列Mosaic Layer Stacking1.1 快速判断技巧查看两个TIF的范围拿2003和2004年的两个TIF来说在ENVI Layer Manager里把文件都拖进来右键选择View Metadata。对照Map Info或者Corner Coordinates看中心坐标和四角坐标两个文件中心点相差几十公里、边界刚好相邻或者只有少量重叠说明是镶嵌需求。两个文件中心点几乎重合、范围重叠度95%以上则更可能是堆叠需求。如果两个文件既相邻又有重叠那也可能是接边带设计得不合理的镶嵌需求要检查边界。还有一个更直观的办法把两个文件用不同颜色渲染同时叠加显示。如果它们完全重合影像中心位置会完全重叠如果错开或拼接成更大的范围一眼也能看出来。1.2 别忘了一致性检查三件套不管哪种需求合并前都要检查三个基础信息投影、分辨率、像素深度。投影全部TIF必须使用同一个投影坐标系。如果有的是WGS84经纬度有的是UTM Zone 49N直接合并会让图像错位。分辨率像元大小必须一致或者至少在重采样后一致。0.5米和10米的数据混在一起输出结果很难用。像素深度最好统一成同一种数据类型Byte、UInt、Float等。镶嵌时不同深度的图像也可以处理但要小心取值范围的截断问题。这三个检查可以在ENVI的Metadata面板里逐个确认。遇到不一致的先在Raster Management - Reproject Raster和Resample Raster里统一。2. 无缝镶嵌Seamless Mosaic全流程把分散图幅拼成一张大TIF如果你的需求是空间拼接ENVI里的主力工具是Seamless Mosaic翻译过来叫无缝镶嵌。它不只是简单把图放一起还提供接边线自动生成、颜色平衡、羽化等功能。2.1 打开工具与加载数据在ENVI 5.x5.6、5.7界面一致里打开方式有两种一是在顶部搜索框直接输入Mosaic回车即可二是在Toolbox中依次展开Mosaicking - Seamless Mosaic。打开后在界面左侧点加号选中全部需要镶嵌的TIF文件。如果文件数量很多可以直接全选批量添加。ENVI会自动读取每个文件的坐标边界并把它们按实际位置显示在预览窗口里。这个步骤看起来简单但我遇到过不少翻车现场有些TIF带有错误的地理坐标加载后显示在世界地图的错误位置这时候如果直接运行镶嵌输出结果范围会乱。建议在预览窗口先目视确认每个文件的位置是否正确。2.2 关键参数背景值、羽化和输出选项Seamless Mosaic界面分左右两侧左侧是文件列表右侧是参数设置。重点参数如下Background Value背景值影像外接矩形内没有有效数据的区域默认通常是0但要注意如果你的影像里地物真实值包含了0比如水体像元值是0则必须改用一个特殊值比如-9999或者在后续用掩膜处理。Feathering Distance羽化距离用于拼接缝两侧的过渡带。一般设为像元尺寸的10-15倍比如2米分辨率的影像羽化距离设在20-30米左右。太大容易让地物边缘模糊太小又压不住接缝。Color Balancing颜色平衡如果输入的各景影像亮度、色调差异大建议开启。ENVI会基于重叠区域的直方图做匹配大幅减少明显的色块边界。Output Format输出格式一定要选择TIFF/GeoTIFF。很多新手漏掉这一项默认输出ENVI的.dat格式用其他软件打开时就懵了。2.3 运行前的小建议先小范围试拼我处理过上百景的镶嵌任务最大的教训就是不要一上来全量跑。一次镶嵌耗时短则几十分钟长则几个小时如果某个参数设错了全量白跑。建议的流程是先从文件列表里挑两三景相邻的图幅用同样的参数跑一次。输出后在ENVI里正常打开检查接缝位置是否存在错位、色差是否可接受。确认没问题后再全量镶嵌。这个小步骤耽误不了几分钟但能省掉大量返工时间。3. 图层堆叠Layer Stacking实操让2003-2011年变成同一个TIF的多个波段如果需求是时间序列整合比如2003、2004、2005……一直到2011年每年一景TIF范围完全一致这时候要用Layer Stacking又叫图层堆叠。它把多个单波段影像按波段顺序放进同一个文件里最终形成一个多波段TIF2003年是Band 12004年是Band 2以此类推。3.1 为什么要用堆叠而不是直接镶嵌同样都是整合成一个TIF镶嵌是在空间上合并堆叠是在波段上合并。对于时间序列数据堆叠的好处很明显保留每个年份的独立信息不会被颜色平衡、羽化等操作平滑掉。后续做NDVI时间序列、变化检测、纹理特征提取时一个文件就搞定不用频繁切换数据。深度学习框架读取多波段TIF通常比读取多个单文件更方便。3.2 操作步骤在Toolbox中搜索Layer Stacking或展开Raster Management - Layer Stacking。在弹出的对话框中点击Add Files把2003-2011年的TIF文件全部添加进来顺序按年份排列。在File List中拖拽或上下移动波段确保波段顺序正确。可以给每个波段重命名比如把Band 1改成NDVI_2003便于后面识别。点击OK后在Output File处指定输出路径同时选择输出格式为TIFF/GeoTIFF。点击OK运行得到最终的多波段TIF文件。这里要特别提醒Layer Stacking要求所有输入影像的尺寸行数、列数一致。如果2003年影像的列数是40002004年变成了4500某些版本会警告尺寸不一致。处理方法是用Raster Management - Resample Data先把影像统一到相同的范围和像元大小再执行堆叠。3.3 校验输出结果堆叠完成后我建议做三个校验查看Metadata里的Dimensions确认波段数量与年份数一致。用ENVI的Link工具把输出文件和任一年份原始文件关联起来同步放大缩小确认地理位置和像元大小没有偏移。用波段集统计Statistics看看各个波段的像元值范围是否和原始单波段一致。如果发现某一年波段全黑或者数值异常优先检查原始文件的投影和像素深度是否混用。4. 上百个TIF批量整合ENVI Modeler和脚本化处理的提速方案手工操作适合几十个文件如果你手里是2003-2011年每年又有十几个图幅加起来几百个TIF还在对话框里一个个点效率就太低了。下面给出两种提速方案。4.1 用ENVI Modeler建模可视化批处理ENVI Modeler是5.x内置的可视化建模工具可以通过拖拽节点搭建一条处理链路以后每次换数据路径就可以复用。基本流程是打开Toolbox - Modeler - Build New Model。在左侧节点面板中搜索Raster和MosaicRaster把输入节点和Mosaic任务节点拖到画布。把Raster节点的输出连接到MosaicRaster节点的Input Raster输入。在MosaicRaster任务节点中设置输出路径、背景值、羽化距离等参数。加入Output节点保存模型为.model文件。之后每次运行只需要重新指定输入文件路径。Modeler的最大优势是可视化适合多人协作时把流程讲清楚。缺点是一次处理太多文件时界面交互稍显笨重。4.2 用IDL脚本在ENVI引擎里跑如果模型深度复杂或者你更习惯写代码可以用IDL调用ENVI API。下面是我常用的一种骨架以镶嵌为例; 假设所有TIF在同一目录下 compile_opt IDL2 e envi(/headless) files file_search(D:\data\2003\*.tif) raster e.OpenRaster(files) task e.GetTask(MosaicRaster) task.INPUT_RASTER raster task.OUTPUT_RASTER_URI D:\data\2003_mosaic.tif task.Execute print, done堆叠的写法类似e envi(/headless) files file_search(D:\data\annual\*.tif) rasters e.OpenRaster(files) task e.GetTask(BuildBandStack) task.INPUT_RASTER rasters task.OUTPUT_RASTER_URI D:\data\stack_2003_2011.tif task.Execute print, stack done不同ENVI版本的Task名称可能有细微差异首次运行前先查看帮助里的Available Tasks。脚本的好处是方便加循环按年份循环、按图幅循环几分钟就能把几百个TIF整理完。4.3 批处理的三个实用原则先跑通最小单元用两三个文件把脚本或模型跑通再全量执行。输出路径区分清楚按年份建子目录避免覆盖已有文件。存储空间预留多个高分辨率TIF镶嵌后文件体积往往是原始文件体积之和甚至更大。全量处理前先估算磁盘剩余空间。5. 翻车记录与避坑要点背景值、投影、数据格式这些细节不能省这一部分写几个我真实遇到过的问题。有些问题排查起来不难但第一次遇到时会让人摸不着头脑。5.1 背景值设成0结果把有效像元也扣掉了有一次我用海表温度数据做镶嵌原始像元值中0是有效温度数据。我在Seamless Mosaic里没有改背景值直接用默认0运行结果输出影像上大片黑色空洞那些真实的海表温度0值区域全被当成了背景。修复方案也简单把背景值改成-9999或者使用ENVI的Mask功能把有效区域单独提出来。这类问题的本质是数值0和无效NoData的混淆。遥感影像中无效值常见的是0、255、-9999。在做镶嵌前务必打开Metadata查看数据类型和像元值范围确认是否存在真实0值。5.2 投影不统一导致镶嵌后错位2019年我处理过一个项目甲方给了两个相邻测区的TIF一个用的是WGS84地理坐标系一个用的是UTM投影坐标。直接镶嵌结果当然不对位接缝处出现明显的重影和错位。后来我通过Raster Management - Reproject Raster把其中一个转换到另一个投影重新镶嵌才正常。更隐蔽的是UTM Zone不同但投影类型相同比如一个在Zone 50另一个在Zone 51两种数据在ENVI里都显示UTM但如果坐标系定义里没写Zone号叠加时会发现两条影像错开。处理这类问题的原则是合并前统一到同一投影且最好用UTM这类投影坐标做镶嵌避免经纬度坐标下长度变形影响拼接精度。5.3 输出格式选择了ENVI标准格式其他软件打不开很多新手在输出时没有注意到File Format下拉框默认生成了ENVI标准格式.dat .hdr。这种格式ENVI自己打开没问题但拿到ArcGIS、QGIS或者其他平台里就要手动选择文件类型。你如果需要的是TIF记住在输出阶段显式选择TIFF/GeoTIFF。反过来也有一种情况某些ENVI中间分析结果比如大气校正后的表面反射率产品包含了多光谱图层、波长信息等元数据转成GeoTIFF之后这些元数据会丢失。如果后续还要在ENVI里继续分析可以用ENVI格式保存一个工作副本另存一份GeoTIFF用于交换。5.4 没有地理参考的TIF不能直接参与镶嵌偶尔会遇到一些TIF打开后显示未定义坐标或者位于(0,0)位置。这种文件没有记录投影信息ENVI无法判断它在真实世界的位置。我的处理习惯是根据数据来源文档在文件管理器中选中该文件右键选择Edit Header在Map Info或Projection信息里手动指定对应坐标系然后再参与镶嵌或者堆叠。如果实在找不到参考坐标还有一个土办法用一个已知位置的同区域TIF作为基准通过地面控制点把无坐标影像配准到正确位置。不过这个流程工作量不小适合少量文件不适合批量场景。5.5 文件体积暴涨多波段TIF的体积等于单波段体积乘以波段数听起来逻辑很直白但实际很多人忽略了一件事堆叠后如果选择不压缩文件可能会占满磁盘。比如原始每个TIF是500MB9个波段堆叠后就是4.5GB左右。再叠加镶嵌输出时的背景区域体积会更夸张。解决办法是在Layer Stacking输出时选择压缩选项ENVI支持LZW等手段或者后期用其他软件转成压缩格式GeoTIFF。不过压缩对后续随机读取性能略有影响需要根据你的使用场景权衡。6. 整合之后的TIF还能做什么三个我从实际项目里验证过的方向费了不少功夫把几百个TIF整理成一个完整的TIF不是为了好看后面往往还有一堆事要接着做。这里分享三个我自己验证过的高频用途算是一点扩展思路。6.1 多波段时间序列做变化检测如果整合后的结果是一年一个波段的时间序列TIF在ENVI里可以直接计算波段间的差值、比值或者用趋势分析方法找出变化显著的区域。比如做城市扩展分析一个2010年波段和一个2020年波段相减高亮区域基本就是新增建设用地。这个操作不需要写复杂代码简单的Band Math就能完成非常实用。6.2 纹理特征提取与分类输入ENVI里有一组很常用的纹理特征提取工具在Toolbox中搜索Co-occurrence基于灰度共生矩阵计算均值、方差、同质性、对比度、相关性等纹理特征。之前我把一个镶嵌后的高分辨率TIF切片成训练样本然后跑纹理特征提取再把原始波段、纹理特征和已有标签一起送入分类器精度比只用原始波段高了不止一档。如果你在搜索envi提取纹理特征怎么操作这个方向就是入口。6.3 深度学习样本制作与模型输入这几年深度学习在遥感里用得多模型训练前通常需要把大影像裁切到固定尺寸。一堆散碎TIF直接喂给脚本处理逻辑会写得很难受。把2003-2011年所有数据整合成一个多波段TIF后代码层面只要处理单一文件切块、增强、数据划分都方便得多。我实际跑深度学习语义分割时经常用一段简单的Python脚本读取这个大TIF按固定步长切patch速度很稳定。这三个方向的共同点是都建立在数据已整理成一个完整TIF的基础上。前期多做一步标准化的整合后面算法、模型、出图的工作会顺很多。按照我的习惯数据整合完不是马上删掉原始文件而是在项目文件夹里留一份原始的TIF归档整合后的完整TIF放在另一个analysis目录中文件名里标注投影、像素深度、波段顺序。这个习惯帮我在后续很多次返工中避免了重新找数据重头处理的尴尬。如果你也准备用ENVI整合多年TIF从最开始就养成这种归档习惯后面会轻松很多。
返回列表