简介:本资源是一套面向遥感与雷达图像处理初学者及科研人员的InSAR数据处理MATLAB实践代码集,聚焦干涉合成孔径雷达(InSAR)原理实现与SAR成像流程模拟,解决地表形变监测、相位解缠、干涉图生成等核心问题,适用于高校遥感课程实验、地质灾害分析入门及SAR算法验证场景。压缩包含59个.m函数文件,总大小68KB,涵盖SAR原始信号仿真(simslc、siminterf)、干涉图构建(ramp、wrap)、相位处理(std_phase、residues)、多视滤波(cpxmultilook)、地形校正(heightamb)、噪声模拟(simnoise)及可视化工具(plotdem、plotcbar)等完整模块,代码结构清晰、注释充分,支持从SLC数据生成到形变提取的全流程复现。目前已有405人学习下载,可直接运行调试,快速掌握InSAR数据处理关键算法与MATLAB工程实践方法。
1. 用MATLAB搭建InSAR处理链路:这活儿到底该不该自己干
接手InSAR数据处理这个活儿,大多数人第一反应是装GAMMA、ISCE或者SNAP,很少会琢磨用MATLAB自己写一条链路。但我还真见过不少实验室和公司项目,核心处理流程是拿MATLAB搭起来的——尤其当目标是SAR成像算法验证、InSAR教学演示、小范围形变监测,或者后续要接SBAS时序分析的时候,MATLAB的灵活性和可视化优势非常明显。
1.1 成熟工具那么多,为什么还要MATLAB自己写
先别急着反驳。GAMMA、ISCE、SNAP这些工具确实成熟,Sentinel-1数据丢进去,几步操作就能出干涉图。问题出在"箱子里面是什么"这件事上。做科研或者做项目交付,很多时候需要精确控制每一步的处理参数,甚至要临时改算法逻辑。你不可能为了一个滤波窗口大小的试验,就去改GAMMA的源码,但MATLAB里面改一个参数、换一个函数,几秒钟的事。
另外,MATLAB的调试和可视化是天然优势。InSAR处理链路长,中间产品多,一个干涉图出来对不对、频谱有没有对准、相干性分布是否合理,MATLAB里直接imagesc一拉就能看。很多老师傅第一次接触ISCE,光是把中间结果导出来看就得费半天劲,而MATLAB里根本没有这个问题。
还有一个容易被忽视的场景:教学和算法验证。SAR成像、InSAR干涉、相位解缠,这些课程的作业几乎全是MATLAB写的。你在MATLAB里把回波仿真、成像、干涉、解缠全跑通一遍,比直接调现成工具包学到的东西多得多。
当然,MATLAB这条路也有天花板。大数据量的星载SAR全场景处理,比如一整景Sentinel-1(大概几万个像素乘几千行),纯MATLAB循环能跑到你怀疑人生。所以我的建议很明确:教学验证、科研原型、中小规模数据处理用MATLAB;大规模业务化生产,老老实实上专业工具或者转C/GPU。
1.2 这套流程的定位:能处理什么,不碰什么
说了半天,先把边界划清楚。用MATLAB写InSAR处理链路,最适合处理的是以下几个层次的问题:
- 单景SAR图像的聚焦成像验证,特别是点目标仿真和成像参数分析
- 单对SLC影像的干涉图生成、相干性计算、滤波和解缠
- 小范围、低分辨率的形变场提取,比如矿区、大坝、城市局部区域
- SBAS时序分析的原型实现,基于已有干涉对组合反演形变速率序列
不碰什么也很明确:不碰大范围高分辨率的生产级处理,不碰需要精密定轨和大气校正的毫米级业务,也不碰需要GPU加速的实时处理场景。明白这个边界,后面所有选型和设计都不会跑偏。
2. 数据入口的选择:公开星载数据、仿真回波与MATLAB读入细节
处理链路第一步永远是数据。InSAR处理的数据来源主要有三条路:下载公开星载SAR卫星数据、用MATLAB自己仿真SAR原始回波、或者拿到别人处理好的SLC数据直接开始。这三条路的准备工作完全不同,我分别说。
2.1 在轨主流星载SAR数据源及参数速查
如果你要做真实的InSAR形变监测,第一步是选数据源。目前公开可下载的星载SAR数据里,最常用的几个我在表格里列一下,这些参数在后续基线估计、干涉图生成的时候都要用到。
| 卫星/传感器 | 波段 | 波长(cm) | 重访周期 | 分辨率(方位向x距离向) | 数据获取途径 |
|---|---|---|---|---|---|
| Sentinel-1A/B | C | 5.6 | 6天(双星) | 约5m x 20m(IW模式) | 免费,ASF/ESA |
| ALOS-2 | L | 23.6 | 14天 | 约3m x 10m(条带) | 部分免费/研究申请 |
| TerraSAR-X/TanDEM-X | X | 3.1 | 11天 | 约1m x 3m(条带) | 商业/研究申请 |
| Radarsat-2 | C | 5.6 | 24天 | 约3m x 8m(条带) | 商业/研究申请 |
| 国产高分三号 | C | 5.6 | 29天 | 约1m x 1m(聚束) | 研究申请 |
选数据源的核心逻辑是看形变梯度和地表覆盖。植被密集区用L波段穿透性好,城市用X波段精度高,大面积常规监测用C波段的Sentinel-1最划算,毕竟免费且重访频繁。做InSAR之前把轨道参数文件(精密轨道)也一起下载下来,后面基线估计要用,别省这一步。
2.2 MATLAB生成SAR原始回波仿真数据:从零构造测试样本
没有合适数据源,或者想先验证算法逻辑的时候,用MATLAB仿真SAR回波是非常好用的手段。仿真分两步:第一步构造地面场景的后向散射系数,第二步模拟雷达发射线性调频信号并计算回波。
一段最简点目标仿真代码长这样:
% 基本参数设置 fc = 5.4e9; % 载频,对应C波段 c = 3e8; % 光速 lambda = c / fc; % 波长 B = 60e6; % 信号带宽 Tr = 10e-6; % 脉冲持续时间 Kr = B / Tr; % 调频率 fs = 1.2 * B; % 距离向采样率 PRF = 1000; % 脉冲重复频率 % 点目标位置(距离向、方位向坐标) R0 = 800e3; % 最近斜距 X0 = 0; % 方位向位置 % 生成距离向时间轴和方位向慢时间轴 tr = 2 * R0 / c + (-Tr/2 : 1/fs : Tr/2); ta = (-100 : 1/PRF : 100); % 模拟回波(二维矩阵) echo = zeros(length(ta), length(tr)); for i = 1:length(ta) R = sqrt(R0^2 + (ta(i) - X0)^2); % 瞬时斜距 t_delay = 2 * R / c; % 时延 % 基带信号 echo(i, :) = exp(1j * pi * Kr * (tr - t_delay).^2) .* ... (abs(tr - t_delay) <= Tr/2) * exp(-1j * 4 * pi * R / lambda); end注意这里R0和场景位置要自己定义,实际仿真的时候我习惯把点目标放在场景中心附近,减小边缘效应。仿真回波的最大好处是每个参数都是已知的,你处理完可以用点目标响应来验证成像质量,比如峰值旁瓣比、分辨率是否和理论值吻合。
2.3 SLC数据读入MATLAB:Int16、Float32和复数格式的坑
拿到真实星载SAR SLC数据之后,第一步是正确读入。不同卫星的SLC存储格式不一样,但核心都一样:每个像素是一个复数,通常用int16实部加int16虚部,或者打包成一个float32复数。读入的时候最容易犯的错是字节序搞反,导致图像像一副抽象画。
我常用的读法(以Sentinel-1 SLC的tiff格式为例):
% 读取复数SLC影像 [slc_i, slc_q] = deal(zeros(nlines, npixels, 'single')); for line = 1:nlines data = fread(fid, [2, npixels], '*int16'); slc_i(line, :) = data(1, :); slc_q(line, :) = data(2, :); end slc = complex(slc_i, slc_q);或者直接借助MATLAB的readgeoraster或者multibandread,但要注意转成复数类型。读进来之后先做一个幅度图可视化,正常图像应该能看到地物轮廓,如果全是噪点或者条纹,先检查字节序和数据类型。
这里有一个必须养成的习惯:SLC数据量很大,5000x5000的复数矩阵单精度就是200MB,处理完一个阶段及时清理中间变量,别让MATLAB工作区变成垃圾场。
3. 干涉处理的核心步骤拆解:从复图像对到位相形变图的完整链路
InSAR的干涉处理链路,说白了就是把两景不同时间获取的SAR复数图像做共轭相乘,提取相位差,然后从相位差里反演形变信息。这条链路在MATLAB里每一步都有明确的实现,但每一步的细节决定了最终结果的质量。
3.1 图像配准:一个像素的偏差就会毁掉整幅干涉图
很多人忽略配准的重要性,上来直接做干涉。两景SAR影像如果配准误差超过0.1个像素,干涉条纹的相干性就会显著下降。特别是高分辨率X波段数据,对配准精度要求极高。
配准的基本思路是:先根据轨道参数计算一个初始偏移量,再用互相关或相位相关方法做亚像素配准。MATLAB里可以用imregcorr做初步配准,但更专业的做法是选取地面控制点,用二次多项式拟合偏移场。
% 基于互相关的粗配准 [optimizer, metric] = imregconfig('monomodal'); tform = imregtform(slc2_amp, slc1_amp, 'affine', optimizer, metric); slc2_reg = imwarp(slc2, tform, 'OutputView', imref2d(size(slc1)));这是我实际项目里用过的简单方案,对于同一轨道的Sentinel-1数据,粗配准加多项式精配准基本能到0.05像素以内。做完配准一定要看配准后的干涉图,如果条纹连续平滑,说明配准质量OK;如果条纹像被揉皱的纸,多半是配准精度不够。
3.2 基线估计与数字高程模型:为什么平地相位必须去掉
InSAR的相位既有地形贡献又有形变贡献,要提取形变,必须把地形相位去掉。去地形相位有两种路径:一种是利用外部DEM模拟地形相位并去除,这叫两轨法;另一种是利用三轨或者差分干涉直接消除地形影响。
在MATLAB里,关键步骤是根据基线参数计算平地相位。平地相位的公式是:
[ \phi_{flat}(x, r) = -\frac{4\pi}{\lambda} \cdot \frac{B_\perp}{R \tan\theta} \cdot r ]
其中(B_\perp)是垂直基线,(R)是斜距,(\theta)是入射角。实际代码里我按逐像素的方式计算,然后把平地相位从干涉相位里减掉:
% 生成平地相位模型 flat_phase = zeros(size(int_phase)); for i = 1:nlines for j = 1:npixels R = R0 + j * rg_spacing; flat_phase(i, j) = -4 * pi / lambda * (B_perp / (R * tan(theta))) * (j * rg_spacing); end end % 去除平地相位 diff_phase = angle(interfogram .* exp(-1j * flat_phase));注意,这种双循环在数据量小的时候没问题,数据量一大就非常慢,建议改成矩阵运算。一个经验是:先对整幅影像的平地相位做二维多项式拟合,再用矩阵运算一次性生成相位平面,速度会快几个数量级。
外部DEM的使用也很关键。我一般用SRTM或者Copernicus DEM,在MATLAB里用shaperead或者readgeoraster读入,然后投影到SAR坐标体系。DEM分辨率要和SAR影像分辨率匹配,不然地形的短波成分会被欠采样,产生残余条纹。
3.3 干涉图生成与相干性计算:一张图判断数据质量
做完配准和去平地相位后,干涉图和相干性图是整个流程中最重要的质量诊断产品。
相干性计算可以理解为一个局部窗口内两幅图像相似度的度量,公式是:
[ \gamma = \frac{|\sum S_1 S_2^*|}{\sqrt{\sum |S_1|^2 \sum |S_2|^2}} ]
MATLAB里面比较直接的做法:
win_size = 5; % 窗口大小 kernel = ones(win_size) / win_size^2; numerator = filter2(kernel, slc1 .* conj(slc2)); denom = sqrt(filter2(kernel, abs(slc1).^2) .* filter2(kernel, abs(slc2).^2)); coherence = abs(numerator) ./ (denom + eps);相干性图的作用非常大。如果某片区域的相干性低于0.2,那这块区域的干涉相位基本是噪声,后面解缠的时候就应该用掩膜把它盖住。我做项目时一定把相干性图和干涉条纹图对照着看,条纹清晰但相干性很低的区域,多半是相位跳变太快或者存在不连续形变,这种区域要格外小心。
3.4 相位解缠:从包裹相位到真实形变的最后一道关
干涉相位是包裹在(-\pi)到(\pi)之间的,要得到真实的形变相位必须解缠。MATLAB有一些自带函数,比如unwrap是一维的,但二维相位解缠要复杂得多,因为存在残差点。
我自己常用的方案是调用SNAPHU(Statistical-cost, Network-flow Algorithm for Phase Unwrapping),它虽然是独立工具,但MATLAB可以通过系统调用传递参数。做法是先把包裹相位写成SNAPHU能读的二进制格式,调用命令,再把结果读回来。
snaphu -f snaphu.conf -d interferogram.int -u unwrapped.int -c correlation.cor如果不想依赖外部工具,MATLAB里也可以实现基于最小二乘的快速解缠,但残差点的处理比较麻烦,容易解出飞周。我的经验是:对于教学演示和初步分析,用最小二乘解缠足够;对于需要高精度结果的科研项目,还是建议用SNAPHU。
解缠之后得到的相位还需要做一步:相位转形变。形变(视线向位移)的计算公式是:
[ d_{los} = -\frac{\lambda}{4\pi} \cdot \phi_{unwrapped} ]
把解缠相位乘上这个系数,就得到视线向形变图。到此,单对InSAR的核心链路就跑通了。
4. 滤波、多视与干涉质量:控制条纹噪声的实战手法
干涉图生成后往往噪声很大,如果不做滤波,后续解缠和形变反演会很崩溃。这一章专门讲滤波和多视这两个最常用的质量提升手段,以及参数怎么定。
4.1 多视处理:用分辨率换质量的最直接手段
多视就是对方位向和距离向做平均,以降低斑点噪声,提高相干性。代价是分辨率下降。这里有个经验公式:假设原始分辨率是(R_a \times R_r),多视比是(m_a : m_r),处理后的分辨率大概是((m_a \cdot R_a) \times (m_r \cdot R_r))。
| 应用场景 | 推荐多视比(方位向:距离向) | 原因 |
|---|---|---|
| 城镇形变监测 | 4:1 或 5:1 | 城市相干性好,保持适当分辨率 |
| 自然地表(裸土、草地) | 8:1 到 10:1 | 低相干区域需要更多平均来提升相位质量 |
| 矿区/大坝 | 5:1 | 形变梯度大,过度多视会抹平细节 |
| SBAS时序分析 | 4:1 或 5:1 | 需要在分辨率和时序一致性之间平衡 |
MATLAB里做多视用blockproc或者reshape加mean实现,例如:
function ml = multilook(slc, az_looks, rg_looks) [nlines, npixels] = size(slc); valid_nlines = floor(nlines / az_looks) * az_looks; valid_npixels = floor(npixels / rg_looks) * rg_looks; slc_crop = slc(1:valid_nlines, 1:valid_npixels); ml = squeeze(mean(mean(reshape(slc_crop, ... az_looks, [], rg_looks), 1), 3)); end注意多视处理不光作用于幅度,也作用于复数数据。多视后的复数数据再做干涉,比先干涉再多视效果更稳定,因为先多视降低了每个像素的相位噪声。
4.2 Goldstein滤波:最常用的干涉图滤波算法
Goldstein滤波是干涉处理的标配算法,它的核心思想是在频域做自适应滤波:高相干区用较弱的滤波保留细节,低相干区用较强的滤波压制噪声。
MATLAB实现Goldstein滤波的大致流程:
function filtered = goldstein_filter(int_phase, coherence, alpha) % int_phase: 包裹相位 % coherence: 相干性 % alpha: 滤波强度系数,推荐0.3-0.9 [nlines, npixels] = size(int_phase); filtered = zeros(size(int_phase)); winsize = 32; for i = 1:winsize:nlines-winsize+1 for j = 1:winsize:npixels-winsize+1 block = int_phase(i:i+winsize-1, j:j+winsize-1); coh_block = coherence(i:i+winsize-1, j:j+winsize-1); mean_coh = mean(coh_block(:)); fft_block = fft2(exp(1j * block)); fft_shifted = fftshift(fft_block); filter_weight = (1 - mean_coh) * alpha; fft_filtered = fft_shifted .* (abs(fft_shifted)).^filter_weight; filtered_block = ifft2(ifftshift(fft_filtered)); filtered(i:i+winsize-1, j:j+winsize-1) = angle(filtered_block); end end end滤波强度参数alpha的选择有讲究。数据质量好、相干性高的场景,alpha取0.3-0.5,保留更多高频细节;相干性普遍偏低(比如植被覆盖区),alpha可以到0.7甚至0.9。我在处理Sentinel-1数据时,一般先看一眼全域平均相干性:均值大于0.5用0.4,0.3到0.5之间用0.6,小于0.3直接用0.8。
4.3 自适应窗口和掩膜:低相干区别硬扛
还有一种思路不要忽略:不是所有区域都适合滤波,比如水体、阴影区、叠掩区,这些地方的相位完全是噪声。与其滤波硬扛,不如直接做掩膜。
掩膜的依据主要有三个:相干性阈值、幅度阈值、和地理先验知识。比如河流、大型水域可以直接用DEM或者遥感分类结果扣掉。在MATLAB里,先用相干性图生成掩膜:
mask = coherence > 0.25; % 阈值根据经验设定 % 对掩膜做形态学闭运算消除细小空洞 mask = imclose(mask, strel('disk', 3));掩膜的重要性在解缠阶段体现得最明显。低相干区域的相位如果参与解缠,会让残差点连成网络,解出的相位整片飘掉。我见过不少初学者解出离谱的形变值,最后发现就是没做掩膜,低相干区把周边全带偏了。
5. 从单对干涉到SBAS时序分析:MATLAB扩展实现要点
单对InSAR只能给出一段时间内的总形变,如果要看形变随时间演化的过程,就得做时序InSAR分析。SBAS(小基线集)是其中最常用的一种。核心逻辑一句话概括:把多景影像分成若干小基线组合,生成多幅干涉图,然后通过最小二乘反演出每个时间点的形变量。
5.1 SBAS-InSAR的整体思路与MATLAB实现框架
SBAS的实现步骤大致如下:
- 选取主影像,按时间和空间基线阈值生成干涉对组合
- 对每个干涉对做常规InSAR处理,得到解缠相位
- 拼接所有干涉对的相位方程,形成观测方程组
- 用最小二乘或SVD方法反演形变时间序列
- 估计并去除残余地形误差和大气延迟
MATLAB里第3步和第4步的代码核心是一个线性反演问题。假设有(M)个干涉对、(N)个影像时间点,每个干涉对的解缠相位观测值(d_i)与相邻时间点的形变增量之间的关系是:
[ d_i = \sum_{k=p}^{q} v_k \cdot \Delta t_k ]
把所有干涉对拼成一个方程矩阵(A)(大小(M \times (N-1))),然后:
% 构建设计矩阵A A = zeros(M, N-1); for i = 1:M A(i, tstart(i):tend(i)-1) = 1; % 该干涉对覆盖的时间段 end % 最小二乘求解形变速率 v_hat = (A' * A) \ (A' * d_obs); % 累积形变量 cum_displacement = cumsum(v_hat .* dt);实际反演中还要注意A矩阵可能是欠秩的(干涉对不连续),这时候用SVD求伪逆更稳健:
[U, S, V] = svd(A, 'econ'); invS = diag(1 ./ diag(S)); v_hat = V * invS * U' * d_obs;SBAS的优势在于它能充分利用多景数据,压制大气噪声。但同样的时间序列,基线组合选得好不好直接决定结果质量。我通常这样定阈值:时间基线小于60天,空间基线小于临界基线(Sentinel-1大概200米)的30%-50%,这样既能保证干涉对数量足够,又能控制去相干影响。
5.2 形变速率图的可视化与导出小技巧
反演得到形变速率场之后,可视化是另一个容易被忽略的环节。很多人在MATLAB里imagesc一拉,颜色条一糊就完事。实际上形变图的可视化有几个讲究:
第一,坐标系要对。SAR数据处理完得到的形变图是斜距坐标系,需要地理编码到经纬度才能和GIS数据叠加。MATLAB里可以根据几何参数做逐像素重采样,或者二次多项式拟合到已知控制点。
第二,显示范围要合理。形变图往往有少量异常大值(解缠残留或大气噪声),直接全范围显示会让颜色条被极端值拉开,真实形变区域反而看不出颜色差异。我处理时一般把显示范围卡在形变值分布的2%-98%分位数:
low = prctile(deformation(:), 2); high = prctile(deformation(:), 98); imagesc(x, y, deformation, [low high]);第三,色带选择不要用默认的jet,彩虹色带会让人产生错误的视觉权重。推荐用蓝白红或者蓝白橙这样的双极色带,零值放中间,形变正负一目了然。
5.3 分辨率、时间基线与解缠精度的连锁影响
SBAS结果看着漂亮,但实际调试的时候经常遇到一个连锁反应:多视比取大了,分辨率下降但相干性提升;相干性提升后解缠误差变小,时序反演更稳定。多视比取小了,细节保留但噪声大,解缠经常出飞周,飞周在时序反演里会被当成真实信号,误差呈指数级扩散。
所以我的经验是,做SBAS之前一定要先做单对干涉的质量预检。拿3-5对时间基线和空间基线都适中的干涉对跑一遍完整链路,统计解缠残差和相干性分布。如果这些预检对的质量都不错,再放量做全时序;如果预检对就出现大面积低相干或者解缠飞周,先想清楚是数据问题、配准问题还是参数问题,不要一头扎进SBAS反演里浪费时间。
另外,大气延迟是SBAS中最难完全消除的误差源。MATLAB里可以用线性模型或者高斯滤波做初步大气校正,但要做到更好,得引入外部气象模型数据或者独立的大气延迟图。项目精度要求高的时候,这部分工作不能省。
6. 实际调试中躲不开的坑:类型、精度与内存的教训
最后这一章专门说踩坑经验。InSAR处理链路很长,任何一个环节出错都会导致结果一塌糊涂,而且错误往往不容易立刻发现,等发现时已经浪费了大量时间。
6.1 复数数据类型:最隐蔽的敌人
MATLAB里复数默认是double(双精度),一景5000x5000的复数SLC,double类型就是400MB。很多人的MATLAB脚本写着写着就内存不足了,根源就在于没控制数据精度。
我建议所有SLC数据读入后立刻转single:
slc1 = single(slc1); slc2 = single(slc2);单精度对InSAR处理精度完全够用。相位精度要求再高,也不至于在单精度上有可感知的损失。但如果不加控制,一个处理链路上可能有七八个中间变量都是double,再加上干涉图、相干性图、滤波结果,内存轻松爆掉。
还有一个更隐蔽的坑:有些MATLAB函数(比如fft2)在输入是single时按single计算,但在某些版本里可能返回double。处理完一个模块后养成用whos检查变量类型的习惯,别不知不觉又变回double了。
6.2 MATLAB版本兼容性与奇怪的报错
做SAR处理的人常用旧版本MATLAB,因为很多第三方工具箱和脚本只在新版验证过,但旧版运行时会碰到一些奇奇怪怪的报错。我自己遇到过一个经典问题:R2022b里imregcorr的参数名和R2021a不一样,导致同事的脚本一到新版本就报错。
处理策略是:在脚本开头加一段版本检查,或者干脆封装一个兼容层函数。比如读取SLC文件:
function data = read_slc_float(filename, nlines, npixels) fid = fopen(filename, 'rb'); if verLessThan('matlab', '9.10') data = fread(fid, [2*npixels, nlines], 'float32=>float32'); else data = fread(fid, [2*npixels, nlines], 'float32=>single'); end fclose(fid); data = complex(data(1:2:end, :), data(2:2:end, :)); end这类兼容性问题不解决,换台机器换个版本就抓瞎。做数据处理的人一定要有这个意识:脚本要能跨机器跨版本复现,这是基本功。
如果你碰到MATLAB启动时报错或版本冲突(比如之前线上出现过"r2022b error 9"这类启动异常),最有效的处理是彻底清理用户目录下的偏好设置,或者重装对应运行库。很多都是老版本的运行库和新版本冲突导致,跟代码本身没什么关系。
6.3 循环慢:用向量化和Parallel Computing Toolbox提速
InSAR处理的循环多到让人头皮发麻。逐像素的双循环在5000x5000的矩阵上跑一次,纯MATLAB可能要几分钟甚至半小时。提速的方法主要有两个方向:
第一,矩阵化。能用矩阵运算解决的绝不用循环。比如上面提到的平地相位生成,用meshgrid生成坐标网格,一次性计算整个平面,比逐像素循环快几十倍:
[cols, rows] = meshgrid(1:npixels, 1:nlines); R = R0 + cols * rg_spacing; flat_phase = -4 * pi / lambda * (B_perp ./ (R .* tan(theta))) .* (cols * rg_spacing);第二,并行化。parfor替代for,尤其是在分块滤波、分块多视这类循环结构里,效果非常明显。但parfor有一个常见误区:默认的并行池大小取决于逻辑处理器数量,而不是物理核心数。对于计算密集型任务,如果你用的是支持超线程的CPU,逻辑处理器比物理核心多一倍,开满逻辑处理器反而可能导致性能下降。我一般先用feature('numcores')查物理核心数,再在parpool里指定这个数值。
num_physical_cores = feature('numcores'); parpool('local', num_physical_cores);另外一个实用的提速技巧:在parfor里避免传大数据块。每轮循环需要的大变量可以在循环外面裁剪好,以切片方式传进去,不然通信开销会让你得不偿失。
6.4 可视化排错的三个常用手法
最后分享几个快速定位问题的可视化技巧。处理InSAR数据,遇到结果不对的时候,别急着改参数,先做诊断。
第一,相位图要配着幅度图看。干涉相位图上的条纹,正常情况下应该与地形或形变场的空间分布相关。如果条纹呈现毫无规律的密集噪声纹,大概率是配准失败或者主辅影像方向反了。
第二,解缠结果用剖面线检查。在解缠后的相位图上画一条横截面线,看相位变化是否连续。如果出现整段整段的相位跳变,通常是掩膜没做好或者解缠算法在低相干区崩了。
第三,用两景数据的幅度图叠加检查配准。把主影像幅度图调成红色通道,辅影像配准后的幅度图调成青色通道,在MATLAB里用imshow叠加显示,如果边缘对齐,叠加图应该是灰色调的,如果出现红色和青色镶边,说明配准还有亚像素级偏移。
这些排错方法不高端,但非常实用。做InSAR处理不是跑通脚本就完事,每一步都要能解释为什么,才能确保结论可信。我在实际项目里的习惯是,每个中间产品都会存一份图和一份数据,哪怕当时觉得没用,后面排错的时候可能就是救命的关键线索。
本文还有配套的精品资源,点击获取