离散小波变换(DWT)的原理介绍和说明请参考文章:【DWT笔记】傅里叶变换与小波变换 这篇文章写的通俗易懂,小白也能看懂。简单从上面的参考文章中提取关键信息:
1、图像信号的低频部分(低通带)表示图像的基本信息(平滑信息),而高频部分(高通带)表示图像的细节信息。
2、图像中的高频部分一般持续的时间是比较短的,一般是以短时突变或者尖峰的形式出现,如图像的边缘信息和一些噪点信息。而低频信息在大部分地方存在,反应在一些背景或内容信息。这样我们在分析信号的低频部分的时候,只需要较大的频率分辨率和较小的时域分辨率就能够很好的体现低频的信息,而在高频部分,就需要较大的时间分辨率和较小的频率分辨率就能够很好的体现高频的信息。
3、在离散小波变换中,滤波器将在不同的尺度条件下截断信号的某些频率成分:信号通过不同的高通滤波器得到一系列的信号高频成分,通过不同的低通滤波器得到一系列的低频成分,这样便能分析信号的不同频率成分。
小波变换利用一个具有快速衰减性和震荡性的函数作为母函数,通过尺度因子a(也称为伸缩因子)和平移因子t对母函数进行伸缩和平移得到一个函数族(称为小波基函数)。尺度因子和平移因子是小波基最重要的两个参数,也代表了小波变换的基本思想。
在一定条件下,任意能量有限的信号可以按照其函数族进行时–频分解,基函数在时–频相平面上具有可变的时间–频率窗口,可以适应不同分辨率的需求。
连续小波变换(CWT)是通过不断改变窗口的尺度计算完成的:在时域移动窗口函数,然后与信号做卷积运算。
在离散小波变换(DWT)中,滤波器将在不同的尺度条件下截断信号的某些频率成分:信号通过不同的高通和低通滤波器得到一系列的高频和低频成分,这样便可以分析不同的频率成分。
基本的傅里叶变换不存在分辨率的问题,因为傅里叶变换在时域里面频域的分辨率为0,同样在频域里面,时域的分辨率也为0,所以说,傅里叶变换其实没有分辨率。
短时傅里叶变换是通过加窗的方式对时域不同时间段的信号进行分析,但是由于窗长是固定的,所以,分辨率是固定的,并且根据窗长的选择在时域和频域的分辨率上是一个矛盾。
小波变换可以根据尺度的变换和偏移在不同的频段上给出不同的分辨率,这在实际中是非常有用的。
参考博客:小波学习笔记(图像的分解与重构)——MATLAB
Matlab实现二维小波变换的函数为:
[CA,CH,CV,CD] = dwt2(X,'wname')
其中X为输入的图像,'wname’是小波名字。如常用的 ‘wname’='db1’小波滤波器,db1表示小波的消失矩为1,小波滤波器的长度为2*1=2。
输出变量为:
CA:图像的低频信息,刻画原始图像的逼近信息。
CH:图像水平方向的高频信息,刻画原始图像的横向细节。
CV:图像竖直方向的高频信息,刻画原始图像的垂直细节。
CD:图像在对角线方向的高频信息,刻画原始图像的对角线上的细节。
DWT中的采样间隔需要满足Nyquist定理,一般默认采用二倍隔点采用,因此经过DWT的图像的长和宽均变为原来的 1/2
图像小波分解示意图(三层) :
输入图像(521*521):
clear all;
close all;
clc;
imagePath='source_images\3.jpg';
image_color=imread(imagePath);
image_gray=rgb2gray(image_color);
image_double=double(image_gray);
[CA,CH,CV,CD]=dwt2(image_double,'db1');
imwrite(uint8(CA),'Results/CA.jpg');
imwrite(uint8(CH),'Results/CH.jpg');
imwrite(uint8(CV),'Results/CV.jpg');
imwrite(uint8(CD),'Results/CD.jpg');
输入的图像经过DWT分解为4个尺寸变为原图1/4的图像,其中包含一个低频图像,3个高频图像。根据这2张图像可以做后续的处理。