简介一份围绕离轴三反光学系统大视场成像的计算成像设计方法的PDF资料面向具备光学基础与Python编程能力的研究人员、工程师和研究生。内容基于英文论文复现阐述了利用波前像差理论和Zernike多项式构建点扩散函数模型的思路并通过空间变化反卷积算法对退化图像进行恢复摒弃了传统上过度依赖自由曲面的方案为航空侦察、空间光学遥感等大视场高分辨率场景提供了低成本实现路径。资料中给出了焦距260mm、F数2.5、初始视场8°×1°的仿真算例经过处理后有效视场扩展至8°×6°全视场调制传递函数超过0.4。压缩包仅含1个PDF文件约911KB但其中详细解释了离轴光学系统成像模拟、PSF生成、图像退化与恢复、图像质量评估等Python代码模块并配有参数设置与算法说明便于读者复现整个实验流程。目前已有91人学习下载是快速掌握空间变化反卷积及计算成像系统设计的实用参考。1. 离轴三反系统为什么只配小视场计算成像怎么把它撑大光学设计圈子里有一个公认的痛点离轴三反系统TMA天生无遮拦、可做到近衍射极限但视场一大边缘像差就崩。你不是没试过把次镜和三镜的非球面阶数往上提把镜间距压到极限全视场还是只能停在 2°3° 上下。再想扩大视场要么上多台探测器机械拼接要么继续堆镜片重量和成本立刻失控。而光学成像技术里有一个相对冷门的解法用计算成像的思路把系统里每一点的空间变化 PSF 当作已知量靠反卷积后处理把像差“算回来”从而实现离轴三反系统的大视场成像。这套视场扩展方法不需要改镜筒不增加镜片核心工作量从机械结构转移到算法和标定。适合的对象很明确手里有一套像差已经压到极限、但视场就是不够用的离轴 TMA且愿意在算法链路上投入的团队。2. 先把非对称系统的像差账算清楚视场扩展不是玄学在写任何代码之前先回答一个问题为什么离轴三反的视场扩展这么难难在光学设计还是难在成像链路2.1 离轴三反的像差为什么随视场“漂移”离轴三反系统的结构特征是光轴折叠、孔径偏心、非球面镜有大量偏心倾斜量。它在中心视场能做到很好的像质但对称性被打破后剩余像差不再是传统同轴系统那种随视场平滑的“初级像差球面”而是一个随视场坐标非线性变化的高阶函数。比如典型的离轴 TMA 在中间视场还勉强能用在角点会出现明显的彗差、像散和畸变而且这些像差的分布左右不对称、上下不对称。这种“非对称”会带来一个直接后果系统的点扩散函数PSF不但在视场不同位置形状不同而且不存在旋转对称性。中心视场的 PSF 可能是漂亮的圆形艾里斑边缘视场的 PSF 变成带彗尾的扇形斑甚至局部出现明显的色散。传统光电成像系统里常用“全图一个 PSF 然后图像复原”的做法在这里完全失效——因为 PSF 在像面不同区域可能相差好几倍起来。我在实际评估过一个 0.5°×0.5° 的离轴三反中心视场 RMS 波前误差 0.04 波边缘视场直接到 0.25 波对应 PSF 的半高全宽翻了将近三倍。这种系统如果只看中心像质会误以为它很优秀一旦上了大靶面探测器边缘立刻露馅。所以做视场扩展的第一步不是急着建优化模型而是先把 PSF 随视场的变化规律摸清楚。2.2 光学拼接 vs 计算重建选型看这四件事业界常见的扩大视场路径有四条。第一条是探测器拼接多个 CMOS 拼成大靶面机械公差和拼接缝问题一堆成本高。第二条是光学扫描用快反镜把不同视场依次扫到中心区域成像再事后拼接对扫描机构和同步曝光要求高动态场景直接没戏。第三条是光学设计上继续加镜片比如加入第五镜、第六镜把像差压回去但离轴三反最大的优势就是简单紧凑加镜片等于放弃这个优势。第四条就是这里讲的计算成像路线保留现有光学系统对每个视场的空间变化 PSF 进行标定或建模用算法重建恢复大视场。选计算成像路线之前我会先确认四件事。第一系统的 PSF 是否稳定即温度变化、装配应力、对焦状态是否可控并建模。第二探测器的噪声是否可控因为反卷积放大噪声很凶信噪比低于 20 dB 时重建质量会非常差。第三是否有足够计算资源做分块迭代实时性要求高不高。第四是否需要保真颜色因为色差同样随视场变化多通道重建的复杂度会成倍增加。如果这四个问题都能接受那么用计算成像做视场扩展就是性价比最高的方案。在实际项目中我更倾向于把光学设计和计算成像做联合设计而不是等光机完工后才想算法。离轴三反的镜面自由度留一点给“计算友好性”比如让 PSF 随视场变化尽量平滑连续避免某个视场点突然出现奇异像差这能给后面的重建算法省去大量麻烦。2.3 空间变化PSF的计算模型大视场成像的数学地基要把计算成像落地第一步是建立数学模型。假设一个理想的高分辨率场景x经过离轴三反系统后形成模糊像b忽略非线性响应的情况下可以写成b(u) ∫ PSF(u, v) · x(v) dv n(u)其中u是像面坐标v是物面坐标PSF(u, v)是空间变化点扩散函数。这个模型看起来简单但难点在于 PSF 随着u和v都变化是一个四维张量。实际工程中几乎没人会存储完整的四维张量常见做法是把视场划分成 N×N 网格在每个网格节点上标定/仿真一个 PSF再用双线性插值得到任意位置的 PSF。这个网格 PSF 模型就是整个视场扩展方法的数学地基。另一个关键点是非对称系统的 PSF 矩阵不是对称托普利兹矩阵不能用简单的傅里叶变换直接逆。所以分块迭代重建成为必然选择。你在文献里看到的各种“分视场反卷积”“空间变化PSF复原”本质都是在做同一件事把大视场问题切成若干个小视场问题每个小问题用对应的 PSF 做反卷积再拼起来。下面就从仿真开始把这条路一步步走通。3. 在Python里把离轴三反的退化过程仿真出来从Zernike系数到分块卷积在动代码前先说清楚为什么要先做仿真。真实系统的 PSF 标定需要点源靶标、精密位移台和稳定环境成本高周期长。仿真能让我们在算法开发阶段就拿到可控的“地面真值”可以反复验证重建算法的收敛性、鲁棒性和参数敏感度。等仿真链路走通了再把真实标定的 PSF 替换进去风险小得多。3.1 用6项Zernike系数描述离轴像差离轴三反的波前差在像面不同位置可以近似用低阶 Zernike 多项式组合表示但要注意这里的“低阶”不是全视场统一的低阶而是每一项系数随视场坐标发生变化。我一般取六个主要项离焦、0° 像散、45° 像散、x 方向彗差、y 方向彗差、球差。这个组合已经能描述大多数离轴三反在 2° 以下视场里的主要像差行为。更高阶项如三叶差在真正的自由曲面离轴系统里也会出现但建模逻辑是一样的加项即可。下面这段代码生成单位圆瞳孔上的波前差并合成 PSFimport numpy as np from numpy.fft import fft2, fftshift, ifft2 def zernike_wavefront(x, y, coeff): # coeff顺序: [离焦, 0度像散, 45度像散, x彗差, y彗差, 球差] # 所有系数都以波长为单位1.0 1个波长PV r2 x**2 y**2 r np.sqrt(np.clip(r2, 0, 1)) w np.zeros_like(x) w coeff[0] * r2 # 离焦 w coeff[1] * (x**2 - y**2) # 0度像散 w coeff[2] * (2 * x * y) # 45度像散 w coeff[3] * (y * (3 * r2 - 2)) # 沿y的彗差 w coeff[4] * (x * (3 * r2 - 2)) # 沿x的彗差 w coeff[5] * (6 * r2**2 - 6 * r2 1) # 球差 return w def make_psf(size_px128, aperture0.8, coeffNone): # 在[-1,1]x[-1,1]的正方形上建立坐标瞳孔半径归一化为1 y, x np.mgrid[-1:1:size_px*1j, -1:1:size_px*1j] pupil (x**2 y**2 aperture**2).astype(float) if coeff is None: coeff np.zeros(6) # 瞳孔上的复振幅 孔径掩模 * 相位偏差 wv zernike_wavefront(x, y, coeff) field pupil * np.exp(1j * 2 * np.pi * wv) # 远场衍射傅里叶变换得到PSF psf np.abs(fft2(fftshift(field)))**2 psf fftshift(psf) psf / psf.sum() return psf这段代码的逻辑是在归一化入瞳坐标下用 Zernike 多项式构造波前差wv瞳孔内透过率看作 1瞳孔外是 0。复振幅经过一次傅里叶变换就得到远场光强分布也就是 PSF。fftshift第一次是让瞳孔居中第二次是让 PSF 中心移到数组中心方便后续卷积。最后归一化保证所有 PSF 的总能量为 1因为光学系统本身不增加能量退化的图像整体亮度应该保持不变。参数说明size_px决定 PSF 的空间分辨率太小会欠采样太大计算变慢。常见经验是至少让艾里斑直径占 8 个像素以上反卷积才有意义。aperture是入瞳半径占半尺寸的比例模拟离轴系统的偏心遮挡时可以改成一个自定义掩模这里先用圆孔简化。coeff 的数值以波长为单位离焦 0.25 表示 0.25 个波长的离焦这在真实光学系统里对应很明显的模糊低于 0.01 的系数几乎可以忽略。3.2 生成5×5网格PSF并模拟空间变化模糊实际离轴三反的 PSF 随视场连续变化我们按 5×5 网格离散化每个网格节点仿真一个 PSF。用 vis 场坐标决定 Zernike 系数的方式要符合离轴系统的像差场特性也就是像散和彗差随视场近似线性变化。def generate_psf_grid(grid_size5, psf_px96, field_samplesNone): # 视场坐标范围归一化成 [-1, 1] x [-1, 1] rows, cols grid_size, grid_size if field_samples is None: field_samples { ast_x: 0.012, # 像散随x视场的变化率 ast_y: 0.008, coma_x: 0.020, # 彗差随x视场的变化率 coma_y: 0.015, defocus: 0.003, # 残余离焦随视场的变化 } psf_grid np.zeros((rows, cols, psf_px, psf_px)) for i in range(rows): for j in range(cols): # 归一化视场坐标从(-1,-1)到(1,1) fx -1 2 * i / (rows - 1) fy -1 2 * j / (cols - 1) coeff np.array([ field_samples[defocus] * (fx fy), field_samples[ast_x] * fx, field_samples[ast_y] * fy, field_samples[coma_x] * fx, field_samples[coma_y] * fy, 0.0 # 球差设成常数或也随视场变化 ]) psf_grid[i, j] make_psf(psf_px, aperture0.75, coeffcoeff) return psf_grid这个生成函数把每个视场坐标映射成一组 Zernike 系数。需要强调的是这些变化率参数不是拍脑袋定的而是应该从光学设计软件Code V、Zemax里导出的真实视场像差拟合得到。仿真阶段的field_samples只是占位值让你先把算法跑起来。如果你面前有一份真实系统的 Zemax 多视场波前系数表替换进去就行。生成 PSF 网格后再写一个空间变化退化函数对每个图像块用对应的 PSF 做卷积from scipy.ndimage import convolve def space_variant_degrade(image, psf_grid, block_ratio0.2, overlap24): # image: 地面真值图像float型范围[0,1] # psf_grid: (rows, cols, p, p)由generate_psf_grid得到 h, w image.shape rows, cols psf_grid.shape[:2] bh, bw int(h * block_ratio), int(w * block_ratio) # 保证块数匹配网格数 out np.zeros_like(image, dtypefloat) weight np.zeros_like(image, dtypefloat) for i in range(rows): for j in range(cols): # 取带重叠的块 r0 max(i * bh - overlap, 0) r1 min((i 1) * bh overlap, h) c0 max(j * bw - overlap, 0) c1 min((j 1) * bw overlap, w) block image[r0:r1, c0:c1] psf psf_grid[i, j] blurred convolve(block, psf, modenearest) out[r0:r1, c0:c1] blurred weight[r0:r1, c0:c1] 1 out / np.maximum(weight, 1) return out这个退化函数非常贴近真实物理每个视场中心区域用对应的 PSF 卷积块与块之间留重叠区最后用重叠计数归一化。modenearest是为了避免块边缘出现补零黑边实际探测器上也不存在黑边。block_ratio 是分子块边长占图像边长的比例5×5 网格对应 block_ratio0.2正好把满幅切匀重叠区 overlap 越大相邻视场 PSF 的过渡越平滑但同时边缘区域 PSF 与中心区域 PSF 互相污染。仿真阶段建议 overlap 取 PSF 一半宽度以上。3.3 仿真参数怎么设网格密度、PSF采样和block尺寸这三个参数直接决定你的重建结果上限。网格密度视场扩展的关键网格太稀PSF 插值误差大网格太密标定成本指数上升。我的经验标准是相邻网格中心之间 PSF 的相似度归一化互相关不低于 0.95。用 5×5 网格覆盖全视场通常就足够描述 2°5° 视场的变化如果系统像差变化剧烈加密到 7×7。PSF 采样尺寸方面别小于 64×64。离轴三反的边缘 PSF 常常有很长的彗尾尺寸太小截断会导致反卷积时出现周期性和振铃。block 尺寸最好对应一个“像差变化可以忽略”的子视场也就是说在这个 block 内 PSF 变化系数小于 5%。实际项目中这个值由像差场曲线决定我从低阶场线性变化出发image 512×512、5×5 网格、block_ratio0.2 是合理的起点。4. 分块 Richardson-Lucy 重建拿回大视场图像的完整代码退化仿真做完接下来是核心如何从退化图像里恢复出大视场清晰图像。非对称系统的空间变化 PSF 反卷积我首选 Richardson-LucyRL因为它能保证非负解并且对 PSF 的误差容忍度比 Wiener 滤波高一些。Wiener 滤波在 PSF 有频域零点或噪声大的时候容易产生负值和光晕。当然 RL 也不是没有缺点迭代次数多了会把噪声放大成颗粒所以得配合正则化手段。4.1 为什么全图用一个PSF反卷积会翻车很多人刚开始做空间变化复原时会图省事取系统中心视场 PSF 做全图反卷积。对离轴三反这种非对称系统这么做几乎是必翻车边缘视场的 PSF 和中心视场 PSF 差异过大你用 A 位置的 PSF 去反卷积 B 位置的模糊等于用错误的卷积核求解在数学上就是对真实场景的一种“过度拟合”。结果表现为边缘出现梳状振铃、彗星形伪影严重时边缘区域的纹理被完全破坏比原图还难看。所以正确做法是“以子之矛攻子之盾”在每一个子块上使用该子块中心对应的空间变化 PSF 做反卷积再拼起来。下面这份代码是我在实际项目里一直在用的分块 RL 实现。4.2 RL迭代与分块拼接的Python实现from scipy.signal import fftconvolve def rl_deconvolve(blurred, psf, iterations30, eps1e-8): # blurred: 单帧退化裁剪图float32 # psf: 该视场的点扩散函数形状与blurred等大或略小需要先归一化 psf psf.astype(np.float32) psf / psf.sum() # 转置卷积核RL更新的核心 psf_rot psf[::-1, ::-1].copy() # 初始估计取一个接近退化的非负常数 est np.clip(blurred, eps, None).copy() for _ in range(iterations): # 当前估计经过PSF卷积模拟再次退化 reblur fftconvolve(est, psf, modesame) ratio blurred / np.maximum(reblur, eps) # 用转置卷积更新估计 est * fftconvolve(ratio, psf_rot, modesame) # 每次迭代后约束非负避免数值飘移 est np.clip(est, 0, None) return est def space_variant_rl(blurred, psf_grid, block_ratio0.2, overlap24, iterations30): h, w blurred.shape rows, cols psf_grid.shape[:2] bh, bw int(h * block_ratio), int(w * block_ratio) result np.zeros_like(blurred, dtypefloat) weight np.zeros_like(blurred, dtypefloat) for i in range(rows): for j in range(cols): r0 max(i * bh - overlap, 0) r1 min((i 1) * bh overlap, h) c0 max(j * bw - overlap, 0) c1 min((j 1) * bw overlap, w) sub blurred[r0:r1, c0:c1] # 每个块用该块中心对应的PSF重建 recon rl_deconvolve(sub, psf_grid[i, j], iterations) result[r0:r1, c0:c1] recon weight[r0:r1, c0:c1] 1 result / np.maximum(weight, 1) return result这段代码的流程是先把整幅退化图像切成与 PSF 网格对应的子块每个子块至少包含 overlap 一半的重叠区独立跑 RL 迭代再把所有子块的复原结果在同一坐标处相加并除以计数。这样做有两个好处一是每个位置的重建都用了邻近两个以上 PSF 的结果重叠区的过渡变得平滑二是即使某个块的 RL 出现局部震荡相邻块叠加后也能抑制一部分。RL 的更新公式需要解释一下。fftconvolve(est, psf, modesame)是在模拟“当前估计图像经过光学系统退化”的样子然后用真实退化图除以这个模拟退化图得到残差比例。转置卷积就是把残差“反投影”回估计图像相当于告知当前估计哪些像素需要增强、哪些需要削弱。modesame保证卷积前后尺寸一致但要注意 PSF 的尺寸不能太大我一般控制在blurred尺寸的 1/4 以内否则 same 卷积的边缘效应会把子块边界搞脏。4.3 三个必调参数迭代次数、重叠区宽度和psf网格插值第一迭代次数。经验值 2550 次。太少了结构没恢复边缘还是模糊太多了背景噪声变成砂砾。判断标准是边迭代边看复原图像的 MTF 是否还在上升或者用一个验证靶标做圆环能量测试。我一般先跑 30 次效果不好再加密 PSF 网格而不是盲目加迭代因为空间变化误差比收敛不足更致命。第二重叠区宽度。建议取 PSF 尺寸的一半以上。如果 overlap 设为 0分块之间的亮度会是台阶状跳变overlap 足够叠加平均能消除跳变。但 overlap 太大会让子块退化成近似全图失去了空间变化的优势。好的起始值是 PSF 宽度的 60%比如 PSF 96×96overlap 取 48 像素。第三PSF 插值。如果你的系统实际 FOV 不是恰好落在网格节点上就别用最近邻。一种可靠做法是用双线性插值生成所需位置 PSFdef interpolate_psf(psf_grid, fx_idx, fy_idx): # fx_idx, fy_idx 是连续网格索引比如 2.3 表示第2行和第3行之间的位置 i0 int(np.floor(fx_idx)) i1 min(i0 1, psf_grid.shape[0] - 1) j0 int(np.floor(fy_idx)) j1 min(j0 1, psf_grid.shape[1] - 1) a fx_idx - i0 b fy_idx - j0 psf ((1 - a) * (1 - b) * psf_grid[i0, j0] a * (1 - b) * psf_grid[i1, j0] (1 - a) * b * psf_grid[i0, j1] a * b * psf_grid[i1, j1]) psf / psf.sum() return psf这个插值函数在网络标定和实时重建之间搭了一座桥。实拍时不可能对每个像素都测 PSF但你可以用稀疏网格标定然后在重建时对每个块插值出更准确的 PSF。5. 避坑空间变化PSF重建最容易踩的五个坑这套方法看着简单跑起来全是细节。以下五个问题我在项目里几乎全踩过每条都给出可复现的排查路径。5.1 现象边缘区域振铃和彗星样伪影用中心视场 PSF 重建全图的典型翻车现象就是边缘出现沿一个方向拖尾的伪影像彗星一样。原因是离轴三反边缘视场的彗差很大PSF 本身就有一条亮尾你用中心 PSF 去反卷积等于认为这条尾不存在于是算法把 PSF 的尾部能量误判成图像中的物体边缘强行反向增强。解决方法是严格做分视场 PSF 重建不要偷懒取单 PSF。如果分块重建后仍有振铃检查每个子块的 PSF 有没有和该块中心坐标对齐。我见过一个案例PSF 网格标定时原点在左上角重建时按右下角取坐标结果所有块都错位了一个网格振铃反而更严重。用模拟退化数据做闭环验证能从根上跳过这个坑。5.2 现象分块边界出现棋盘格分块重建后图像像一块块拼接的豆腐边界处亮度断崖或呈接缝通常由两个原因造成。一是 overlap 设得太小或者根本没设两块重建图在缝处没有重叠区域做过渡。二是不同块的 RL 迭代次数不一致或者 PSF 没归一化导致灰度水平漂移。解决方法是把 overlap 开到 PSF 半径以上并且在叠加时用权重斜坡而不是直接平均。一个更省事的技巧是在空间域给重叠区加 Hann 窗叠加权重从 1 平滑过渡到 0基本能消除接缝。注意归一化每个 PSF 都必须除以自身总和否则不同块亮度相差 10% 以上加权也救不回来。5.3 现象重建噪声被RL迭代放大成砂砾RL 迭代更新在运算上等价于逐步逼近真实解但这是一个 ill-posed 问题噪声在高频被放大。尤其在暗光场景探测器读取噪声和散粒噪声叠加刚跑十几次迭代原本平滑的天空背景就变成密密麻麻的砂粒。解决思路有三条。第一保证输入图先做平场校正和死像素去除把固定图案噪声先干掉。第二RL 加高频抑制我一般会在每次迭代后对估计图像做一次轻度高斯平滑相当于 soft TV能很好抑制颗粒。第三迭代次数不要太贪停早一点。如果 20 次和 60 次的视觉效果差不多选 20 次因为 60 次只是在把噪声洗得更清晰。5.4 现象温度变化让标定PSF失效离轴三反的结构是碳纤维镜筒加铝镜框温度每变化几摄氏度镜间距、曲率半径稍变PSF 就会产生离焦变化标定时的 PSF 不再适用重建结果直接出现伪纹理。这是工程化时最大的坑。我的做法是给系统建立两个维度的 PSF 库一是视场网格二是温度/焦距。仿真阶段就加入离焦不确定性也就是每个视场位置的 coeff 不光随视场变还附加一个全局离焦项。重建前先用星点实时估计离焦量再在预存的离焦 PSF 库里插值。这样做的系统鲁棒性会好很多。5.5 现象重建MTF上不去分辨率不升反降有时候重建完测试靶标上的条纹边缘依旧发糊甚至比退化图还差。这通常说明 PSF 的采样小于真实光学系统的分辨率极限。你可能把 PSF 生成了 32×32但系统衍射极限对应的 PSF 直径需要 64×64 才不至于截断欠采样导致反卷积把本应连续的信息当成噪声处理。另一个常见原因是 PSF 生成时 pupil 里没考虑到离轴系统的局部遮拦。离轴三反的出瞳不是完整圆孔而是带有切边的形状如果你用圆孔拟合PSF 的高频细节丢失重建结果自然受限。最好直接从设计文件的出瞳数据中导出现场 PSF而不是用 Zernike 近似。6. 验证和进阶技巧把重建算法嵌进光学设计闭环算法跑通只是开始要让人信服这套视场扩展方法是可靠的必须做定量验证。6.1 用星点网格和MTF曲线给重建质量打分数仿真阶段我会同时准备三样东西地面真值图、退化图、重建图。重建图与地面真值的 PSNR 和 SSIM 是最直观的评价指标但这两个指标容易掩盖局部细节问题所以我额外做靶标验证。在仿真场景里放置一排等间隔的星点模拟无穷远处的点光源阵列退化后重建测量每个星点的半高全宽和能量集中度。计算恢复后的 Strehl 比我一般要求恢复到 0.8 以上才算合格对应的 MTF 曲线在奈奎斯特频率处不低于 0.1。写一个简洁的 MTF 计算函数def mtf_from_psf(psf): psf psf.astype(np.float32) psf / psf.sum() otf fft2(psf) mtf np.abs(fftshift(otf)) mtf / mtf.max() return mtf这个函数把 PSF 转成 OTF取模后归一化就得到 MTF。在验证管线里可以对重建后的星点图做一个梯度统计或者从图像中提取 PSF 轮廓再算 MTF方法一致。记住 MTF 是相对值关键看趋势重建图在低频段应该逼近 1高频衰减比退化图显著改善同时不要在特定频率出现跳变跳变往往是振铃或网格插值不当造成的。6.2 从仿真到实拍PSF标定与离线插值管线从仿真转到实拍时标定策略非常关键。不要试图标满整个视场的 PSF太耗时。常见的做法是在标定板上布置稀疏点源网格比如 5×5 或 7×7利用点源图像切割出各自的 PSF然后通过插值生成任意位置的 PSF。这样节省标定时间又保留空间变化细节。标定时要保证点源探测器过曝不多否则 PSF 的光核被截断反卷积会出现能量丢失。在工程落地上我把重建管线拆成两个阶段离线标定和在线重建。离线阶段生成 PSF 网格库并压缩存储在线阶段只做插值、分块 RL 和拼接。计算热图上512×512 图像、5×5 PSF 网格、30 次 RL 迭代在普通 CPU 上大约需要几十秒GPU 加速后可以压到 1 秒以内。这已经能满足不少非实时成像场景比如工业检测、遥感对地观测。最后说一个我的教训第一次做离轴三反视场扩展时我把全部精力花在优化光学系统上总想着把全视场像差压下去结果机械装调公差和温度漂移把成绩全吃回去了。后来改成“光学达到 80%其余交给算法”的思路给重建留余地反而让整个系统成本更低、像质更稳。如果你的光学系统已经定型那就像做后悔药一样把这套空间变化 PSF 重建管线补上先跑通标定、仿真、在环验证三个闭环再回头调光学。希望帮到你。本文还有配套的精品资源点击获取