MATLAB中基于SVD从正弦图重建256×256图像问题咨询
核心错误原因
- 混淆了SVD分解的对象与CT成像的物理逻辑
你对正弦图本身做SVD分解得到的三个矩阵仅能表征正弦图自身的线性分量,不包含CT成像系统的投影映射关系,不可能直接通过这三个矩阵跳过投影逆过程得到原始图像。你之前的思路误将正弦图的SVD等价为成像系统投影矩阵的SVD,二者的物理意义完全不同。 - 伪逆公式使用错误
SVD求解矩阵伪逆的正确公式是pinv(A) = V * pinv(S) * U',这里是矩阵乘法而非逐元素点乘(.*),你使用点乘自然会触发维度不匹配报错;此外S是对角矩阵,伪逆仅对非零对角元取倒数、其余位置置0,不是对S的所有元素取倒数。 - 重建逻辑链路错误
U*S*V'直接相乘的结果只能还原你输入的原始正弦图,原始正弦图到256×256图像之间必须经过投影逆变换(反投影/逆问题求解),不可能直接通过正弦图的SVD得到原始图像。
正确实现流程
- 第一步:明确CT正向投影模型
假设你的成像系统的投影矩阵为P,维度为(367*180) × (256*256),其物理意义是将拉为列向量的256×256原始图像x,映射为拉为列向量的367×180正弦图y,满足关系y = P * x,图像重建本质是求解该线性逆问题得到x。 - 第二步:对投影矩阵做SVD分解
不要对正弦图做分解,而是对投影矩阵P做经济模式SVD减少计算量,MATLAB代码为:
[U, S, V] = svd(P, 'econ');
如果没有显式的投影矩阵,可以通过你的投影参数(角度范围、探测器像素数等)调用MATLAB的radon相关接口生成匹配的投影矩阵。
- 第三步:截断SVD正则化解原始图像
为了过滤噪声可以保留前k个最大的奇异值,求解代码如下:
% 可根据重建效果调整保留的奇异值数量k k = 120; S_pinv = zeros(size(S,2), size(S,1)); for i = 1:k % 仅对非零奇异值取倒数构造伪逆 if S(i,i) > 1e-6 S_pinv(i,i) = 1/S(i,i); end end % 求解并恢复为256×256图像 y_vec = reshape(your_sinogram, [], 1); % your_sinogram替换为你的367×180正弦图 x_vec = V * S_pinv * U' * y_vec; x_rec = reshape(x_vec, 256, 256);
- 替代方案:如果不想显式生成投影矩阵,可以先用SVD对正弦图做去噪(保留前k个分量重构无噪声正弦图),再调用
iradon函数做滤波反投影得到原始图像,该方案中SVD仅用作正弦图的预处理步骤。
内容的提问来源于stack exchange,提问作者Chris Taylor
相关产品推荐
相关产品推荐

