% 读取图像文件
img = imread('mri.bmp'); % 从文件读取图像
if size(img, 3) == 3 % 如果图像是彩色的(3个颜色通道)
img = rgb2gray(img); % 将其转换为灰度图像
end
img = double(img); % 将图像数据转换为双精度类型
[height, width] = size(img); % 获取图像的高度和宽度
% 构造测量矩阵和基矩阵
Phi = randn(floor(height/3), width); % 生成随机测量矩阵,行数为原高度的1/3
Phi = Phi ./ repmat(sqrt(sum(Phi.^2, 1)), [floor(height/3), 1]); % 对测量矩阵的每一列进行归一化
% 初始化DCT基矩阵
mat_dct_1d = zeros(256, 256); % 初始化一个256x256的零矩阵,用于构建1D DCT基
for k = 0:1:255
dct_1d = cos([0:1:255]' * k * pi / 256); % 计算DCT的基函数
if k > 0
dct_1d = dct_1d - mean(dct_1d); % 对非零频的基函数进行去均值处理
end
mat_dct_1d(:, k+1) = dct_1d / norm(dct_1d); % 归一化后存入DCT基矩阵
end
% 对图像的每一列进行投影(压缩感知中的测量过程)
img_cs_1d = zeros(floor(height/3), width); % 初始化测量结果的矩阵
for i = 1:width
img_cs_1d(:, i) = Phi * img(:, i); % 对图像的每一列进行投影
end
% 使用CoSaMP算法进行恢复
sparse_rec_1d = zeros(height, width); % 初始化稀疏重构结果的矩阵
Theta_1d = Phi * mat_dct_1d; % 构造感知矩阵
for i = 1:width
column_rec = cs_cosamp(img_cs_1d(:, i), Theta_1d, height); % 对每一列进行重构
sparse_rec_1d(:, i) = column_rec'; % 将重构结果存入矩阵
end
img_rec_1d = mat_dct_1d * sparse_rec_1d; % 通过DCT基矩阵进行逆变换,得到重构图像
% 显示结果
figure(1);
subplot(2, 2, 1); imshow(uint8(img), []); title('原始图像'); % 显示原始图像
subplot(2, 2, 2); imagesc(Phi); title('测量矩阵'); colormap('gray'); % 显示测量矩阵
subplot(2, 2, 3); imagesc(mat_dct_1d); title('1D DCT基矩阵'); colormap('gray'); % 显示DCT基矩阵
psnr = 20 * log10(255 / sqrt(mean((img(:) - img_rec_1d(:)).^2))); % 计算重构图像的PSNR值
subplot(2, 2, 4); imshow(uint8(img_rec_1d), []); title(['1D重构图像 ', num2str(psnr), 'dB']); % 显示重构图像及其PSNR值
disp('处理完成');
% CoSaMP算法的实现
function hat_x = cs_cosamp(y, T_Mat, m)
% 输入:
% y - 测量值
% T_Mat - 感知矩阵(测量矩阵与稀疏基的乘积)
% m - 原始信号的长度
% 输出:
% hat_x - 重构的稀疏信号
n = length(y); % 测量值的长度
s = floor(n / 4); % 预设的稀疏度
r_n = y; % 初始化残差
sig_pos_lt = []; % 上一次迭代中选择的显著位置
for times = 1:s % 迭代次数与稀疏度相同
product = abs(T_Mat' * r_n); % 计算感知矩阵的列与残差的内积的绝对值
[val, pos] = sort(product, 'descend'); % 降序排序
sig_pos_cr = pos(1:2*s); % 选择当前迭代中的显著位置
sig_pos = union(sig_pos_cr, sig_pos_lt); % 合并当前和上一次的显著位置
Aug_t = T_Mat(:, sig_pos); % 选择感知矩阵中对应的列构成子矩阵
aug_x_cr = zeros(m, 1); % 初始化当前迭代的重构信号
aug_x_cr(sig_pos) = (Aug_t' * Aug_t) \ (Aug_t' * y); % 最小二乘求解
[val, pos] = sort(abs(aug_x_cr), 'descend'); % 对重构信号进行排序
hat_x = zeros(1, m); % 初始化输出信号
hat_x(pos(1:s)) = aug_x_cr(pos(1:s)); % 选择前s个最大的元素作为输出
sig_pos_lt = pos(1:s); % 更新显著位置以供下一次迭代使用
r_n = y - T_Mat * hat_x'; % 更新残差
end
end
上述代码怎么修改能提高信噪比呀?