将点云投影到 2.5D 的 DSM 或距离图像,然后利用 2D 变化检测技术进行。本文按“基于像素/基于点”梳理常见思路,并给出 dDSM 与 MRF 的极简示例。

基于像素

dDSM

dDSM(Dense Deep Sparse Model)是一种基于像素的图像分类模型,它将图像的每个像素都作为输入,并使用卷积神经网络进行分类。通过简单的减去DSM得到像素级的二进制变化图,后处理有形态学滤波和阈值处理、分割、分类、去除噪声和未配准引起的假警报,但是会由于信息损失而无法检测细致变化,适合更大范围明显变化的检测。比如城市范围内的建筑物变化检测。以下是一个简单的Python代码示例:

import numpy as np
import cv2

# dDSM:对两个时相的 DSM 做差分,阈值化得到变化掩码
# dsm_t1/dsm_t2:两期 DSM(单位可理解为“高度”,同尺度)
# thresh:阈值,越大越不敏感;ksize:形态学滤波核大小

def ddsm_change(dsm_t1, dsm_t2, thresh=1.0, ksize=3):
# 1) 绝对差分:突出变化区域
diff = np.abs(dsm_t2 - dsm_t1)

# 2) 阈值二值化:变化为 255,未变化为 0
change = (diff > thresh).astype(np.uint8) * 255

# 3) 形态学开运算:去除孤立噪声点
kernel = np.ones((ksize, ksize), np.uint8)
change = cv2.morphologyEx(change, cv2.MORPH_OPEN, kernel)

return change

# 4) 构造模拟 DSM:t1 为随机地表,t2 在局部抬升
h, w = 256, 256
np.random.seed(42)
dsm_t1 = np.random.rand(h, w).astype(np.float32) * 10

dsm_t2 = dsm_t1.copy()
# 在一个矩形区域“加高”,模拟新增建筑
dsm_t2[80:140, 120:180] += 3.0

# 5) 调用检测函数,得到变化掩码
mask = ddsm_change(dsm_t1, dsm_t2, thresh=1.5, ksize=3)

# 6) 打印结果信息:尺寸、类型与最大值(是否包含变化)
print(mask.shape, mask.dtype, int(mask.max()))

2D机器学习

2D 机器学习将每个像素或小邻域作为样本,结合手工特征进行分类。常见流程为:

  1. 预处理:归一化、平滑、配准误差修正等
  2. 特征构建:高程差、强度、纹理、形态学统计量等
  3. 分类器:随机森林、SVM、梯度提升树等
  4. 后处理:形态学滤波、连通域剔除、边界修正

马尔科夫随机场(MRF)会显式建模邻域像素间的几何与语义关系,通过“数据项 + 平滑项”的方式抑制噪声与孤立误检。它对类别不平衡更鲁棒,但对参数敏感,且计算量会随图像尺寸增大。

MRF Python 代码示例:

import numpy as np

# 简化版 MRF:用 ICM 在二值变化图上做平滑
# unary 表示像素属于“变化/不变”的代价(这里用随机示意)
# beta 越大越强调邻域一致性

def icm_mrf(unary, beta=1.0, iters=5):
h, w, _ = unary.shape
labels = np.argmin(unary, axis=2).astype(np.int32)
for _ in range(iters):
for y in range(h):
for x in range(w):
nbs = []
if y > 0:
nbs.append(labels[y - 1, x])
if y < h - 1:
nbs.append(labels[y + 1, x])
if x > 0:
nbs.append(labels[y, x - 1])
if x < w - 1:
nbs.append(labels[y, x + 1])
smooth0 = beta * sum(nb != 0 for nb in nbs)
smooth1 = beta * sum(nb != 1 for nb in nbs)
e0 = unary[y, x, 0] + smooth0
e1 = unary[y, x, 1] + smooth1
labels[y, x] = 0 if e0 <= e1 else 1
return labels

h, w = 64, 64
np.random.seed(7)
# 假设差分图差值越大越倾向“变化”
diff = np.random.rand(h, w)
unary = np.zeros((h, w, 2), dtype=np.float32)
unary[..., 1] = 1.0 - diff # 变化代价
unary[..., 0] = diff # 不变代价

labels = icm_mrf(unary, beta=1.2, iters=3)
print(labels.shape, labels.dtype, int(labels.max()))

2D深度学习

2D 深度学习通常以成对影像(DSM、正射影像或深度图)为输入,通过共享权重的孪生结构提取差异特征,再进行像素级变化判别。常见思路包括 Siamese 网络、基于 UNet 的编码器-解码器结构,以及加入注意力或对比学习增强变化表示。GAN 也可在 Siamese 框架下进行变化检测,用于提升细微变化的可分性(Nagy,2021)。

为了保留细节,常见做法是将下采样阶段的高分辨率特征与解码阶段的转置卷积层进行跳跃连接,从而提高边界与小尺度变化的识别效果。

基于点

点云方法直接在 3D 空间建模变化,优势是保留了几何细节,但对配准误差和噪声更敏感。

距离

  1. 点到点距离(C2C),常与 Hausdorff 距离结合评估变化。
  2. 多尺度模型到模型比较(M3C2),用点到局部平面或多尺度网格的距离替代点对点距离,更稳健。
  3. 点到三角形距离,适合网格化场景的变化检测。
  4. 点到平面距离,通常需再做阈值或聚类后处理,否则结果容易呈现稀疏散点。

机器学习

点云变化检测可被视作分类问题:既检测几何变化,也学习语义类别,实现几何变化检测与语义分割的联合。传统方法依赖手工特征(高度、密度、邻域结构等)配合随机森林或 SVM,效果稳定但泛化依赖特征设计。

近年来也有基于深度学习的点云方法,如 PointNet++、KPConv、Minkowski/稀疏卷积等,通过端到端学习特征,通常能获得更好的跨场景表现。