简介:本资源是一套面向遥感科学、测绘工程及地球物理专业学习者与科研人员的InSAR数据处理MATLAB实践代码集,聚焦SAR成像原理模拟与干涉测量全流程实现,助力用户掌握地表形变监测核心技术。压缩包共59个文件,全部为.m脚本(如simulateslc.m、siminterf.m用于SAR原始信号与干涉图仿真;ph.m、residues.m、std_phase.m等专注相位处理与解缠;freadhgt.m、plotdem.m支持数字高程模型读取与可视化),总大小仅68KB,轻量紧凑、即下即用。已有405人学习下载,适用于课程实验、课题入门或算法复现场景。用户可直接调用模块化函数构建完整InSAR处理链:从SLC模拟、干涉图生成、相位包裹/解缠,到地形残差分析与形变初步估计,配套注释清晰、命名规范,具备良好的教学参考性与工程延展性。 做InSAR数据处理这几年,我最常被问到的就是“MATLAB能不能做InSAR?”以及“是不是非得上GAMMA、ISCE那些专业软件?”这标题里的项目,恰好就是一套完全基于MATLAB的InSAR数据处理流程,覆盖了SAR成像到干涉测量的核心环节。这类代码库的价值不在于替代商业软件,而在于把InSAR的处理链条中每一个“黑盒”环节都打开,让你看得见每一行计算逻辑。如果你想深入掌握InSAR的原理,或者需要针对特定区域定制处理策略,趁早脱离“只会点按钮”的状态,自己动手写一遍处理流程是绕不开的路。
这个项目能做的事情很直白:从SAR复数影像出发,经过配准、干涉图生成、去平地效应、滤波、相位解缠,最后得到形变信息。整个流程用MATLAB实现,适合遥感、测绘、地球物理方向的研究生,以及刚接触InSAR、想搞明白数据到底是怎么一步步变成形变图的工程师。我会把整个处理链路拆开,每个环节的数学原理、MATLAB实现要点、以及我实测踩过的坑都交代清楚,方便你对照自己的数据复现。
1. 为什么用MATLAB做InSAR数据处理
1.1 从SAR成像到InSAR:一个相位的游戏
先把底层的物理过程理顺。SAR成像系统向地面发射微波脉冲,接收回波后通过距离向压缩和方位向压缩,形成一幅复数影像。每个像元的值是一个复数,包含振幅和相位两部分。振幅反映地物的后向散射强度,相位则记录了雷达波从卫星到地面再返回的双程距离信息。
单幅SAR影像的相位是没有意义的,因为大气延迟、轨道误差、地形起伏都会改变相位。但两幅覆盖同一区域、成像时间不同的SAR影像,它们的相位差可以抵消大部分共同误差,剩下的相位差就主要包含三项:地形相位、形变相位、以及大气和噪声相位。InSAR的基本思路就是用两张影像的相位差来反演地表信息。这个相位差就是我们说的干涉图。
如果只用两幅影像做差分,得到的是标准D-InSAR(差分干涉测量),可以测一次地震或者一次地面沉降事件的形变场。如果拿一整个时间序列的影像做联合解算,就是时序InSAR,常见的有PS-InSAR和SBAS-InSAR两种路线。标题里提到的“sbas insar”这个热搜词,恰好指向了时序分析这条线。用MATLAB实现SBAS-InSAR,本质上就是在二维干涉图的基础上,增加一个时间维度的最小二乘解算。
1.2 MATLAB与专业软件的选择:什么时候该自己写
很多入门者会纠结一个问题:已经有GAMMA、ISCE、SNAP这些成熟工具了,为什么还要用MATLAB自己写一遍?我的看法是,工具选择取决于你的目标。
如果你只想要一张形变图,赶紧出结果写论文,那直接用GAMMA或者SNAP就够了,没必要自己造轮子。但如果你想知道干涉图里的残差是怎么来的,滤波参数改了会对结果产生什么影响,或者你需要在一个特殊区域(比如高山区、强形变区)调整处理策略,你就必须理解每一步的数学本质。MATLAB的优势在于:矩阵运算语法天然适合影像处理,可视化调试非常方便,你可以随时把中间结果拿出来看看,相位图、相干性图、残差图一目了然。
这个项目的定位恰恰就是这个——教学和研究性质的原型实现。它不会像GAMMA那样对一万个细节做工程优化,但它把主链路完整打通了。我自己带学生时,通常也是先让他们用MATLAB把整个InSAR流程搭一遍,等真正理解了每个环节之后,再转到ISCE这类专业软件处理大范围数据,会顺手得多。
2. InSAR数据准备与预处理
2.1 数据源分析与SLC影像读取
InSAR的数据源一般有两类:自己的数据或者公开数据。自己做实验的话,哨兵1号(Sentinel-1)是最省事的选择,数据免费开放,重访周期12天,而且欧空局提供了多种产品级别。需要明确的是,InSAR处理用的不是普通的SAR强度影像,而是单视复数(SLC)产品。SLC保留着完整的相位信息,这是干涉测量的基础。
哨兵1号的SLC数据从ASF或者欧空局的Copernicus Open Access Hub下载。拿到手是一个压缩包,里面包含多个文件,读取时最核心的是两个:一个是影像数据本身,一个是包含轨道信息、成像参数、姿态数据的注释文件。MATLAB读取这类数据有两种常见路径:一是利用Matlab Image Processing Toolbox中的自定义函数,二是通过read_geotiff配合XML解析来提取元数据。
我自己更推荐另一种思路:先将SLC数据从原始格式转换为MATLAB能直接读入的二进制格式,再进行处理。很多开源的哨兵1号读取工具(比如stripmap或S1_toolbox)做了格式解析的工作,你可以参考其逻辑。核心是读取SLC数据时,要注意数据的存储顺序,哨兵1号的复数数据通常是int16实部+int16虚部交错存储,需要按interleaved格式解析。如果读错了字节序,干涉图会出现条纹异常,这个问题后面我会专门讲。
2.2 主影像选取与干涉像对组合
拿到一批SLC影像后,不是随便两两组合就能用。干涉像对的组合需要考虑空间基线和时间基线。空间基线太大,导致去相干严重;时间基线太大,地表散射特性变化也会导致去相干。最理想的情况是选择空间基线短、时间基线短的像对。
在MATLAB中实现像对筛选,需要先解析每幅影像的轨道状态向量,通过轨道方程计算每一对影像之间的垂直基线。一段简化的基线估计代码逻辑如下:
% 读取两个SLC影像的轨道状态向量(单位:m, m/s) pos1 = [x1, y1, z1]; vel1 = [vx1, vy1, vz1]; pos2 = [x2, y2, z2]; vel2 = [vx2, vy2, vz2]; % 计算空间基线(简化版:取轨道位置差在垂直视线方向的投影) base_vec = pos2 - pos1; los = pos1 / norm(pos1); % 视线方向单位向量 perp_baseline = dot(base_vec - dot(base_vec, los) * los, ...);实际工程中,轨道数据需要插值到影像成像时刻。一般使用多项式插值将状态向量拟合到每个方位向时间。不要用线性插值,轨道是光滑曲线,线性插值引入的误差会导致基线估计不准,后续地形相位纠正就会出现系统性偏差。
对于SBAS-InSAR,像对组合策略是:设定一个空间基线阈值(比如200米)和时间基线阈值(比如90天),满足条件的像对才纳入组合。这个组合结果用一个小矩阵表示,行是影像编号,列是像对编号,后面解算形变速率时要用到。
2.3 影像配准:干涉测量的第一道门槛
配准是InSAR处理中最关键的一步,配准精度直接影响干涉条纹质量。InSAR要求主辅影像之间的配准误差控制在亚像元级别,一般是1/8像元以上精度。如果配准误差达到一个像元,干涉相位基本淹没在噪声里。
MATLAB实现的配准流程分为两步:粗配准和精配准。粗配准通常基于卫星轨道参数计算主辅影像之间的几何偏移量,得到一个粗略的偏移场。精配准需要在粗配准基础上,利用强度影像的相关性做亚像元级偏移估计。这里有一个常用的思路:在影像上选取均匀分布的窗口(比如32x32像元),对每个窗口在辅影像中搜索最佳匹配位置,得到偏移量后拟合一个多项式偏移场。
精配准的核心代码逻辑:
% 在强度影像上选取控制点 [rows, cols] = size(master_amp); [X, Y] = meshgrid(1:200:cols, 1:200:rows); % 对每个控制点计算偏移 for i = 1:numel(X) win_m = master_amp(Y(i)-16:Y(i)+15, X(i)-16:X(i)+15); % 在辅影像中搜索最佳匹配,插值到亚像元 [offset_y(i), offset_x(i)] = subpixel_correlation(win_m, slave_amp, search_radius); end % 用二阶多项式拟合偏移场 poly_order = 2; offsets = fit_polynomial(X, Y, offset_x, offset_y, poly_order);配准完成后,要对辅影像做重采样。这里有一个重要的细节:如果不做频域插值,而是直接在空间域用interp2做双线性插值,会导致干涉相位出现系统性的相位偏差。推荐使用FFT-based的sinc插值,对复数数据做带限插值,保持相位精度。实测下来,当形变速率本身很小的场景里(比如每年几个毫米的沉降),插值方式的选择会直接影响最终结果能否看到真实的形变信号。
3. InSAR核心处理流程的MATLAB实现
3.1 干涉图生成与去平地效应
配准完成后,干涉图的计算非常简单:将主影像的复数像元值与辅影像配准后的复数像元值的共轭相乘。
interferogram = master .* conj(slave_resampled);这个复数数组的相位就是干涉相位,振幅就是干涉强度。但直接生成的干涉图条纹非常密集,主要原因是大尺度的“平地相位”占了主导。平地相位来源于卫星与地面之间的几何关系:即使地面完全没有形变和地形起伏,由于斜距随位置变化,干涉相位也会呈现出密集的线性条纹。
去平地效应的本质是计算并扣除一个参考椭球面的相位贡献。这一步需要用到卫星轨道状态向量、地面点的经纬度、以及成像几何参数。在MATLAB中,可以通过逐像元计算斜距差来实现,但对于大数据量来说这种逐像元循环很慢,建议采用矩阵化计算。
% 利用精确轨道构建地面点的斜距 range_master = sqrt((x_sat - x_ground).^2 + (y_sat - y_ground).^2 + (z_sat - z_ground).^2); range_slave = sqrt((x_sat2 - x_ground).^2 + (y_sat2 - y_ground).^2 + (z_sat2 - z_ground).^2); % 平地相位 flat_phase = 4 * pi / wavelength * (range_master - range_slave); % 扣除平地相位 interferogram_flat = interferogram .* exp(-1i * flat_phase);去平地这一步看着简单,但有一类坑非常隐蔽:轨道误差。如果使用的是粗略轨道(比如哨兵1号的初步轨道),平地相位里面会残留误差,导致干涉图出现大范围的条纹弯曲。解决方法是后期用精轨数据重新计算,或者在做完解缠后利用残余相位多项式拟合去除轨道误差项。
3.2 干涉图滤波:Goldstein滤波的MATLAB实现
去平地后的干涉图中还有大量斑点噪声。这些噪声如果不压制,后续解缠会把噪声“解”成无意义的跳变。干涉图滤波的经典算法是Goldstein滤波,它在频域中根据干涉图的局部相干性自适应调节滤波强度。
Goldstein滤波的原理是:对干涉图分块,每一块做FFT变换,在频域中对频谱做功率谱的alpha次方加权,其中alpha的大小与局部相干性有关。相干性高的区域,滤波强度小,保留细节;相干性低的区域,滤波强度大,压噪声。
MATLAB中实现Goldstein滤波的骨架:
function ifilt = goldstein_filter(interf, alpha_min) [nrows, ncols] = size(interf); block_size = 32; ifilt = ones(nrows, ncols); for i = 1:block_size:nrows for j = 1:block_size:ncols block = interf(i:min(i+block_size-1,nrows), ... j:min(j+block_size-1,ncols)); % 计算局部相干性 coherence = abs(mean(block ./ abs(block))); if coherence > 0.3 alpha = 1 - coherence; % 相干性高则滤波弱 else alpha = 0.8; end alpha = max(alpha, alpha_min); % FFT域滤波 F = fft2(block); F_filtered = F .* abs(F).^alpha; ifilt(i:min(i+block_size-1,nrows), ... j:min(j+block_size-1,ncols)) = ifft2(F_filtered); end end end实际使用中,块大小和重叠率很重要。块太小了,频谱估计不稳,滤波效果差;块太大了,细节被抹平。我常用的配置是32x32的块,50%的重叠率,alpha_min取0.3左右。滤波窗口之间的接缝效应也要注意——分块处理会导致边缘出现条带,在拼回去之前做一个边缘羽化(taper)会更平滑。还有一个工程技巧:Goldstein滤波只对相位做,强度不要滤波,否则会破坏振幅信息。
3.3 相位解缠:枝切法与最小二乘法的选择
相位解缠是整个InSAR处理里最折磨人的一步。干涉图中的相位值被限制在[-π, π)区间内,真实相位可能是这个值加上整数的2π倍数。解缠的目的就是恢复这个整数倍数,得到连续的相位场。
为什么解缠难?因为存在噪声区域和地形突变区域时,相位的2π跳变无法被正确恢复,误差会沿着解缠路径传播,导致大片区域出现“条纹断层”或者“相位台阶”。工程实践中处理解缠问题有两大路线:
第一类是基于路径跟踪的方法,代表是枝切法(Branch Cut)。这类方法先识别出残差点(相位一致性被破坏的点),然后用枝切线连接它们,解缠时避免跨越枝切线。这类方法的优点是不会全局传播误差,缺点是枝切线处理不好会留下空洞。
第二类是基于最小二乘的方法,目标是最小化解缠相位梯度和缠绕相位梯度之间的差异。这类方法稳定,但容易在残差点区域产生平滑的误差。
MATLAB中自己实现枝切法的工作量不小,需要计算残差点、生成枝切线、做积分。有一个相对简单的替代方案:用最小二乘法先解一遍,再用残差校正。不过如果目标区域比较大,我建议考虑调用成熟工具包,比如开源的snaphu,它可以通过外部命令从MATLAB调用,处理效果比简单实现要强得多。
这里分享一个我在实际项目中用过很顺手的流程:先用Goldstein滤波把干涉图压干净,再用Snaphu的MCF(最小费用流)模式解缠,最后把解缠结果导回MATLAB做后续分析。这样既保留了MATLAB做前处理的灵活性,又获得了专业解缠工具的质量。
3.4 形变解算:从单对差分到SBAS时序
单对干涉图经过解缠后,再减去模拟的地形相位(利用外部DEM),就得到差分干涉相位。这个差分相位里包含形变、大气延迟、轨道残差、噪声等成分。如果是单对D-InSAR,直接除一个时间间隔就得到形变速率,但噪声太大,意义有限。
SBAS-InSAR的思路是把很多对干涉图联合起来解算。核心思想是:每个像对之间的相位差等于两个时刻之间形变相位之差(加上其他误差项),利用多对干涉图构成一个线性方程组,求解最小二乘意义下的时间序列形变。这个线性方程组的系数矩阵由像对的时间关系决定。
方程组形态大概是这样的:
% A矩阵:行对应干涉像对,列对应影像时间点 % 若像对(i, j)存在,则 A(k, j) = 1, A(k, i) = -1 A = sparse(num_pairs, num_scenes); for k = 1:num_pairs A(k, scene_idx_master(k)) = -1; A(k, scene_idx_slave(k)) = 1; end % 解算相位时间序列 phase_ts = A \ phase_vector;解算完之后,还需要做一个时间域的高通滤波来去除大气延迟,再做空间域的低通滤波去除噪声。这一步在MATLAB里的实现不算复杂,核心是设计合适的时间窗口和空间滤波核。注意,SBAS解算前必须做相位解缠的一致性检查,如果一个像对的解缠结果和其他像对严重不一致,最好剔除,否则会污染整个时间序列。
4. 实用工具链与性能优化建议
4.1 MATLAB数据处理速度优化:parfor与内存管理
InSAR处理涉及的影像通常非常大。哨兵1号的一景SLC数据,单轨大约有2.5万行乘以5千列,复数双精度存储,光一个数据矩阵就要占据好几个GB。如果实验区域跨多个轨,数据量会更夸张。在MATLAB里处理这些数据,如果还停留在“写循环逐像元算”的阶段,跑一次基本可以下班了。
我常用的提速手段有三个:
第一是parfor并行循环。MATLAB的并行计算工具箱支持多核并行。但要注意,parfor适合可并行、无依赖的循环,比如分块滤波、分块相干性计算。不适合有前后依赖的递推过程。
第二是向量化计算。能用矩阵运算一次算完的,就不要循环。比如干涉图生成、去平地相位计算,这些用.*做完整个矩阵,速度要比循环快几个数量级。
第三是单精度存储。干涉图本身是复数,存储精度不需要双精度时,可以用single类型。一个复数单精度数组,内存占用是双精度的二分一。形变速率这种最终结果也可以先用单精度算,只在最后输出时不损失精度。
另外,如果数据量实在太大,内存不够用,可以考虑分块处理。具体做法是把影像切成重叠分块,每个分块独立做配准和干涉,拼回时用羽化消除边缘效应。我遇到过最大的一批数据是覆盖整条断层带的60多景哨兵影像,如果不分块,MATLAB直接OOM(内存溢出)。
4.2 辅助数据的集成:DEM、精密轨道与大气改正
InSAR处理离不开三样辅助数据:DEM、精密轨道、大气改正数据。这三样数据在MATLAB里的集成方式各不相同,但都有一些需要注意的地方。
DEM方面,常用的公开数据是SRTM和Copernicus DEM。MATLAB读取DEM时,需要注意坐标系与SAR影像的对应关系。一般需要用SAR成像参数做地理编码,把雷达坐标系下的干涉图映射到地理坐标系。这个过程涉及反向地理编码:已知地面点经纬度和高程,计算其在雷达影像中的位置。常见的做法是用距离-多普勒定位方程求解。
精密轨道方面,哨兵1号有精确的POD精密星历,使用时要换算到影像的成像时刻。我一般会写一个工具函数,读取精密轨道文件,拟合三次样条插值,输出影像每个方位向行对应的轨道位置和速度。这个函数一旦写好了可以反复复用,是后续所有InSAR处理的基础。
大气改正方面,比较常用的有GACOS(全球大气校正服务),它提供天顶对流层延迟数据。在SBAS-InSAR中,通常不依赖单一的大气校正产品,而是在解算后用时空滤波来分离大气信号。但如果你手头有GACOS数据,也可以直接在干涉图上扣除大气的延迟分量。实测下来,对于中国西南山区这种大气变化剧烈的区域,GACOS校正能显著降低干涉图中的大气条纹。
4.3 可视化与结果的交互式分析
MATLAB做InSAR还有个优势是可视化方便。一张干涉图,一个imagesc加colormap就能出图;一段形变时间序列,plot加errorbar就能画出来。但要想可视化做得专业,还需要注意几点。
干涉图显示时,相位是循环量,直接imagesc会因为-π和π的跳变产生颜色突变。建议用hsv色图,这样相位在2π周期内首尾相接,视觉上比较自然。如果要叠加相干性图,可以用alpha通道,把低相干区域半透明化,突出高可信区域。
辅助工具方面,我会推荐几个常用的MATLAB工具箱:Image Processing Toolbox(滤波和形态学操作)、Mapping Toolbox(坐标转换和地图投影)、Parallel Computing Toolbox(并行加速)、Statistics Toolbox(时间序列回归)。如果缺少Mapping Toolbox,也可以用开源的m_map工具包做替代,基本功能都能覆盖。
还有一个在交互式分析中很实用的功能:用datacursormode直接点击影像上的点,查看某个位置的时间序列或干涉图相位值。在MATLAB的figure窗口里,启用Data Cursor模式后,自定义一个更新时间序列回调函数,鼠标点击位置就能弹出对应的形变历史曲线。这个操作对于快速选点、检查异常点非常高效。
5. 常见问题与排查技巧实录
5.1 干涉条纹异常密集:平地相位未正确去除
这是新手最容易遇到的问题。第一眼看到干涉图,密密麻麻全是条纹,还以为自己成功做出了高分辨率干涉,实际上很可能只是平地相位没扣干净。
排查思路:先看条纹的走向是否与卫星轨道的几何关系一致。如果条纹是等间距直线且方向与方位向有一定夹角,基本可以断定是平地相位残余。解决方法有两条:一是检查轨道数据是否精确,用精密轨道重新计算平地相位;二是检查去平地公式中的斜距计算是否正确,尤其要确认采用了双程斜距(要乘以2)。
经验之谈,去平地后理想的干涉图应该呈现出清晰的地形条纹(沿山体走向弯曲),并且整体条纹密度明显下降。看到这种图像,才说明前面的处理是正确的。
5.2 相位解缠结果出现不连续拼图
解缠结果往往会出现一种情况:大片区域解缠结果连续,但沿着某些边缘出现明显的跳变,看起来像是一块块拼图拼起来但没对准。这种问题多半是解缠算法在低相干区域产生的误差,或者是滤波不充分留下的残差点导致枝切线误判。
解决方向:
- 第一,检查相干性分布,低相干区域(水体、植被稠密区)的相位本身就不可靠,处理时可以考虑用相干性掩膜把低相干区域排除掉,解缠后再插值补齐。
- 第二,增强滤波强度,把Goldstein滤波的alpha_min调低一些,但要注意不要过度滤波把真实形变信号抹掉。
- 第三,尝试更换解缠算法。如果用的是枝切法,换成最小费用流或最小二乘方法,很可能在问题区域表现更好。
用MATLAB可以快速对比不同解缠参数对结果的影响。修改参数后重新解缠,计算解缠结果与已知地面控制点之间的残差,选残差最小的参数组合。
5.3 MATLAB内存不足:大数据量分块处理
处理大范围InSAR数据时,“Out of Memory”是绕不开的坎。尤其是单景哨兵1号SLC数据直接全加载,几个GB内存就没了,再开几个中间变量,16GB内存的机器根本扛不住。
我实测下来最有效的方案是分块处理。具体操作是:
- 把全影像按方位向切分成若干条带,每条带之间重叠约10%像元。
- 对每个条带独立完成配准、干涉、解缠。
- 用重叠区域的平均值做拼接,并加羽化过渡。
分块的数量取决于你的可用内存。一个粗略的经验:保证每个分块的处理过程峰值内存不超过物理内存的三分之一。重叠率10%算是一个平衡点,太小了拼接边缘可能不自然;太大了冗余计算太多。
5.4 解算的形变速率场出现轨道斜坡
形变速率场如果呈现明显的空间线性斜坡(比如东南-西北方向的渐变),大概率是轨道误差没有被完全去除。轨道误差在干涉图中表现为大尺度的相位斜坡,其空间频率很低,不容易通过常规滤波去除。
处理方法是在SBAS解算后,在形变图上拟合一个平面,从结果中扣除。也可以用多项式拟合分段去除,一般二次多项式就够了。这个操作在MATLAB中实现很简单:
% 拟合形变速率场的平面趋势 x = 1:size(deformation_rate, 2); y = 1:size(deformation_rate, 1); [X, Y] = meshgrid(x, y); A = [X(:), Y(:), ones(numel(X),1)]; coeff = A \ deformation_rate(:); trend = reshape(A * coeff, size(deformation_rate)); % 去除趋势 deformation_rate_detrended = deformation_rate - trend;需要提醒的是,并非所有斜坡都是轨道误差,有些真实的地壳形变也会表现为大尺度斜坡(如长期构造运动、地下水超采造成的大范围沉降)。区分方法是看斜坡方向是否与轨道方向一致,以及是否在不同轨的数据中重复出现。如果有覆盖同一区域的升轨和降轨数据,交叉验证是最靠谱的方案。
6. 工程化落地:从实验代码到自动化处理
6.1 搭建一个可复用的InSAR处理流程脚本
项目做久了,你会发现最花时间的不是算法本身,而是把整个流程串起来、反复调试参数的过程。我在处理完第一批数据后,就把整套InSAR处理流程整理成了可复用的脚本框架,之后再接到新区域的批量数据,改改参数就能直接跑。
脚本框架的基本结构是这样的:
% 配置参数文件 config.work_dir = '/data/insar/'; config.slc_dir = [config.work_dir, 'SLC/']; config.dem_file = [config.work_dir, 'DEM/srtm_30m.tif']; config.look_angle = 33.9; % 哨兵1号默认入射角(中心) config.wavelength = 0.055465763; % 哨兵1号波长(米) config.spatial_baseline_thr = 200; % 空间基线阈值(米) config.temporal_baseline_thr = 90; % 时间基线阈值(天) % 主流程 data = Load_SLC_Data(config); baselines = Estimate_Baselines(data, config); pairs = Select_Interferometric_Pairs(baselines, config); for k = 1:length(pairs) [master, slave] = Coregister(data, pairs(k), config); interferogram = Generate_Interferogram(master, slave); interferogram = Remove_Flat_Earth(interferogram, baselines, config); interferogram = Goldstein_Filter(interferogram, config); unwrapped = Unwrap_Phase(interferogram, config); Stack_Interferograms(k) = unwrapped; end rate = SBAS_Inversion(Stack_Interferograms, baselines);实际工程中,流程里还要加入质量控制和日志记录。每一景影像处理完,输出质量报告,包含配准偏移量、相干性均值、解缠良好比例等指标。如果中间某一步质量明显下降,日志能帮你快速定位是哪对像对出了问题。
6.2 处理结果的验证与精度评估
InSAR处理完了,怎么知道结果可不可信?这一步比处理本身更重要。我的经验是,至少要完成三方面的验证:
第一,与外部数据对比。用GPS观测站的形变数据和时间序列InSAR结果对比,计算相关系数和均方根误差。如果两者趋势一致,但存在一个常数偏差,很可能是参考点选择不一致导致的,可以通过基准校正解决。
第二,残差分析。SBAS解算之后,每个干涉像对都有一个观测值与模型值之间的残差。残差如果呈现明显的空间结构,说明模型中遗漏了某些物理过程或者存在系统性误差。理论上,合格的残差应该接近白噪声。
第三,升降轨交叉验证。如果研究区同时有升轨和降轨数据,可以用两个方向分别处理,提取同一地理位置的形变时间序列。升降轨的几何观测方向不同,但对同一物理形变的反演结果应该一致。两者在视线向(LOS)上的变形分量投影到垂直向和东西向时,应该能互相印证。
MATLAB实现这些验证代码不算复杂,但很值得做。有了这套验证流程,你的InSAR结果就不再是一张花哨的图,而是经得起推敲的定量产品。
6.3 输出成果的标准化与论文配图
最后一步是输出。SCI论文、工程报告里的InSAR结果图,一般需要三个图层:
- 形变速率图,叠加在光学影像或地形阴影图上
- 时间序列图,选取几个代表点的形变曲线
- 相干性图,用于说明结果的空间可靠性
MATLAB的exportgraphics函数可以直接将figure导出为300dpi以上的TIFF或EPS,不需要再用其他软件二次处理。导出前注意设置字体大小(一般8-10pt)、坐标轴标注和colormap。形变速率图常用的色带是蓝-白-红,蓝色表示远离卫星、红色表示靠近卫星。用cmocean色带或者MATLAB自带的turbo效果都不错。
至此,一套用MATLAB做InSAR数据处理的完整链路就通了。这个项目标题里的“04924276”大概是作者当初的学号或者仓库编号,“insar_dataproccessing”也准确描述了这个仓库的内容定位——它不是某个精雕细琢的软件产品,但它是理解InSAR原理与实现的最佳起点。对每一个想真正掌握InSAR的从业者来说,趁早把这段代码从头到尾调通、跑顺、理解透,绝对是一件值得投入的事。
本文还有配套的精品资源,点击获取