matalb小波去噪软阈值和硬阈值

clear all,clc,close all;
image = rgb2gray(imread('Lenna.jpg'));
noiseI=imnoise(image,'gaussian',0,0.02);
subplot(231),imshow(image),title('原图像');
subplot(232),imshow(noiseI),title('高斯白噪声图像');
% 对图像noiseI用sym5小波基函数实现N层分解
[c,z]=wavedec2(noiseI,2,'sym5');
%1[THR,SORH,KEEPAPP,CRIT]=ddencmp(IN1,IN2,X)
%2[THR,SORH,KEEPAPP,CRIT]=ddencmp(IN1,'wp',X)
%3[THR,SORH,KEEPAPP,CRIT]=ddencmp(IN1,'wv',X)
%   函数ddencmp用于获取信号在消噪或压缩过程中的默认阈值。
% 输入参数X为一维或二维信号;IN1取值为'den''cmp''den'表示进行去噪,'cmp'表示进行压缩;IN2取值为'wv''wp',wv表示选择小波,wp表示选择小波包。返回值THR是返回的阈值;SORH是软阈值或硬阈值选择参数;KEEPAPP表示保存低频信号;CRIT是熵名(只在选择小波包时使用)。
% 查找默认值
[thr,sorh,keepapp]=ddencmp('den','wv',noiseI);
% 全局阈值设置去噪.
% [XC,CXC,LXC,PERF0,PERFL2] = wdencmp('gbl',X,'wname',N,THR,SORH,KEEPAPP)
% 函数wdencmp用于一维或二维信号的消噪或压缩。wname是所用的小波函数,gbl(global的缩写)表示每层都采用同一个阈值进行处理,lvd表示每层用不同的阈值进行处理,N表示小波分解的层数,THR为阈值向量,对于格式(2)(3)每层都要求有一个阈值,因此阈值向量THR的长度为N,SORH表示选择软阈值还是硬阈值(分别取为’s’和’h’),参数KEEPAPP取值为1时,则低频系数不进行阈值量化处理,反之,则低频系数进行阈值量化。XC是消噪或压缩后的信号,[CXC,LXC]是XC的小波分解结构,PERF0和PERFL2是恢复和压缩L^2的范数百分比, 是用百分制表明降噪或压缩所保留的能量成分。如果[C,L]是X的小波分解结构,则PERFL2=100*(CXC向量的范数/C向量的范数)^2;如果X是一维信号,小波wname是一个正交小波,则PERFL2=100||XC||^2 / ||X||^2
[denoiseI,cxc,lxc,perf0,perf12]=wdencmp('gbl',c,z,'sym5',2,thr,sorh,keepapp);

denoiseI = uint8(denoiseI);
subplot(233),imshow(denoiseI),title('降噪后的图像');
imwrite(denoiseI,'denoiseI.jpg');
sigma=std(c);

% 采用硬阈值,软阈值小波变换对图像进行去噪,阈值取标准偏差的3% 硬阈值是指将小于3倍标准偏差的小波系数全部置零,其他系数保持不变
% 软阈值是指键大于阈值的小波系数修改为减去阈值后的值,将小于阈值相反的小波系数
thresh=3*sigma;
csize=size(c);
c(find(abs(c)<thresh))=0;
denoiseI1=uint8(waverec2(c,z,'sym5'));
subplot(234),imshow(denoiseI1),title('硬阈值降噪');
imwrite(denoiseI,'denoise2.jpg');
pos1=find(c>thresh);
c(pos1)=c(pos1)-thresh;
pos2=find(c<-thresh);
c(pos2)=c(pos2)+thresh;
denoiseI2=uint8(waverec2(c,z,'sym5'));
subplot(235),imshow(denoiseI2),title('软阈值降噪'); 
imwrite(denoiseI2,'denoise3.jpg');

matalb小波去噪软阈值和硬阈值_第1张图片
一些函数的用法:https://wenku.baidu.com/view/644fcf1bc281e53a5802ff20.html

你可能感兴趣的:(数字图像处理)