转载自http://blog.sina.com.cn/s/blog_165027efc0102xazm.html
小波去噪
小波去噪:带噪声信号经过预处理,然后利用小波变换把信号分解到各尺度中,在每一尺度下把属于噪声的小波系数去掉,保留并增强属于信号的小波系数,最后再经过小波逆变换回复检测信号。
小波变换在去除噪声时可提取并保存对视觉起主要作用的边缘信息,而传统的基于傅里叶变换去除噪声的方法在去除噪声和边沿保持上存在着矛盾,因为傅里叶变换方法在时域不能局部化,难以检测到局域突变信号,在去除噪声的同时,也损失了图像边沿信息。由此可知,与傅里叶变换去除噪声的方法相比较,小波变换法去除噪声具有明显的性能优势。
小波去噪实现步骤
(1)二维信号的小波分解。选择一个小波和小波分解的层次N,然后计算信号s到第N层的分解。
(2)对高频系数进行阈值量化。对于从1~N的每一层,选择一个阈值,并对这一层的高频系数进行软阈值量化处理。
(3)二维小波重构。根据小波分解的第N层的低频系数和经过修改的从第一层到第N的各层高频系数,计算二维信号的小波重构
Matlab函数介绍
(1)wavedec2函数
该函数用于对多尺度二维小波进行分解,其常用调用格式:
[C,S] = wavedec2(X,N,‘wname’):用小波函数wname对信号X在尺度N上的二维分解,N是严格正整数。
(2)wrcoef2函数
该函数用于对二维小波系数进行单支重构,其调用格式:
X = wrcoef2(‘type’,C,S,‘wname’,N):用指定的小波函数wname进行N尺度重构。当type = ‘a’时,仅对信号的低频部分进行重构,此时N可以为0;当type = ‘h’(或’v’/‘d’)时,对信号(水平、垂直、对角)的高频进行重构,N为严格正整数。
(3)wthcoef2函数
该函数用于对二维信号的小波系数阈值进行处理,常用调用格式:
NC = wthcoef2(‘type’,C,S,N,T,SORH):返回经过小波分解结构[C,S]进行处理后的新的小波分解向量NC,[NC,S]即构成一个新的小波分解结构。N是一个包含高频尺度的向量,T是相应的阈值,且N和T长度须相等。返回’type’(水平、垂直、对角线)方向的小波分解向量NC。参数SORH用来对阈值方式进行选择,当SORH = 's’时,为软阈值,当SORH = 'h’时,为硬阈值。
小波去噪Matlab程序如下:
clc
clear all
%读取图像
X=imread(‘lena.jpg’);
X_gray=rgb2gray(X);
subplot(221);
image(X_gray);
imshow(X_gray);
title(‘原始图像’);
%生成含有噪声的图像并显示
init=2055615866;
randn(‘seed’,init);
X_gray=double(X_gray);
%添加随机噪声
X_noise=X_gray+8*randn(size(X_gray));
subplot(222);
imshow(uint8(X_noise));
title(‘含噪图像’);
%用小波函数coif2对图像进行两层分解
[c l]=wavedec2(X_noise,2,‘coif2’);
n=[1,2];
% 设置阈值向量,对高频小波系数进行阈值处理
p=[10.28,24.08];
nc=wthcoef2(‘h’,c,l,n,p,‘s’);
% 图像的二维小波重构
X1=waverec2(nc,l,‘coif2’);
subplot(223);
imshow(uint8(X1));
title(‘第一次消噪声后的图像’);
mc=wthcoef2(‘v’,nc,l,n,p,‘s’);
% 图像的二维小波重构
X2=waverec2(mc,l,‘coif2’);
subplot(224);
imshow(uint8(X2));
title(‘第二次消噪声后的图像’);