从傅里叶变换到短时傅里叶变换再到小波变换,这些分析问题的方法是一代一代人的探索和积累得来的宝贵知识财富。比较常见的还有脊波变换,曲波变换,轮廓波变换。感觉一种方法弄懂了,在以后很有可能会再次用到。就像这次,本来本科毕设已经用到了小波变换和轮廓波变换,但是自己并没有把它完全弄懂,结果这次课程作业还是要重新看。。。虽然这一次也还是没搞懂。。这里主要记录MATLAB小波包中的函数的用法而已,也只记录了二维离散小波在图像分解和重构上的应用,小波变换好多基本概念自己还是没理解。
图图1
二维离散小波变换最常见的应该是上面的图了。首先要明白,进行小波分解后得到的是一个低频分量和3个高频分量。其中LL1代表低频分量,HL1、HH1和LH1代表高频分量,后面的1代表是第一级分解。也经常用A(低频分量)、H(水平方向高频分量)、V(垂直方向高频分量)、D(对角线方向高频分量)来表示。
例:[c,s]=wavedec2(X,2,'haar');
这个函数就是将一幅图像X分解成小波系数存入c中,其中N代表分解的级数,wname代表所用的小波基函数。s 记录了每一级分解时各个小波系数的size,如下图,size记录的其实就是最开始那个图上,HH1,HH2,HH3…的边长,也就是像素大小。s最后一行是原始图像的大小。
例:[H1,V1,D1] = detcoef2('all',c,s,1);
将c里面的高频系数重组成矩阵形式,参数N代表对第N级的分解系数进行操作。此函数只能重组高频系数,H1为水平方向,V1为垂直方向,D1为对角线方向。
例:A2 = appcoef2(c,s,'haar',2);
将c里面的低频系数重组成矩阵形式,N代表第几级分解。
例:X_A2 = wrcoef2('a',c,s,'sym5',1)
通过第N级分解的低频系数或高频系数重构图像。其中type是代表选择的是系数A,V,H,D中的哪一个进行重构。
例:waverec2(c_Recon1,s,'haar')
直接通过c里面的所有系数来重构图像,但这里一般会将c里面部分系数置0,然后再重构图像。如果不置0的话,不就相当于重构回来的就是原来一模一样的图像了吗。
下面是一个简单的图像重构的程序,先看一下部分图像
下面是代码
%% 小波分解与重构
clear;clc;close all;
X = imread('standard_lena.bmp');
% figure,imshow(X);
[c,s]=wavedec2(X,2,'haar');%对图像X进行4级小波分解,分解得到的系数存到c,s是记录各个级系数的size
%其实感觉这里可以把排序,从大到小,当然是H,D,A,V各排各的。在重构时,丢系数时从后面往前丢。
[H1,V1,D1] = detcoef2('all',c,s,1);%将c里面的系数重组成矩阵形式,参数1代表对第一级的分解系数进行操作。都是高频系数,代表边缘
% A1 = appcoef2(c,s,'haar',1);%一级分解低频系数
[H2,V2,D2] = detcoef2('all',c,s,2);%将c里面的系数重组成矩阵形式,参数1代表对第一级的分解系数进行操作。都是高频系数,代表边缘
A2 = appcoef2(c,s,'haar',2);%二级分解低频系数
X_A2 = wrcoef2('a',c,s,'sym5',1); %通过二级分解后的低频系数重构图
X_H1 = wrcoef2('h',c,s,'sym5',1);
X_V1 = wrcoef2('v',c,s,'sym5',1);
X_D1 = wrcoef2('d',c,s,'sym5',1);
X_H2 = wrcoef2('h',c,s,'sym5',2);
X_V2 = wrcoef2('v',c,s,'sym5',2);
X_D2 = wrcoef2('d',c,s,'sym5',2);
%% 保存各级分解重构图片
figure(1);imshow(X_A2,[]);saveas(1,'picture/lena_A2.bmp');
figure(2);imshow(X_H1,[]);saveas(2,'picture/lena_H1.bmp');
figure(3);imshow(X_V1,[]);saveas(3,'picture/lena_V1.bmp');
figure(4);imshow(X_D1,[]);saveas(4,'picture/lena_D1.bmp');
figure(5);imshow(X_H2,[]);saveas(5,'picture/lena_H2.bmp');
figure(6);imshow(X_V2,[]);saveas(6,'picture/lena_V2.bmp');
figure(7);imshow(X_D2,[]);saveas(7,'picture/lena_D2.bmp');
%% 图像重构
c_RemainPortion = 0.05;%保留字带的系数所占百分比
c_end = s(1,1)^2+round((length(c)- s(1,1)^2)*c_RemainPortion);%在将系数c的后面部分设为0时,要考虑c的最前面是低频分量,是不可以去掉的;
c_Recon1 =zeros(1,length(c));
c_Recon1(1:c_end) = c(1:c_end);
X_Recon1 = uint8(waverec2(c_Recon1,s,'haar'));
figure(8);imshow(X_Recon1,[]);title('保留系数5%');saveas(8,'picture/lena_Recon1.bmp');
c_RemainPortion = 0.1;%保留字带的系数所占百分比
c_end = s(1,1)^2+round((length(c)- s(1,1)^2)*c_RemainPortion);%在将系数c的后面部分设为0时,要考虑c的最前面是低频分量,是不可以去掉的;
c_Recon2 =zeros(1,length(c));
c_Recon2(1:c_end) = c(1:c_end);
X_Recon2 = uint8(waverec2(c_Recon2,s,'haar'));
figure(9);imshow(X_Recon2,[]);title('保留系数10%');saveas(9,'picture/lena_Recon2.bmp');
c_RemainPortion = 0.2;%保留字带的系数所占百分比
c_end = s(1,1)^2+round((length(c)- s(1,1)^2)*c_RemainPortion);%在将系数c的后面部分设为0时,要考虑c的最前面是低频分量,是不可以去掉的;
c_Recon3 =zeros(1,length(c));
c_Recon3(1:c_end) = c(1:c_end);
figure(10);X_Recon3 = uint8(waverec2(c_Recon3,s,'haar'));
figure(9);imshow(X_Recon3,[]);title('保留系数20%');saveas(9,'picture/lena_Recon3.bmp');
%% 计算熵和信噪比
entropy(X);
entropy(X_Recon1)
MSE1 = mean(mean(X-X_Recon1).^2);
PSNR1 = 20*log10(double(255/MSE1))
entropy(X_Recon2)
MSE2 = mean(mean(X-X_Recon2).^2);
PSNR2 = 20*log10(double(255/MSE2))
entropy(X_Recon3)
MSE3 = mean(mean(X-X_Recon3).^2);
PSNR3 = 20*log10(double(255/MSE3))