基于小波变换的图像阈值去噪MATLAB实现

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)在细节保留和噪声抑制间取得较好平衡
  • 选择依据 : 平滑信号:haarsym2 复杂纹理:db8coif3 实时处理:bior6.8(双正交小波)
2. 阈值优化策略
matlab 复制代码
% 自适应阈值计算(改进方案)
thr = wthrmngr('dw1ddenoLVL', C, S, 3); % 基于Stein无偏风险估计
thr = wthrmngr('heursure', C); % 启发式阈值法
3. 多级去噪增强
matlab 复制代码
% 三级小波分解去噪
[C, S] = wavedec2(noisy_img, 3, 'sym5');
denoised = waverec2(wdencmp('gbl', C, S, 'sym5', 3, 's', 0.15), S, 'sym5');

扩展应用场景

  1. 遥感图像处理

    matlab 复制代码
    % 多光谱图像去噪
    [cA, cH, cV, cD] = detcoef2('all', C, S, 4);
    cH_denoised = wthresh(cH, 's', 0.15*max(abs(cH(:))));
  2. 医学影像增强

    matlab 复制代码
    % MRI图像去噪
    level = 4;
    wavelet = 'bior3.7';
    [C,S] = wavedec2(mri_img, level, wavelet);

参考代码 基于小波变换的图像阈值去噪的matlab代码 www.youwenfan.com/contentcsk/64905.html

常见问题解决方案

  1. 边缘模糊问题 采用sym4小波基 设置保护边界:padmethod='sym'

  2. 计算效率优化

    matlab 复制代码
    % 使用GPU加速
    gpu_img = gpuArray(noisy_img);
    [C,S] = wavedec2(gpu_img, 3, 'db4');
  3. 彩色图像处理

    matlab 复制代码
    % 分通道处理
    denoised_R = waverec2(wdencmp('gbl', C_R, S, wavelet), S, wavelet);
    denoised_G = waverec2(wdencmp('gbl', C_G, S, wavelet), S, wavelet);
相关推荐
Joe_Blue_022 小时前
Matlab入门案例介绍—常用的运算符及优先级
开发语言·数据结构·matlab·matlab基础入门案例介绍
Joe_Blue_023 小时前
Matlab 入门案例介绍——如何创建脚本
开发语言·matlab·matlab 入门案例
nwsuaf_huasir3 小时前
积分旁瓣电平-matlab函数
前端·javascript·matlab
崇山峻岭之间3 小时前
Matlab学习记录20
开发语言·学习·matlab
matlabgoodboy5 小时前
matlab代编程序机器学习通信仿真python神经网络图像处理优化算法
python·机器学习·matlab
wuk99816 小时前
使用PCA算法进行故障诊断的MATLAB仿真
算法·matlab
Dillon Dong1 天前
从C到Simulink: 使用 `simulation_stubs`(仿真存根)处理MBD中的硬件依赖
c语言·stm32·matlab
或许好运来1 天前
MATLAB 低级图形错误
matlab
yong99901 天前
超宽带系统链路 MATLAB 仿真
开发语言·算法·matlab
菩提祖师_1 天前
基于MATLAB的心电信号处理与心律异常检测算法设计
算法·matlab·信号处理