ENVI 5.3 SHP转ROI完全指南:原理、步骤与避坑
做遥感的人应该都遇到过这么个场面外业辛辛苦苦拿着 RTK 跑了半天圈出来的一片地块边界回到室内打开 ENVI 5.3却只能对着影像手动一笔一笔重新勾训练区。费时不说手一抖边界就偏了最后分类精度还说不清楚。其实 ENVI 早就给了正规通道就是把矢量 shp 转成 ROI只是菜单藏得有点深加上文件投影、要素类型这些细节稍不注意就会翻车。这篇文章就围绕 ENVI 5.3 矢量转 ROI 这件事把原理、流程、坑一次性讲透适合正在做监督分类、遥感制图或者精度验证的同行参考。1. 这不是玄学矢量转ROI到底在转什么1.1 为什么要把shp转成ROI很多人第一次接触“矢量转ROI”时心里其实不太理解我在 ArcGIS 里画得好好的面为什么要转换直接在 ENVI 里打开不行吗这个问题的答案取决于你接下来要做什么。ROI 的全称是 Region of Interest感兴趣区。在 ENVI 的分类流程里ROI 承担的角色是训练样本和验证样本的载体。比如你要做监督分类最大似然、支持向量机、随机森林这些算法都需要你提前告诉计算机“哪块区域是林地”“哪块区域是水体”这些样本就是 ROI。传统做法是人工在影像上放大、描边、圈选效率低而且边界不精确尤其是地块形状非常不规整的时候。这时候 shp 的价值就出来了。外业调查用 GPS 或者 RTK 测出来的边界ArcGIS 里做好的地类图斑规划院的用地数据这些本来就是面状矢量把它们的边界信息“翻译”成 ENVI 能读懂的 ROI等于直接把这些高精度样本喂给分类器既省时间又减少人为误差。转换后的 ROI 还能继续用来做掩膜裁剪、统计影像光谱特征、计算混淆矩阵做精度评估用途很广。1.2 方案选型三种走法怎么选在 ENVI 5.3 里shp 转 ROI 并没有唯一路径。根据我自己的使用习惯常用的有三种打开方式它们适合不同场景。第一种直接在 ROI Tool 里导入。打开 ROI 工具后通过菜单里的导入矢量选项把 shp 文件作为 ROI 加载。这个方式适合“只想导入矢量作为样本”不一定要把矢量叠加到当前影像视图上或需要批量导入多个文件时使用。第二种先把 shp 加载为矢量图层再右键导出。ENVI 5.3 支持直接打开 shp 文件并作为矢量图层覆盖在影像上在 Layer Manager 里右键这个图层就能看到“Export to ROI”之类的选项一键把它转成 ROI。这个方式最直观因为你能先在屏幕上确认矢量和影像是否套合再决定是否转换。第三种通过工具箱的搜索入口。ENVI 5.3 的工具栏里可以搜索“ROI”“Vector”等关键词找到相关工具再操作。对工具菜单比较熟悉的同行可以直接搜名字省得逐级翻菜单。这三种方式的核心原理都一样把面状矢量要素的边界坐标提取出来在 ENVI 内部生成对应的一组或多组封闭多边形并绑定到当前的 ROI 数据结构里。选中哪种路径主要看你当前界面操作顺不顺手。2. 动手前的关键准备shp文件本身才是坑最多的地方2.1 shp三件套与投影信息很多新手转 ROI 失败不是 ENVI 操作错了而是 shp 文件本身有问题。shp 虽然叫“一个文件”实际上标准组成是三个文件.shp 存几何坐标.shx 存索引.dbf 存属性表。三个文件只要缺一个ENVI 就可能读不出来或者读出来只有图形没有属性。做矢量处理之前第一件事就是确认这三个文件都在同一个文件夹里。更关键的是投影信息。shp 的坐标系信息一般存在一个可选的 .prj 文件里但很多外业设备导出的数据不带这个文件。没有投影信息ENVI 打开矢量的时候会弹出“无法读取坐标系统”之类的提示或者干脆认为它是未知坐标系。这个时候如果你还不当回事直接硬转结果往往是 ROI 的坐标和影像完全对不上——矢量跑到大洋彼岸去了或者明明应该覆盖某个山坡结果 ROI 落到了几公里之外的县城里。所以动手前必须核对两张坐标影像的 Map Info 和 shp 的投影。影像如果是 WGS-84 UTM 投影shp 最好也是同一套坐标系如果影像和 shp 都是地理坐标那也问题不大。最怕的是影像用投影坐标shp 用地理坐标二者没有统一就直接转换。这种情况就算 ENVI 不报错叠加结果也会让人怀疑人生。2.2 面、线、点要素对ROI的影响还有一个容易踩的坑是要素类型。ROI 在 ENVI 里本质上是闭合的多边形区域所以只有面要素Polygon才能丝滑转换。如果你拿到的 shp 是线要素Polyline或者点要素Point转换之后要么没有面积要么 ENVI 直接拒绝执行。举一个我自己的例子。以前做土地利用分类外业采集的验证点是点要素 shp当时想直接转成 ROI 来做精度评价结果 ENVI 提示“仅支持多边形要素”之类的内容。后来先到 ArcGIS 里用 Buffer 工具给每个点做了一个半径 30 米的缓冲区生成缓冲区面再导出为新的 shp转 ROI 就很顺利了。还有一次拿到的是地块边界线也是先做拓扑构面处理把线转成闭合面才完成了转换。所以拿到 shp 后先看一眼它的几何类型是最基础的检查。如果确实是线或点不要急着在 ENVI 里折腾先回到 GIS 软件里处理成面要素才是正路。2.3 属性字段决定转换后的ROI名字与个数面要素本身没问题下一步要看属性表。一个 shp 文件里通常有很多个图斑导入 ENVI 转 ROI 时默认可能是把这所有图斑当成一个 ROI 里的多个多边形也可能是每个图斑生成一个独立 ROI具体取决于版本和菜单选项。但不管哪种情况ROI 的命名大多依赖属性表里的某个字段。比如你的 shp 属性表里有一个叫“ClassName”的字段里面有“农田、林地、建筑”等类别导入时如果设置了“使用字段值作为 ROI 名称”ENVI 就会自动生成多个 ROI并以“农田”“林地”直接命名。如果你没选字段可能所有多边形都堆在一个叫“Untitled”的 ROI 里后面做分类时还得一个个手动拆分、重命名非常被动。这里有一个实际建议在导入前把属性表里代表地类或样本类型的字段整理干净最好用英文字段名值也不要包含特殊字符。有些版本的 ENVI 对中文字段名支持不好导进来要么乱码要么干脆读不到。提前在 ArcGIS 的字段计算器里把中文类别映射成英文缩写比如把“农田”改成“Cropland”后面能少很多麻烦。3. ENVI 5.3实际操作从打开影像到ROI落地的完整流程3.1 打开影像并加载矢量层确认好 shp 没问题之后就可以进入实操环节。我以 ENVI 5.3 的常规界面为例把整套步骤拆开讲。第一步打开你要分类的影像。无论影像来自 Landsat、Sentinel 还是高分卫星只要在 ENVI 里正常打开就行。打开之后最好先把影像显示出来方便后面判断矢量和影像的叠合位置。影像窗口出来后记一下窗口左上角或者元数据里的投影信息和范围这一步后面会用到。第二步加载 shp 矢量。在 ENVI 5.3 里直接用 File → Open或者把 .shp 文件拖进主界面ENVI 会把它作为图层加载到当前视图上。这个时候你大概率会看到两类结果一类是矢量完美覆盖在影像上地类边界和影像特征位置严丝合缝另一类是矢量图层显示不出来或者出现在扭曲、偏移的位置。出现后一种情况别慌绝大多数是坐标系没对上。这时可以右键加载进来的矢量图层查看它的元数据确认是否有投影定义。如果没有需要在菜单里给它指定正确的投影。指定完再刷新视图正常情况下矢量就能回到正确位置上。这一步做好了后面转换 ROI 基本一马平川。3.2 通过ROI Tool导入矢量矢量加载成功并和影像套合之后接下来就是转 ROI。我个人觉得最顺手的路径是在工具箱里搜索 “ROI”打开 Region of Interest (ROI) Tool。这个工具打开后是一个相对独立的窗口里面显示当前影像的所有 ROI 列表一开始是空的。在这个 ROI Tool 里找到导入矢量的入口。不同版本菜单名称可能略有差别常见的是 File → Enter/Setup ROIs from Vector Layers或者是 Options → Import ROI from Vector。点击后在弹出的对话框里选择刚才加载的 shp 文件。这里有一个容易忽略的步骤如果 shp 没有 .prj 文件ENVI 会弹出一个坐标系选择对话框你需要手动指定它的投影比如 WGS-84 UTM 50N或者 WGS-84 地理坐标务必和影像坐标系保持一致。如果 shp 已经有投影文件ENVI 会自动读取你只需要确认右下角的坐标系描述是否和影像一致就行。确认无误后点击 OKROI Tool 的列表里就会多出 ROI 条目。如果设置了按属性字段命名列表里会直接出现对应类别的名称如果没有则可能是默认名称或者 Untitled。3.3 参数设置与ROI整理导入成功后不要急着关窗口整理 ROI 这一步同样重要。首先是查看每个 ROI 包含的多边形数量。在 ROI Tool 里每个 ROI 条目都能展开看到它包含几个多边形。如果你期望的是“每个地块单独一个 ROI”但实际上所有地块被合并成了一个 ROI就需要右键拆分或者重新按字段导入。反之如果你有 200 个地块结果生成了 200 个 ROI做分类时会觉得列表太乱不妨用合并功能把相同类别的 ROI 合并成几个大的类别样本。其次是检查 ROI 和影像的套合情况。在 ROI Tool 里勾选某个 ROI 的显示开关回到影像窗口应该能看到这个 ROI 覆盖在影像上的轮廓。如果轮廓位置正确、边界顺滑说明坐标系转换成功。如果轮廓明显偏到某个方向说明坐标系没统一回到上一步修改。最后记得保存 ROI。ENVI 的 ROI 可以保存为 XML 文件下次打开同一景影像时直接 File → Save ROIs就能把这些样本带着走。这一步看似简单但很多人做到一半就跳过结果电脑重启重来一遍。4. 踩坑实录转换后对不上、导不进、没面积怎么办4.1 投影不匹配导致整体偏移矢量转 ROI 最常见的翻车现场就是转换结果整体偏移。现象是ROI 在影像上确实存在但位置和影像内容对不上明明应该是林地ROI 却落在相邻的农田上。这种情况十有八九是投影坐标系不一致。我之前处理浙江某区块的影像影像用的是 WGS-84 UTM 51N 投影外业给的 shp 却是 WGS-84 地理坐标单位是度。直接在 ENVI 里打开时矢量虽然能显示出来但位置被拉到了影像范围外很远的地方。当时也没细看硬转 ROI结果 ROI Tool 里生成了一大堆超出影像范围的多边形统计出来全为零。后来重新给 shp 指定了正确的投影再转一次问题立刻消失。排查方法是在打开 shp 之后立刻确认它的地图单位是 meters 还是 degrees。如果是 degrees而影像单位是 meters中间差了投影转换别指望 ENVI 自动帮你完成必须手动在导入前设置。4.2 线要素、点要素转不出有效的ROI第二个高频问题就是之前说的线要素和点要素。ENVI 在导入矢量转 ROI 时虽然不会每次都给一个明确的“必须面要素”的报错但你多半会看到一个空 ROI或者 ROI 的面积计算出来是零或者生成出来但在影像上根本显示不了什么轮廓。如果你不确定手头 shp 是面还是线在最开始加载完毕后右键图层看属性就能看到 Geometry Type 字段。如果是线先在 ArcGIS 里用 Feature To Polygon 或类似工具构建面如果是点用 Buffer 生成一定半径的缓冲区面。缓冲区半径的设定取决于影像空间分辨率和你做精度验证的容忍度比如 30 米分辨率的影像验证点缓冲区半径设 30 米到 45 米比较合理太大会让多个点融合太小又失去作为面积样本的意义。4.3 转完找不到ROI、名字全乱还有一类情况是转换过程表面上很顺利但转换后 ROI Tool 里面看不到东西或者看到一堆名字乱掉的 ROI。看不到东西可能是 ROI Tool 的列表没有当前影像关联。有些同行习惯先打开 ROI Tool再打开影像这时候 ROI Tool 是关联到之前的影像的新打开的影像并没有和它绑定。解决办法是在 ROI Tool 里重新选择关联图像窗口或者关掉 ROI Tool在影像窗口激活的状态下重新打开。名字全乱多和属性字段相关。特别是中文属性值在 ENVI 5.3 里可能显示成乱码导致 ROI 名称变得难以辨认。所以前面我反复强调在 ArcGIS 里提前把类别字段改英文是一个很关键的预处理步骤。如果你已经导入了乱码 ROI也可以在 ROI Tool 里手动重命名右键 ROI 条目选择 Rename 即可但这只适合少量类别图斑很多时工作量会爆炸。4.4 一个快速排查表把平时遇到比较多的问题整理成了下面这个速查表适合每次转 ROI 前先过一遍。问题现象可能原因解决办法shp 无法打开或拖不进 ENVI缺少 .shx 或 .dbf 文件回到源目录补齐三件套打开后矢量位置偏移投影不匹配或缺失 .prj手动指定正确坐标系与影像统一转换出的 ROI 没有面积shp 是线要素或点要素先在 GIS 中转面或做 BufferROI 名称全是 Untitled未选择属性字段命名导入时勾选字段或导入后手动重命名ROI 列表为空ROI Tool 与影像未关联重新打开 ROI Tool 并与当前影像关联中文字段值乱码ENVI 对中文支持不佳属性值改用英文字段或数字代码图斑数太多ROI 列表很长每个图斑生成了独立 ROI按类别字段合并或导入前先做 Dissolve5. 经验延展从“能转”到“用得顺”5.1 批量处理与组织学会了单个 shp 转 ROI 以后很多人会问我有几百个地块文件难道要一个个手动转换吗在 ENVI 5.3 里这个问题其实可以通过批量思维来解决。批量处理的前提是这些 shp 文件的内部结构保持统一。比如都使用同样命名的类别字段、都使用相同坐标系、都包含面要素。如果满足这些条件你完全可以在 GIS 软件里先把它们合并成一个大的 shp 文件再用一个带有类别属性的字段区分各地块导入 ENVI 后转换成多个 ROI。这个思路可以大幅减少重复操作。但如果你的多个 shp 文件属性结构各不相同强行合并反而麻烦。我的习惯是在 ArcGIS 或 QGIS 里先做一次字段标准化把不同来源的类别字段统一命名为同一个字段名然后再合并。这样后期转换 ROI 名称来源只有一个逻辑清晰后续做混淆矩阵也方便。5.2 与其他SHP处理流程的衔接将 shp 转 ROI 只是整条矢量处理流程中的一环。在实践中矢量 shp 还需要经常和 txt 坐标文件、GDB 地理数据库、外边界线等处理方式衔接。如果你后续要导出坐标点做批量统计shp 转 txt 时要注意经纬度顺序一般 ENVI 内部用 X、Y 表示但 txt 文件里到底是先写经度还是先写纬度取决于最终接收数据的工具最好先导出几行确认后再批量处理。另外很多同行会问 shp 和 GDB 是不是一样的东西。它们的几何组织和属性结构并不完全等价在 ENVI 这种更偏遥感处理的软件里shp 的兼容性其实更高而 GDB 更适合在 Esri 环境中管理和查询。如果你需要从 GDB 里取数据转 ROI建议先在 ArcGIS 里把要素类导出为不包含复杂拓扑的普通面 shp再进入 ENVI 操作可以省掉不少兼容性麻烦。如果只想保留 shp 的外边界而不是内部细碎图斑可以在 GIS 里先做 Dissolve融合再转成全图外边界线导回 ENVI 参与 ROI 处理也能避免图斑过碎导致的样本混淆。5.3 转完ROI之后还能做什么矢量转 ROI 不是终点。ROI 就绪之后可以做的事情很多。做监督分类时直接用这些 ROI 计算光谱统计特征、生成训练样本再跑分类器做变化检测时可以用 ROI 作为掩膜把研究区以外的区域屏蔽掉只分析重点区域分类完成后需要精度验证也可以用独立采集的验证点缓冲区 ROI和分类结果做混淆矩阵得到总体精度、Kappa 系数、用户精度、生产者精度等指标。我自己比较常用的一个组合是先用高精度外业边界 shp 转 ROI做一次严格训练样本再用验证点缓冲区 ROI 做独立精度评价。这样得到的一系列精度指标说服力会比较强审稿人或者项目验收方问起来也有完整的数据链支撑。最后再分享一个小技巧。ENVI 5.3 里打开 shp 后每次修改 shp 里的属性字段都要重新导入才能更新 ROI 列表不会自动同步。所以做项目时建议先把 shp 的类别字段、投影信息、几何类型都定稿再一次性转 ROI。我早期吃过不少亏改一次类别就要重转一次不仅浪费时间还容易出现前后 ROI 命名不一致的乌龙。把这个习惯养成之后遥感分类的流程明显顺畅了很多。
上一篇/下一篇内容由系统自动关联
返回资讯列表 →