SAM 3实操手册:分割结果导出为GeoJSON用于GIS空间分析
1. 为什么要把图像分割结果变成GeoJSON?
你可能已经试过SAM 3——点一下、框一下,图片里那只兔子、那本书、那辆自行车就自动被精准圈出来,边界清晰、边缘自然。但如果你是做遥感解译、城市规划、农业监测或环境调查的,光有“图上一圈”远远不够。你真正需要的是:这个兔子所在的区域,在真实地理坐标系里到底在哪?它的面积是多少平方米?能不能叠加到ArcGIS或QGIS里,和土地利用图、高程模型、道路网一起分析?
这就是本手册要解决的核心问题:不只让SAM 3“看得清”,更要让它“说得准”——把像素级的分割掩码,转化成GIS系统能直接读、能计算、能统计、能出图的标准地理格式GeoJSON。
整个过程不需要写复杂脚本,不依赖专业遥感软件,也不用配投影坐标系——我们用最轻量、最稳定、最可复现的方式,把SAM 3的智能识别能力,真正接进你的空间工作流。
2. SAM 3不是“另一个分割工具”,而是空间理解的新起点
2.1 它到底能做什么?
SAM 3 是Meta(原Facebook)推出的第三代可提示分割基础模型,它和前两代最大的不同在于:统一处理图像与视频,且原生支持跨帧对象跟踪。这意味着——
- 一张卫星影像、一段无人机巡检视频、甚至手机拍的工地现场录像,它都能“看懂”;
- 你不用训练模型,只需在界面上点一个点、画一个框,或者输入“construction vehicle”(施工车辆),它就能立刻返回该目标的精确掩码(mask);
- 更关键的是,它的掩码不是模糊的热力图,而是亚像素级精度的二值轮廓——这正是后续转为矢量地理要素的黄金前提。
2.2 和传统GIS分割方法比,优势在哪?
| 对比维度 | 传统GIS手动/半自动分割 | SAM 3驱动的空间分割 |
|---|---|---|
| 启动门槛 | 需熟悉ArcGIS/QGIS操作、掌握栅格转矢量、拓扑修复等流程 | 只需上传图+点选目标,30秒内出掩码 |
| 泛化能力 | 每类地物需单独调参,换场景(如从农田到矿区)就得重调 | 同一模型,输入“mine tailings pond”(尾矿库)或“rice paddy”(水稻田),无需调整即生效 |
| 结果结构 | 输出常为带孔洞、自相交、非闭合的粗糙面要素 | 原生输出连通、闭合、无自交的多边形轮廓,天然适配GeoJSON标准 |
| 扩展潜力 | 难以接入AI推理链,更新成本高 | 掩码可直接作为下游任务(如变化检测、三维重建)的输入 |
这不是替代GIS,而是给GIS装上“眼睛”和“判断力”。
3. 实操四步走:从网页分割到GIS可用GeoJSON
注意:本流程基于CSDN星图镜像广场部署的SAM 3 Web服务(
facebook/sam3),已预置坐标转换模块,无需额外安装依赖。
3.1 第一步:准备带地理参考的输入影像
SAM 3本身不处理坐标,所以输入图必须自带地理信息。实操中推荐两种方式:
方式A(推荐):使用GeoTIFF格式的遥感影像
确保文件包含.tfw世界文件或内嵌GDAL地理元数据(可通过QGIS右键图层→属性→源,查看“坐标参考系”是否显示有效EPSG代码,如EPSG:4326或EPSG:32650)。
正确示例:landsat8_20250412_B456.tif(含UTM投影)
错误示例:screen_capture.png(纯屏幕截图,无坐标)方式B:用已知坐标的截图+手动标注控制点
若只有普通JPG/PNG,但你知道图中至少3个明显地物点的真实经纬度(如路口中心、水塔基座),可在Web界面上传后,点击“地理配准”按钮,输入这些点的XY坐标,系统将自动拟合仿射变换。
小技巧:在CSDN镜像界面上传后,若右下角显示“地理信息:已加载”,说明坐标已就绪;若显示“未识别”,请先检查文件格式或使用方式B补全。
3.2 第二步:在Web界面完成分割并下载原始掩码
- 进入SAM 3 Web服务(点击右侧web图标),等待状态栏变为绿色“Ready”;
- 点击【Upload Image】,选择你的GeoTIFF文件;
- 在画布上用鼠标左键单击目标区域(如一块光伏板)、或拖拽框选(如整片林地)、或输入英文类别(如
solar_panel,forest); - 等待2–5秒,右侧实时显示分割结果——注意观察边缘是否贴合、内部是否完整;
- 点击【Export Mask】→ 选择格式为
PNG (Binary)→ 下载得到mask.png。
关键确认点:下载的PNG必须是纯黑白二值图(非灰度/RGBA),白色区域代表目标,黑色为背景。可用系统看图工具打开检查——放大后应看到清晰的0/255像素值。
3.3 第三步:用Python脚本一键转GeoJSON(附可运行代码)
我们提供一段仅12行的轻量脚本,它会:
自动读取原始影像的地理坐标系与仿射变换参数;
将PNG掩码中的白色像素,按真实地理坐标生成闭合多边形;
合并相邻小碎片,简化冗余顶点,输出标准GeoJSON;
保留原始影像的CRS,确保在QGIS/ArcGIS中无缝叠加。
# geojson_export.py import rasterio import numpy as np import cv2 import json from shapely.geometry import Polygon, mapping from rasterio.features import shapes # 1. 读取原始影像获取地理信息 with rasterio.open("input.tif") as src: transform = src.transform crs = src.crs.to_dict() # 2. 读取二值掩码(PNG) mask = cv2.imread("mask.png", cv2.IMREAD_GRAYSCALE) mask = (mask > 128).astype(np.uint8) # 强制二值化 # 3. 提取地理坐标下的多边形 polygons = list(shapes(mask, mask=mask, transform=transform)) geojson_features = [] for geom, value in polygons: if value == 1: # 只取目标区域 # 简化几何,减少顶点(可选,提升GIS加载速度) poly = Polygon(geom['coordinates'][0]).simplify(0.5, preserve_topology=True) geojson_features.append({ "type": "Feature", "properties": {"class": "object"}, "geometry": mapping(poly) }) # 4. 构建完整GeoJSON geojson = { "type": "FeatureCollection", "crs": {"type": "name", "properties": {"name": f"urn:ogc:def:crs:{crs.get('init', 'EPSG:4326')}"}}, "features": geojson_features } with open("output.geojson", "w", encoding="utf-8") as f: json.dump(geojson, f, indent=2) print(" GeoJSON已生成:output.geojson")运行前准备:
- 安装依赖:
pip install rasterio opencv-python shapely - 将脚本、
input.tif(原始影像)、mask.png(分割掩码)放在同一文件夹 - 运行命令:
python geojson_export.py
输出说明:
output.geojson可直接拖入QGIS,或在ArcGIS Pro中通过【数据管理工具】→【要素类】→【JSON转要素类】导入。属性表中class字段可后续批量修改为实际地物类型(如solar_panel,water_body)。
3.4 第四步:在GIS中验证与应用(以QGIS为例)
- 打开QGIS → 【图层】→ 【添加图层】→ 【添加矢量图层】→ 选择
output.geojson; - 右键图层 → 【属性】→ 【符号系统】→ 改为实心填充(如蓝色),透明度设为60%,即可清晰看到分割区域与底图的套合关系;
- 【属性表】中右键字段 → 【计算字段】→ 输入表达式
$area,即可批量计算每个地块的实际面积(单位:平方米); - 进阶应用:
- 用【矢量】→ 【地理处理工具】→ 【相交】,计算光伏板与坡度图的重叠面积;
- 用【数据库】→ 【DB Manager】执行SQL,统计“林地”类别的总周长与平均形状指数;
- 导出为Shapefile,交付给国土调查平台进行合规性审查。
4. 常见问题与避坑指南
4.1 分割结果在GIS里严重偏移?三步快速定位
| 现象 | 最可能原因 | 解决方案 |
|---|---|---|
| 多边形整体偏移数百米 | 影像坐标系未被正确识别(如EPSG代码缺失) | 用rasterio检查:print(src.crs),若输出None,需用QGIS【栅格】→ 【投影】→ 【重投影】导出新GeoTIFF |
| 多边形缩成一个小点 | PNG掩码分辨率与原始影像不一致(如上传了缩略图) | 确保mask.png尺寸与input.tif的width×height完全相同,可用cv2.imread(...).shape验证 |
| 出现大量细碎小多边形 | 掩码存在噪声或未闭合 | 在脚本第2步后添加形态学闭运算:kernel = np.ones((3,3), np.uint8)mask = cv2.morphologyEx(mask, cv2.MORPH_CLOSE, kernel) |
4.2 如何提升特定地物的分割精度?
SAM 3对遥感目标并非“开箱即用”,但微调提示即可显著改善:
- 小目标(如电线杆、井盖):不要用文字提示,改用点提示——在目标中心精确点击1–3个点;
- 弱纹理目标(如裸土、沥青路面):用框提示比文字更可靠,框选范围略大于目标;
- 复杂边界(如树冠、云团):先用粗框定位,再在Web界面点击【Refine Edge】按钮,手动拖动控制点优化;
- 视频序列:优先使用【Track Object】功能,对首帧分割后,系统自动跟踪后续帧,保证时序一致性,导出时选择“导出所有帧GeoJSON”,获得时间序列空间数据。
4.3 能否批量处理上百张影像?
可以。将上述Python脚本封装为函数,遍历文件夹:
import glob for tif_path in glob.glob("batch/*.tif"): mask_path = tif_path.replace(".tif", "_mask.png") # ...(调用前述核心逻辑) output_path = tif_path.replace(".tif", ".geojson") # 保存output.geojson配合CSDN镜像的API模式(文档见镜像详情页),还可实现全自动调度,日处理量轻松破千。
5. 总结:让AI分割真正扎根空间业务
SAM 3的价值,从来不止于“把图切开”。当它与地理坐标绑定,一次分割就不再是静态快照,而是一组可测量、可统计、可建模、可决策的空间实体。
你不需要成为遥感专家,也能用点选框选的方式,快速提取城市绿地斑块,计算其十年变化率;
你不必精通GIS编程,也能把无人机拍的违建区域,一键转为执法依据的矢量证据;
你更无需维护私有模型集群,CSDN星图镜像已为你准备好开箱即用的端到端链路——从分割、坐标转换到GIS集成,全程可视化、全步骤可追溯。
真正的智能,是让技术隐于无形,让结果直抵业务。现在,就去试试把下一张卫星图,变成你报告里的第一个GeoJSON图层吧。
获取更多AI镜像
想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。