单像素成像重建算法对比:压缩感知与共轭梯度下降的Matlab实践
简介这份资源面向从事计算成像、压缩感知与图像重建方向的学生和研究人员围绕单像素成像SPI这一主题用Matlab实现了多种重建算法的对比演示帮助读者在同一框架下理解不同方法在成像质量与收敛特性上的差异。压缩包共10个文件以9个m脚本和1个txt说明为主整体约12KB脚本按算法拆分为独立函数便于单独调用与横向比较。内容覆盖差分鬼成像、梯度下降、共轭梯度下降、泊松最大似然、交替投影以及稀疏表示与全变分两类压缩感知重建并配有误差评估与演示入口可直接运行观察各算法重建效果。目前已有2761人学习下载适合希望快速上手单像素成像仿真、对比经典与压缩感知类算法性能、并在此基础上做二次开发的读者参考。1. 单像素成像为什么一个点探测器能拍出整幅图一块没有空间分辨能力的单点探测器凭什么能重建出二维甚至三维图像这是单像素成像最反直觉的地方。传统相机靠面阵传感器逐像素记录光强而成像的本质其实是“把场景投影到一组基上再测量投影系数”。单像素成像换了个思路用空间光调制器比如数字微镜阵列 DMD把一组已知图案打到场景上单点探测器只测这组图案与场景的內积——一个标量。重复 M 次得到 M 个标量再靠算法反推出图像。这背后是压缩感知Compressed Sensing在撑腰只要场景在某个变换域稀疏测量数 M 就能远小于像素数 N照样精确重建。Matlab 单像素成像算法比较这个资源核心就是把重建环节的几种主流算法摆在一起让你看清同一组测量数据在不同求解器下差在哪。搞懂它等于搞懂了“欠定方程怎么解”这件事在成像里的真实代价。2. 压缩感知的数学骨架为什么 M 远小于 N 还能解出来2.1 从欠定方程到稀疏先验单像素成像的测量模型可以写成一行矩阵方程y Φx n其中 y 是 M×1 的测量向量Φ 是 M×N 的测量矩阵每一行对应一张投影图案x 是 N×1 的待重建图像按列拉直n 是噪声。M N 时这是欠定方程解有无穷多个。传统最小二乘会给出最小范数解但那个解通常糊成一团根本不是原图。压缩感知的关键转折在于自然图像在某个变换域 Ψ 下是稀疏或可压缩的即 x Ψs而 s 中只有 K 个显著非零系数K N。于是问题变成在满足 y ΦΨs 的所有 s 中找最稀疏的那个min ||s||_0 s.t. y ΦΨsl0 范数最小化是 NP 难的但 Donoho 和 Candès 那一批工作证明了当 Φ 满足有限等距性质RIP且 M ≥ C·K·log(N/K)l0 问题可以松弛成 l1 问题解出来几乎一样。这就是为什么测量数能压到像素数的百分之几甚至更低。2.2 测量矩阵为什么不能随便选Φ 不能是随便一个随机矩阵就完事。RIP 条件要求 Φ 的任意 2K 列都近似正交等价地说Φ 和稀疏基 Ψ 之间要“不相干”。常见的实现思路是高斯随机矩阵每个元素独立同分布 N(0, 1/M)RIP 以极高概率成立是最省心的选择但硬件上 DMD 只能投二值图案所以实际系统常用伯努利矩阵或哈达玛矩阵。哈达玛矩阵元素只有 1/-1DMD 实现容易且行之间严格正交重建质量通常比同测量数的高斯矩阵还稳。部分傅里叶矩阵适合频域采样场景但要求采样位置随机化否则相干性会崩。在 Matlab 里比较算法时测量矩阵的选择会直接改变结论。用高斯矩阵跑出来 CG 比 OMP 好换成哈达玛矩阵可能差距就缩小了。所以资源里如果固定了 Φ那比较的是求解器如果 Φ 也可换那比较的就是整个采样-重建链路。2.3 稀疏基选错后面全白搭Ψ 的选择同样致命。自然图像常用离散余弦变换DCT或小波基。DCT 对平滑区域友好小波对边缘和纹理更敏感。如果场景是二值掩膜或稀疏点阵那 Ψ 取单位矩阵即 x 本身稀疏反而最合适。常见的翻车场景是拿 DCT 去重建一个本身在空域就稀疏的目标结果算法收敛慢、残差大还以为是求解器不行。实际上换个基同一套代码重建质量立刻上一个台阶。3. 共轭梯度下降为什么它成了压缩感知的默认求解器3.1 从最速下降到共轭方向压缩感知的 l1 问题通常转成无约束形式min λ||s||_1 0.5||y - ΦΨs||_2^2这个目标函数不可微l1 项在零点不可导所以不能直接上标准梯度下降。但可以拆成两步梯度下降做数据保真项软阈值做稀疏促进。这就是迭代软阈值算法ISTA的骨架。ISTA 的收敛速度是 O(1/k)慢得让人想砸键盘。共轭梯度下降CG走的是另一条路。它不直接解 l1而是解一系列平滑近似问题或者在最小二乘子问题上用共轭方向加速。CG 的核心洞察是最速下降每次沿负梯度走但相邻两步的梯度方向会互相抵消导致锯齿震荡。CG 构造一组关于系统矩阵共轭的方向保证每一步在已搜索子空间内是最优的理论上 N 步收敛无噪声时。在 Matlab 里CG 通常不直接用于 l1而是嵌在更外层的迭代里比如内层用 CG 解加权最小二乘min ||y - ΦΨs||_2^2 λ s^T W s外层更新权重 W逼近 l1 范数迭代重加权这种结构比纯 ISTA 快一个量级代价是每步要解一个线性系统实现复杂度高。3.2 Matlab 里的 CG 实现细节Matlab 自带pcg函数但直接拿来解压缩感知问题通常不好使因为系统矩阵 ΦΨ 是 M×N 的矩形矩阵pcg要求方阵。常见的做法是解正规方程(Ψ^T Φ^T Φ Ψ λW) s Ψ^T Φ^T y左边是 N×N 的方阵可以用 CG 解。但显式构造这个矩阵代价是 O(N^2) 存储和 O(N^3) 求逆对图像来说 N 动辄几万到几十万根本存不下。所以实际代码里都用函数句柄做隐式矩阵向量乘% 隐式定义 A Psi * Phi * Phi * Psi lambda * W function y Afun(s, Phi, Psi, lambda, W) y Psi * (Phi * (Phi * (Psi * s))) lambda * (W .* s); end % 用 pcg 解传入函数句柄而非矩阵 [s_rec, flag, relres, iter] pcg((s) Afun(s, Phi, Psi, lambda, W), ... Psi * Phi * y, 1e-6, 200);这段代码的关键点Afun不构造矩阵每次只做四次矩阵向量乘复杂度 O(MN)远低于 O(N^2)。lambda控制稀疏权重越大越稀疏但太大就丢细节。W是重加权对角矩阵初始为单位阵每轮外层迭代后更新为W diag(1./(abs(s)eps))。pcg的第四个参数是最大迭代数压缩感知里通常设 100~300设太大浪费时间设太小残差下不去。参数说明tol设 1e-6 是经验值再小收益递减maxit根据 N 和稀疏度调一般取 N/10 到 N/5。如果flag不为 0说明没收敛优先检查lambda是否过大导致条件数爆炸。3.3 CG 和其他算法的真实差距在 Matlab 单像素成像算法比较这个资源里CG 通常和 OMP正交匹配追踪、ISTA/FISTA、TVAL3全变分放在一起跑。差距体现在测量率 10% 以下OMP 直接崩CG 和 TVAL3 还能看但 CG 对噪声更敏感。测量率 20%~30%CG 和 FISTA 接近CG 略快但 FISTA 调参更简单。测量率 50% 以上所有算法都好看CG 的优势只剩速度。所以“CG 最好”这个结论是有条件的。资源的价值就在于把这些条件用可复现的脚本摆出来而不是给一个万能答案。4. 避坑与排查单像素成像重建常见的五个翻车点4.1 重建出来全是噪点残差却很小现象relres显示 1e-8但图像完全不可辨认。 原因测量矩阵 Φ 和稀疏基 Ψ 相干性太高或者 Φ 本身条件数极差。残差小只说明 y 拟合得好不代表解是稀疏的。 解决换哈达玛矩阵或高斯矩阵检查 Φ 的列相关性必要时对 Φ 做正交化预处理。4.2 CG 迭代不收敛flag 一直非零现象pcg跑满 maxit 还没到 tolflag1。 原因正规方程的系数矩阵条件数太大通常是 lambda 太小或 W 更新太激进。 解决把 lambda 调大一个量级或者给 W 加下限W diag(1./(abs(s)0.01))避免权重爆炸。4.3 图像边缘出现振铃像水波纹现象重建图在强边缘附近有明暗交替的条纹。 原因DCT 基的全局性导致边缘处吉布斯现象或者 TV 权重不够。 解决换小波基或者在目标函数里加全变分项Matlab 里可以用TVAL3或自己写梯度下降。4.4 测量数降到 5% 以下所有算法都失效现象不管换什么求解器重建 PSNR 都低于 15dB。 原因超过了压缩感知的理论下限。M ≥ C·K·log(N/K) 是硬约束K 估计不准时更容易踩线。 解决先估计场景的稀疏度 K用 DCT 或小波系数排序看第 K 个系数的衰减速度再反推最小 M。不要盲目降采样。4.5 跑得比预期慢十倍现象同样的算法别人跑 10 秒自己跑 100 秒。 原因在循环里反复构造 Φ 或 Ψ或者用了full存稀疏矩阵。 解决把 Φ 和 Ψ 预计算成函数句柄或稀疏矩阵循环内只做矩阵向量乘。Matlab 的*对稀疏矩阵有优化但前提是别用full转回稠密。5. 设计取舍为什么没有“最好”的算法只有最合适的组合单像素成像的重建算法选择本质上是在四个维度上做权衡重建质量、速度、调参难度、硬件适配性。CG 在速度和质量之间取了一个偏速度的平衡点但它对 lambda 和 W 的更新策略敏感调参成本高。FISTA 调参简单但每步要做软阈值速度略慢。OMP 在测量率高时快且准但测量率一低就废。TVAL3 对边缘保护好但每步要解全变分子问题实现复杂度最高。我一般会这么理解如果你做的是静态场景、测量时间不敏感优先 TVAL3 或小波域 FISTA如果是动态场景、要求实时重建CG 嵌重加权是最实际的路线如果只是教学演示、测量率给到 40% 以上OMP 足够。资源里的 Matlab 脚本应该把这几种都跑一遍用同一组测量数据、同一套评价指标PSNR、SSIM、重建时间做对比而不是只给一个“最优”结论。验证方法上建议自己构造一个已知的稀疏场景比如几个随机点跑一遍所有算法看谁能在 M/N0.1 时精确恢复。然后再换成自然图像看差距怎么变。这个对比过程比任何结论都有说服力。从那以后我每次选重建算法都强制先跑一遍稀疏度估计和相干性检查再决定用 CG 还是换基。希望帮到你。本文还有配套的精品资源点击获取