ARTICLE DETAIL

资讯详情

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

Photoscan生成DEM与正射影像:参数链、GDAL后处理与精度验证

Photoscan生成DEM与正射影像:参数链、GDAL后处理与精度验证 简介面向无人机航测、摄影测量与三维重建方向的初学者和从业者这份 PDF 以 Agisoft Photoscan 为工具梳理从原始照片到 DEM 及正射影像的完整生产链路重点解决坐标系统设定、像控点布设、空三优化与成果导出中的操作疑问。资源包仅含 1 个 PDF 文件体积约 512KB属于轻量型流程手册便于查阅和打印。内容按参数预设、添加照片、装载相机 POS、检查相机校准、对齐照片、标记、优化照片对齐、设置边界框、建立密集点云等环节展开并补充构建网格、编辑几何、构建纹理、Build DEM 与 Orthomosaic 等后续步骤对精度、配对预选、关键点数量、深度过滤、纹理大小等参数给出推荐值同时说明 GCP 均匀分布、标记精度与坐标系设置要点。目前已有 1357 人学习下载适合希望快速掌握 Photoscan 航测处理流程、对照实操查漏补缺的读者。1. 从一组航拍照片到DEM和正射影像Photoscan这条链路真正难在哪一块200米见方的土方场地飞手带回来八百多张照片甲方要的是两样东西能算填挖方量的 DEM和能当底图量距离的正射影像。很多人以为把照片丢进 Photoscan、点两下工作流就完事实际结果是点云拉花、地表鼓包、正射接边错位一套问题接着一套。难点不在软件会不会用而在参数之间是有依赖关系的照片对齐没做稳后面深度图质量拉到 Ultra 也救不回来坐标系统选错DEM 的平面位置和高程都对不上真实世界导出时 nodata 没设进 GIS 一做统计全图最大值直接爆掉。这篇按实际生产顺序拆开讲控制点布设与坐标系统、对齐与深度图的参数取舍、密集点云栅格化成 DEM、正射影像镶嵌与分块导出以及 DSM 转 DEM 之后用 GDAL 做的后处理和精度验证。做航测、土方、矿山、工程测量的可以直接照着参数改。2. Photoscan生成DEM的参数链从控制点到栅格化2.1 控制点与坐标系统DEM能不能落到真实世界Photoscan 的相机对齐只负责把照片摆到互相自洽的位置上它给出的位置是相对的。要让 DEM 能和其他数据叠、能量测必须靠外部约束把它拽到真实坐标系里这件事有两个来源影像自带的 POS 数据无人机 RTK/PPK 记录的中心点坐标和姿态以及地面控制点GCP。POS 精度够的时候RTK 固定解、平面高程都在厘米级可以直接用 POS 做参考约束不布 GCP 也能出厘米到分米级的成果。POS 是单点 GPS 记录的就必须布 GCP通常按区域边缘加中心布设一块 200 米见方的场地布 5 到 9 个足够用油漆十字或对空标志RTK 打点。投影这块要特别注意两点。一是平面坐标系统国内工程常落在 CGCS2000 的 3 度带高斯投影上在 Photoscan 的参考设置里选对应的 EPSG 代码别用经纬度去出图否则面积和距离量算会有形变。二是高程基准RTK 打出来的通常是正常高1985 国家高程基准而 GNSS 原始记录的是椭球高两者差一个高程异常值如果不做改正DEM 的高程会整体偏移几米而且这个偏移在同一个项目里是常量很容易被忽略。稳妥做法是控制点导入时就把正常高写进去检查点也做同样处理。导入后要先在参考面板里看误差列超过阈值的点先别急着优化回头看是不是打错了点号或者照片刺点偏了。2.2 对齐照片的精度与关键点上限怎么设对齐是整条链路的地基。参数只有几个但组合起来差别很大。精度档位关键点上限建议连接点上限建议典型场景相对耗时Highest6000010000小范围、纹理弱裸地、水面边最高High400004000常规航测生产默认高Medium200002000大面积快速预览、查重叠中Low80001000只做定位排查低关键点上限决定每张影像提取多少特征点连接点上限决定最终参与光束法平差的同名点数量。把关键点拉到 60000、连接点还是 4000多出来的特征点大部分会被淘汰白耗内存。反过来纹理弱的区域比如大面积水泥地、水面边缘把连接点压到 1000 以下平差很容易发散。通用预选generic preselection一定要开参考预选reference preselection在 POS 可靠的时候也开能大幅缩短匹配时间。对齐完先看两个指标一是每张照片的投影误差二是相机估计参数里的焦距残差。有明显离群的照片直接禁用。2.3 深度图质量与滤波密集点云的成色在这一步决定比较新的版本把密集点云拆成了两步先算深度图再从深度图重建点云。质量档位本质上是对原始影像的降采样倍数。质量档位影像降采样内存占用适用场景Ultra原图极高小面积、精细建模High1/4高常规 DEM 生产Medium1/16中大范围快速出图Low1/64低只做预览滤波参数决定深度图里那些低置信度的匹配点要不要留下。Aggressive 最干净会把植被边缘、屋檐、电线这类飞点抹掉代价是细节也少一点Moderate 是常用折中Mild 保留更多细节但噪声多Disabled 基本等于不滤只在特殊需求下用。import PhotoScan # 较新版本改为 import Metashape as PhotoScan doc PhotoScan.app.document chunk doc.addChunk() # 导入照片指定坐标系控制点从参考文件读入 chunk.addPhotos(photo_list) chunk.crs PhotoScan.CoordinateSystem(EPSG::4547) # CGCS2000 3度带 chunk.importReference(gcp_path, formatPhotoScan.ReferenceFormatCSV, columnsnxyz, delimiter,) # 对齐High 精度开启两种预选关键点 40000连接点 4000 chunk.matchPhotos(accuracyPhotoScan.HighAccuracy, generic_preselectionTrue, reference_preselectionTrue, keypoint_limit40000, tiepoint_limit4000) chunk.alignCameras() # 用控制点优化一次把残差大的点剔掉后再优化 chunk.optimizeCameras(fit_fTrue, fit_cxTrue, fit_cyTrue, fit_k1True, fit_k2True, fit_k3True, fit_p1True) # 深度图 密集点云 chunk.buildDepthMaps(qualityPhotoScan.HighQuality, filterPhotoScan.ModerateFiltering, reuse_depthFalse) chunk.buildDenseCloud(point_colorsTrue, keep_depthTrue)buildDepthMaps里的quality和上面表格对应filter建议从 Moderate 起步reuse_depthFalse表示每次重新算深度图改了对齐结果之后必须重算否则用的还是旧深度。buildDenseCloud的keep_depthTrue会保留深度图好处是后面改 DEM 参数不用重算点云代价是项目文件体积翻倍。2.4 从密集点云生成DEM源、插值与边界从点云到 DEM 是一次栅格化参数里最影响成果的是插值方式和源数据选择。# 用密集点云直接生成 DEM插值只填内部小空洞 chunk.buildDem(sourcePhotoScan.DenseCloudData, interpolationPhotoScan.EnabledInterpolation, projectionchunk.crs, regionchunk.region, resolution0.05) # 单位与投影一致这里是 5cm chunk.exportDem(dem_raw.tif, formatTIFF, projectionchunk.crs, nodata-9999, write_worldTrue, tiff_bigTrue)source有三个常见选项DenseCloudData 直接用点云插值成果最贴近地表细节ModelData 从网格模型采样速度快但受网格分辨率限制ElevationData 是引用上一版 DEM一般不用。interpolation的 Disabled 完全不填洞出来的 DEM 会有大片 nodata适合要做严格质量控制的项目Enabled 填内部空洞但保留外边界是最常用的Extrapolated 会把边界也外推一段不推荐用于面积量算。resolution不要设得比点云平均间距还小否则插值出来的栅格看着密实际全是假的。3. Photoscan正射影像生产与DOM镶嵌的落地参数3.1 surface 用网格还是用DEM正射投影的两种底座正射影像的本质是按每一个像素的平面位置反算它在哪张照片上再把颜色取回来。反算需要高程这个高程从一个表面模型上读。Photoscan 提供两种表面网格模型Mesh和 DEMElevationData。用网格的好处是能表达竖直面桥梁、挡墙、建筑立面不会出现投影错位代价是网格本身可能包含悬空错误面正射上会出现莫名其妙的色块。用 DEM 做底平面地形最干净山区或高差大的地方要注意 DEM 分辨率要够否则陡坡上每个像素的高程都偏一点正射会糊。经验判断面积量算、平地土方、矿山平面图用 DEM 做底就够要出建筑立面专题或者城区高密度建模用网格。选择在buildOrthomosaic的surface参数里指定。3.2 颜色校正与镶嵌模式让接边看不出来大面积正射最难看的不是精度是块与块之间的色差。Photoscan 有三个层次的校正影像级别的颜色平衡color_correction、单张调的调色调色板里的曝光/白平衡、以及镶嵌时的混合方式。# 先建网格用 DEM 做正射的话这一步可以跳过 chunk.buildModel(surfacePhotoScan.HeightField, sourcePhotoScan.DenseCloudData, interpolationPhotoScan.EnabledInterpolation, face_countPhotoScan.HighFaceCount) # 生成正射底面用 DEM镶嵌用 Mosaic chunk.buildOrthomosaic(surfacePhotoScan.ElevationData, blendingPhotoScan.MosaicBlending, color_correctionTrue, seam_markerFalse, fill_holesTrue, projectionchunk.crs)color_correctionTrue会在整个数据集上做一次全局色调统一处理前必须保证每张影像的曝光参数没有大起大落否则校正结果会偏。blending有三个值Mosaic 是默认的按拼接线硬拼接边界清晰、速度快Average 在重叠区做加权平均色差更小但边缘容易发虚Natural 是较新的混合策略过渡更自然耗时也更高。城市正射建议试 Average地形正射用 Mosaic 就够。seam_markerTrue会把拼接线画成可见的标记用来查找接边错位的位置正式出图时关掉。3.3 导出GeoTIFF分块与nodata设置正射导出最常见的翻车是文件过大打不开或者坐标信息丢了。Photoscan 导出 GeoTIFF 有两种方式不带 world file地理信息内嵌在 TIFF 的 GeoTIFF tag 里和带 world file额外生成 .tfw 和 .prj。主流的 GIS 两种都认内嵌的更省事。chunk.exportOrthomosaic( dom.tif, formatTIF, projectionchunk.crs, tiledTrue, # 分块存储便于 GIS 逐块读取 blockw4096, # 块宽像素 blockh4096, # 块高像素 compressionLZW, # 无损压缩一般能压到 40%~60% bigtiffTrue, # 超过 4GB 时启用 write_worldTrue, # 同时输出 .tfw / .prj raster_transformPhotoScan.RasterTransformNone )LZW 是无损压缩正射影像用它是安全选择别为了体积用 JPEG 压缩边界会出现块状伪影。bigtiffTrue在单文件超过 4GB 时必开否则写到一半会报错。分块大小 4096 是个平衡点太小产生大量冗余太大某些 GIS 加载时会卡。如果正射里有空洞被遮挡、水域、超出重叠区导出时可以通过PhotoScan.RasterTransformNone和后续 GDAL 处理来统一填 -9999别让空洞变成 0因为 0 在影像里是纯黑进 GIS 还会被当成有效值参与统计。3.4 大区域分批处理与接边控制一个测区超过 3000 张照片时一次性跑完整链路对内存要求非常高。常见做法是按航带或者按网格分块每块单独建 chunk 跑出 DEM 和正射再用 GDAL 拼接。分块的接边位置尽量选在重叠充分、地形平缓的地方沿着道路或地类边界切视觉上更自然。分块处理有一个坑块与块的坐标系统、分辨率必须完全一致否则拼接后会有错位和重采样痕迹。做法是把每一块的resolution参数写成同一个固定值导出时投影只写 EPSG 代码不带任何基准变换拼接时用 VRT 而不要逐块重采样。4. 从DSM到DEMPhotoscan成果的后处理与精度验证4.1 密集点云分类与DSM转DEMPhotoscan 直接从密集点云生成的其实是最佳地表模型DSM它包含树冠、房屋、车辆这些地表附着物。要拿到真正意义上只含裸地的 DEM数字高程模型有时也叫 DTM必须做点云分类或者滤波。工程上两条路。一条是在 Photscan 里用「分类地面点」功能基于几何和颜色做粗略分类再生成 DEM速度快但分类精度一般适合植被稀疏的区域。另一条是把密集点云导成 LAS用 PDAL 或 CloudCompare 做精细滤波尤其是 Progressive Morphological Filter 和 Cloth Simulation FilterCSF在有林地的区域效果明显好于软件内置分类。# 导出密集点云为 LAS # chunk.exportPoints(dense.las, formatPhotoScan.PointsFormatLAS) # 用 CSF 布料模拟滤波提取地面点需 PDAL 加载 CSF 插件 pdal translate dense.las ground_csf.las \ --filter.csf \ --filters.csf.resolution2.0 \ --filters.csf.threshold0.5 \ --filters.csf.rigidnessfalse # 或者用渐进形态学滤波 pdal translate dense.las ground_smrf.las \ --filter.smrf \ --filters.smrf.scalar1.25 \ --filters.smrf.slope0.15 \ --filters.smrf.window18filters.csf.resolution是布料网格间距跟地形起伏幅度相关平地取 0.5 到 1丘陵取 2 到 5。threshold是点到布料的距离阈值超过就判为非地面通常 0.3 到 0.8。filters.smrf.window是形态学运算的窗口尺寸必须大于最大建筑物的尺寸否则楼房会被误判成地形。分类完的地面点再栅格化成 DEM插值用 IDW 或 TIN 线性插值都行跟之前一样注意分辨率不要小于点间距。4.2 GDAL后处理填洞、重采样、分割与镶嵌DEM 出来之后真正花时间的往往是后处理。常见需求有四个补空洞、统一分辨率、按范围分割、多块拼接。# 1. 填洞对 nodata 区域做插值填补-md 是最大填补距离-si 是迭代次数 gdal_fillnodata.py -md 30 -si 3 -o dem_fill.tif dem_raw.tif # 2. 重采样到统一网格同时统一 nodata 值 gdalwarp -tr 0.1 0.1 -r bilinear -dstnodata -9999 \ -t_srs EPSG:4547 dem_fill.tif dem_01m.tif # 3. 按矢量范围分割GIS 里做 DEM 分割最稳的方式就是 cutline gdalwarp -cutline boundary.shp -crop_to_cutline \ -dstnodata -9999 -co COMPRESSDEFLATE -co TILEDYES \ dem_01m.tif dem_clip.tif # 4. 多块拼接先建虚拟栅格再一次性写出 gdalbuildvrt mosaic.vrt tile_*.tif gdal_translate -co COMPRESSDEFLATE -co TILEDYES -co BIGTIFFIF_SAFER \ mosaic.vrt dem_mosaic.tifgdal_fillnodata.py的填洞是插值不是真实观测用之前先确认这些空洞是边缘裁剪导致还是数据缺失。范围裁剪时用矢量边界切比在 QGIS 里按范围出图更稳因为 gdalwarp 会统一处理坐标变换和像素对齐。拼接时先建 VRT 再转实体文件比直接 gdal_merge 省内存也不容易在块数多的时候报错。如果要做水文分析DEM 里的洼地会导致流向计算失败需要单独做填洼处理那是另一套流程不要和上面的 nodata 填补混用。4.3 用检查点做精度验证RMSE怎么算、多少算合格精度验证的核心概念是用于平差的控制点不能再用来评估精度必须留一批没参与解算的点作为检查点。通常按控制点总数的 1/3 到 1/2 留作检查点分布要覆盖测区四角和中心。验证分平面和高程两部分。平面用检查点的 X、Y 残差算 RMSE高程用 Z 残差算。计算方法# 用检查点的高程和 DEM 采样高程做差 gdal_calc.py -A dem_final.tif -B check_dem.tif \ --calcA-B --outfilediff.tif --NoDataValue-9999 # 统计差值的均值和标准差 gdalinfo -stats diff.tif再看统计结果里的 Mean 和 StdDev。Mean 反映系统偏差如果明显不为零多半是高程基准没统一或者控制点本身有问题StdDev 反映随机误差是精度评估的主角。合格标准没有统一答案看项目要求。1:500 地形图对高程精度的要求一般在 0.15 米以内1:2000 可以放宽到 0.5 米左右。实际生产中RTK 控制的航测项目在裸地条件下高程 RMSE 做到 5 到 10 厘米是常见的有植被覆盖的区域会明显变差因为点云返回的是树冠高度。检查内容数据来源判断依据超限时的排查方向平面精度检查点 X/Y 残差与成图比例尺对应坐标系统、GCP 刺点高程系统偏差差值 Mean应接近零高程基准、高程异常改正高程随机误差差值 StdDev项目规范要求对齐质量、深度图质量点云完整性空洞比例无大面积缺失重叠率、拍摄角度5. 把Photoscan一次成功的参数固化成批处理脚本跑通一个项目之后最有价值的动作是把参数固化成脚本而不是靠记忆重复点菜单。Photoscan 的 Python API 在这里比界面好用得多因为参数可以被审查、被版本管理、被批量套用。import Metashape as ms # 老版本写 import PhotoScan as ms import glob, os PARAMS { match_accuracy: ms.HighAccuracy, keypoint_limit: 40000, tiepoint_limit: 4000, depth_quality: ms.HighQuality, depth_filter: ms.ModerateFiltering, dem_resolution: 0.05, crs: EPSG::4547, } def run_one(photo_dir, out_dir): doc ms.Document() chunk doc.addChunk() chunk.addPhotos(sorted(glob.glob(os.path.join(photo_dir, *.JPG)))) chunk.crs ms.CoordinateSystem(PARAMS[crs]) chunk.matchPhotos(accuracyPARAMS[match_accuracy], generic_preselectionTrue, reference_preselectionTrue, keypoint_limitPARAMS[keypoint_limit], tiepoint_limitPARAMS[tiepoint_limit]) chunk.alignCameras() chunk.buildDepthMaps(qualityPARAMS[depth_quality], filterPARAMS[depth_filter]) chunk.buildDenseCloud(point_colorsTrue) chunk.buildDem(sourcems.DenseCloudData, interpolationms.EnabledInterpolation, projectionchunk.crs, resolutionPARAMS[dem_resolution]) chunk.buildOrthomosaic(surfacems.ElevationData, blendingms.MosaicBlending, color_correctionTrue, projectionchunk.crs) name os.path.basename(photo_dir.rstrip(/)) chunk.exportDem(os.path.join(out_dir, name _dem.tif), projectionchunk.crs, nodata-9999, write_worldTrue) chunk.exportOrthomosaic(os.path.join(out_dir, name _dom.tif), formatTIF, tiledTrue, blockw4096, blockh4096, compressionLZW, bigtiffTrue, write_worldTrue) doc.save(os.path.join(out_dir, name .psx)) doc.clear()把参数抽成字典的好处是同一批项目里只有dem_resolution和crs需要按项目改其余保持常量成果的可比性就有了保证。注意doc.clear()要放在最后否则内存会一直累积跑第三个项目就开始吃交换分区。5.1 三个容易漏掉的复核动作一是导出后用gdalinfo看一遍坐标和 nodata。gdalinfo dem_final.tif输出里的Origin、Pixel Size、NoData Value三项只要有一项不对后面所有分析都是白做。这一步比在 GIS 里打开看要快得多也更容易批量执行。二是把检查点残差和 DEM 差值图叠在一起看。别只看 RMSE 一个数字残差的空间分布能告诉你问题在哪如果误差集中在测区边缘多半是重叠率不够或者边缘控制点太少如果集中在某个方向呈线性变化大概率是坐标系统或者高程基准的问题。三是正射影像和 DEM 做一次配准自检。把正射叠加到 DEM 生成的晕渲图上看建筑物轮廓、道路边线有没有明显错位。这个动作能同时暴露正射投影用错表面、DEM 空洞、以及分块接边位置三类问题比单独检查每一项快。接边处如果出现固定宽度的条带差异优先去查分块时的投影和分辨率参数是否完全一致。本文还有配套的精品资源点击获取
返回列表