基于小波变换的图像阈值去噪MATLAB实现
%% 清空工作区
clear; clc; close all;%% 读取图像并添加高斯噪声(可选)
img = imread('lena.jpg'); % 读取原图
img_gray = rgb2gray(img); % 转换为灰度图
noise_var = 0.02; % 噪声方差
noisy_img = imnoise(img_gray, 'gaussian', 0, noise_var); % 添加高斯噪声%% 小波分解参数设置
wavelet = 'db4'; % 小波基选择(可选:haar, db1, sym4等)
level = 3; % 分解层数%% 小波分解
[C, S] = wavedec2(noisy_img, level, wavelet); % 二维小波分解
[cA, cH, cV, cD] = detcoef2('all', C, S, level); % 获取细节系数%% 阈值处理(两种方法对比)
% 方法1:硬阈值
thr_hard = 0.3 * max(abs(cA(:))); % 阈值设定(基于最大系数)
cA_hard = wthresh(cA, 'h', thr_hard);
denoised_hard = waverec2([cA_hard; cH; cV; cD], S, wavelet);% 方法2:软阈值
thr_soft = 0.2 * max(abs(cA(:))); % 阈值设定
cA_soft = wthresh(cA, 's', thr_soft);
denoised_soft = waverec2([cA_soft; cH; cV; cD], S, wavelet);%% 结果可视化
figure;
subplot(2,2,1); imshow(noisy_img); title('含噪图像');
subplot(2,2,2); imshow(denoised_hard); title('硬阈值去噪');
subplot(2,2,3); imshow(denoised_soft); title('软阈值去噪');% 计算性能指标
psnr_hard = psnr(denoised_hard, img_gray);
psnr_soft = psnr(denoised_soft, img_gray);
ssim_hard = ssim(denoised_hard, img_gray);
ssim_soft = ssim(denoised_soft, img_gray);%% 性能指标显示
disp(['硬阈值PSNR: ', num2str(psnr_hard), ' dB, SSIM: ', num2str(ssim_hard)]);
disp(['软阈值PSNR: ', num2str(psnr_soft), ' dB, SSIM: ', num2str(ssim_soft)]);
关键参数说明与优化建议
1. 小波基选择
- 推荐基函数:
db4(Daubechies 4)在细节保留和噪声抑制间取得较好平衡 - 选择依据: 平滑信号:
haar或sym2复杂纹理:db8或coif3实时处理:bior6.8(双正交小波)
2. 阈值优化策略
% 自适应阈值计算(改进方案)
thr = wthrmngr('dw1ddenoLVL', C, S, 3); % 基于Stein无偏风险估计
thr = wthrmngr('heursure', C); % 启发式阈值法
3. 多级去噪增强
% 三级小波分解去噪
[C, S] = wavedec2(noisy_img, 3, 'sym5');
denoised = waverec2(wdencmp('gbl', C, S, 'sym5', 3, 's', 0.15), S, 'sym5');
扩展应用场景
-
遥感图像处理
% 多光谱图像去噪 [cA, cH, cV, cD] = detcoef2('all', C, S, 4); cH_denoised = wthresh(cH, 's', 0.15*max(abs(cH(:)))); -
医学影像增强
% MRI图像去噪 level = 4; wavelet = 'bior3.7'; [C,S] = wavedec2(mri_img, level, wavelet);
参考代码 基于小波变换的图像阈值去噪的matlab代码 www.youwenfan.com/contentcsk/64905.html
常见问题解决方案
-
边缘模糊问题 采用
sym4小波基 设置保护边界:padmethod='sym' -
计算效率优化
% 使用GPU加速 gpu_img = gpuArray(noisy_img); [C,S] = wavedec2(gpu_img, 3, 'db4'); -
彩色图像处理
% 分通道处理 denoised_R = waverec2(wdencmp('gbl', C_R, S, wavelet), S, wavelet); denoised_G = waverec2(wdencmp('gbl', C_G, S, wavelet), S, wavelet);
