二维小波分解与重构程序实例

合集下载

小波分解与重构

小波分解与重构

小波分解与重构我理解的小波分解是将一个多频率组成的波通过小波分解将所有频率分解出来,重构就是将这些分频率加起来得到最后的重构结果,于是写了个这样的程序clcclose all;clear all;clc;fs=612;[reg,sta,data]=readmydata('beijing08.dat');data{1:end};A=ans(2:end);for i=1:609;if A(i)>50.0;A(i)=(A(i-12)+A(i+12))/2;endendfor i=609:612;if A(i)>50.0;A(i)=(A(i-12)+A(i-24))/2;endend%信号时域波形figure(1);plot(1:612,A);%使用db5小波进行尺度为7时的分解[c,l]=wavedec(A,9,'db5');%从小波分解结构[c,l]重构信号xdataa0=waverec(c,l,'db5');%检查重构效果figure(2);subplot(3,1,1);plot(A);title('原始信号')subplot(3,1,2);plot(a0);title('重构信号')subplot(3,1,3);plot(A-a0);title('误差信号')err=max(abs(A-a0))%重构第1~5层高频细节信号d9=wrcoef('d',c,l,'db5',9); d8=wrcoef('d',c,l,'db5',8); d7=wrcoef('d',c,l,'db5',7); d6=wrcoef('d',c,l,'db5',6); d5=wrcoef('d',c,l,'db5',5); d4=wrcoef('d',c,l,'db5',4); d3=wrcoef('d',c,l,'db5',3); d2=wrcoef('d',c,l,'db5',2); d1=wrcoef('d',c,l,'db5',1); %显示高频细节信号figure(3);subplot(9,1,1);plot(d9,'LineWidth',2); ylabel('d9');subplot(9,1,2);plot(d8,'LineWidth',2); ylabel('d8');subplot(9,1,3);plot(d7,'LineWidth',2);ylabel('d7');subplot(9,1,4);plot(d6,'LineWidth',2);ylabel('d6');subplot(9,1,5);plot(d5,'LineWidth',2);ylabel('d5');subplot(9,1,6);plot(d4,'LineWidth',2);ylabel('d4');subplot(9,1,7);plot(d3,'LineWidth',2);ylabel('d3');subplot(9,1,8);plot(d2,'LineWidth',2);ylabel('d2');xlabel('时间 t/s');subplot(9,1,9);plot(d1,'LineWidth',2);ylabel('d1');%第1层高频细节信号的包络谱y=hilbert(d1);ydata=abs(y);y=y-mean(y);nfft=1024;p=abs(fft(ydata,nfft));figure(4);plot((0:nfft/2-1)/nfft*fs,p(1:nfft/2));xlabel('频率 f/Hz');ylabel('功率谱 P/W');小波分解与重构程序>> clearI=imread('C:\Documents and Settings\Administrator\桌面\暑期/cidian.bmp');I=rgb2gray(I);[X,map]=gray2ind(I);subplot(2,2,1);imshow(X,map);title('原始图像');X=double(X);sX=size(X);[cA,cH,cV,cD]=dwt2(X,'db4');A0=idwt2(cA,cH,cV,cD,' db4', sX);subplot(2,2,2);imshow(A0,map);title('db4小波重构');error1=max(max(abs(X-A0)))程序很简单,也很基础。

二维小波分解与重构程序实例

二维小波分解与重构程序实例
//****重建图象存在lenaiwt.bmp***********//
void TBmpViewWindow::CmAgent()
{
char ss[5];
int i,j,k,x,y;
AgentNum=5;ActiveAgent=5;SearchNum=0;
AgentLife=2;
SearchTime=0;
//
TWindow* SubWinPtr = 0;
TSubWindow::TSubWindow(TWindow* parent)
: TFrameWindow(parent)
{
Attr.Style |= WS_VISIBLE | WS_POPUP | WS_OVERLAPPEDWINDOW,
Attr.X = 100;
// facilitate receiving of clipboard change notifications. Could mix it in if
// an additional base was desired.
//
class TSubWindow : public TFrameWindow {
public:
TSubWindow(TWindow* parent);
~TSubWindow();
protected:
void EvSize(UINT sizeType, TSize& size)
{Invalidate(); TFrameWindow::EvSize(sizeType, size);}
int SearchTime;
unsigned short Image[32][32];
#define MAXAPPNAME 20

小波分解与重构

小波分解与重构
%提取多尺度小波变换的高频系数
figure(2);
lev_1=lev+1;
for i=1:lev
cD=detcoef(C,L,i);
subplot(lev_1,1,i)
plot(cD);
ylabel(['cD',num2str(i)]);
Fs=1000; % 采样频率
Ts=1/Fs; % 采样间隔
N=1024; % 采样点数
t=[0:1/Fs:(N-1)/Fs]; %采样时刻
lev=5;
x=sin(2*pi*f1*t);
figure(1);
plot(t,x);
%%小波分解
[C,L]=wavedec(x,lev,'db10'); %C由[cAj,cDj,cDj-1,...,cD1]
subplot(2,2,4);
image(hd2+dd2+vd2+a1);colormap(map);
% 验证这些图像的长度都是sX
sX = size(X)
sa1 = size(a1)
shd2 = size(hd2)
norm(hd2+dd2+vd2+a1-X)
结果:
sX =
256 256
plot(A);
title('原始信号')
subplot(3,1,2);
plot(a0);
title('重构信号')
subplot(3,1,3);
plot(A-a0);
title('误差信号')
err=max(abs(A-a0))

小波分解与重构代码

小波分解与重构代码

load leleccum;s = leleccum(1:3920);% 用db1小波函数对信号进行三尺度小波分解[C,L]=wavedec(s,2,'db1');figure(1);plot(s);title('leleccum原始信号');% 提取尺度1的低频系数cA1 = appcoef(C,L,'db1',1); %用小波分解框架[C.L]计算1层低频系数的近似值,小波基为db1% 提取尺度2的低频系数cA2 = appcoef(C,L,'db1',2);figure(2);subplot(2,1,1);plot(cA1);title('尺度1的低频系数');subplot(2,1,2);plot(cA2);title('尺度2的低频系数');% 提取尺度1的高频系数cD1 = detcoef(C,L,1); %用小波分解框架[C.L]计算1层高频系数的近似值,小波基为db1% 提取尺度2的高频系数cD2 = detcoef(C,L,2);figure(3);subplot(2,1,1);plot(cD1);title('尺度1的高频系数');subplot(2,1,2);plot(cD2);title('尺度2的高频系数');我给你大概标注了一下,但是你的程序有问题,% 小波图像压缩 - RGB 图像clear all;close all;% 读取图像im = input('输入图像');%输入图像名称,要加分号X=imread(im);% 输入要分解的小波层数和小波n=input('输入要分解的小波层数');%输入所要分解的层数wname = input('输入小波名称');%输入小波名称,也要加分号x = double(X);NbColors = 255;map = gray(NbColors);x = uint8(x);%把RGB图像转换成灰度图% x = double(X);% xrgb = 0.2990*x(:,:,1) + 0.5870*x(:,:,2) + 0.1140*x(:,:,3);% colors = 255;% x = wcodemat(xrgb,colors);% map = pink(colors);% x = uint8(x);% 对图像x进行n维小波分解x=imread(’ D:\a.jpg’);map=x;n=3wname='sym5';[c,s] = wavedec2(x,n,wname);% 使用默认参数选择各层不同的阈值alpha = 1.5; m = 2.7*prod(s(1,:));[thr,nkeep] = wdcbm2(c,s,alpha,m)% 使用上面的阈值和硬阈值处理进行图像压缩[xd,cxd,sxd,perf0,perfl2] = wdencmp('lvd',c,s,wname,n,thr,'h');disp('压缩效率');disp(perf0);% 重构(下面这个地方有问题,你这里是原始图像小波变换后进行重构,xd才是小波阀值压缩后重构的图像,cxd,sxd,是c,s经过阀值处理后得到的小波分解结构,也就是说xd=waverec2(cxd,sxd,wname);这个wdencmp函数不需要另外进行重构,你下面那些关于重构的都没用,而下面压缩后的图像才是重构后的图像,)R = waverec2(c,s,wname);rc = uint8(R);% 显示原始图像和压缩图像subplot(221), image(x);colormap(map);title('原始图像')subplot(222), image(xd);colormap(map);title('压缩后的图像')% 显示结果xlab1 = ['图像压缩后保留能量百分比',num2str(perfl2)];xlab2 = ['小波阀值压缩后置零系数百分比 ',num2str(perf0), ' %']; xlabel([xlab1 xlab2]);subplot(223), image(rc);colormap(map);title('重构图像');%计算图像大小disp('原始图像');imwrite(x,'original.tif');%将图像x保存为original.tif,下同imfinfo('original.tif')%显示图片original.tif详细信息,下同disp('压缩后的图像');imwrite(xd,'compressed.tif');imfinfo('compressed.tif')disp('重构后的图像');imwrite(rc,'decompressed.tif');imfinfo('decompressed.tif')。

二维haar小波变换

二维haar小波变换

二维haar小波变换二维Haar小波变换是一种常用的图像处理方法,它可以将图像分解为不同频率的子图像,从而实现图像的压缩和去噪等功能。

本文将介绍二维Haar小波变换的基本原理、算法实现和应用案例。

一、基本原理Haar小波变换是一种基于小波分析的信号处理方法,它利用小波函数的特性对信号进行分解和重构。

二维Haar小波变换将二维图像看作是一个矩阵,通过对矩阵的行和列进行小波分解,可以得到图像的不同频率分量。

具体而言,二维Haar小波变换的基本原理如下:1. 将二维图像分解为4个子图像,每个子图像的尺寸是原图像的一半。

2. 对每个子图像进行小波分解,得到近似系数和细节系数。

近似系数表示低频分量,细节系数表示高频分量。

3. 重复以上步骤,将近似系数作为输入,继续进行小波分解,直到达到指定的分解层数。

4. 最后,通过对各个子图像进行合并和重构,得到原图像的小波变换结果。

二、算法实现二维Haar小波变换的算法实现相对简单,可以用矩阵运算来实现。

具体步骤如下:1. 将二维图像转换为灰度图像,并将像素值归一化到[0,1]的范围。

2. 初始化变换矩阵,用于进行小波分解和重构。

3. 对图像的行进行小波变换,得到近似系数和细节系数。

4. 对近似系数和细节系数的列进行小波变换,得到最终的小波变换结果。

三、应用案例二维Haar小波变换在图像处理中有广泛的应用。

以下是几个典型的应用案例:1. 图像压缩:通过对图像进行小波分解,可以将图像的能量集中在少数的系数上,从而实现对图像的压缩。

通过保留较大的系数,可以实现有损压缩;而通过保留较小的系数,可以实现无损压缩。

2. 图像去噪:图像的细节系数通常包含了图像中的噪声信息。

通过对细节系数进行阈值处理,可以将噪声去除,从而实现图像的去噪功能。

3. 图像增强:通过对图像的近似系数进行增强处理,可以提高图像的对比度和清晰度。

通过调整不同频率分量的权重,可以实现不同的增强效果。

4. 特征提取:小波变换可以将图像分解为不同频率的子图像,每个子图像包含了图像的一部分特征信息。

小波图像分解和重构程序每句都带解释

小波图像分解和重构程序每句都带解释

小波图像分解程序:function coef=mywavedec2(x,N,wname) %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % 函数MYWA VEDEC2() 对输入矩阵x 进行dim 层分解,得到相应的分解系数矩阵y% 输入参数:x ——输入矩阵% N ——分解级数% wname ——分解所用的小波函数% 输出参数:coef ——分解系数矩阵,其结构如下:% coef = {cA_N;cV_N;cH_N;cD_N;cV_N-1;cH_N-1;cD_N-1;……;cV_1;cH_1;cD_1}% Copyright by Zou Yuhua ( chenyusiyuan ), original : 2007-11-10, modified: 2008-06-04 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % 求出小波函数的滤波器组系数向量[Lo_D,Hi_D] = wfilters(wname,'d');% 画出原始图像imshow(x);title('Original Image');% 标明图像大小[r,c]=size(x);xlabel(['Size : ',num2str(r),'*',num2str(c)]);% 将矩阵x的数据格式转换为适合数值处理的double格式xd=double(x);coef=[];for i=1:N[cA,cV,cH,cD]=mydwt2(xd,Lo_D,Hi_D);% 第i 级小波分解xd=cA;% 将第i 级分解得到的低频系数矩阵作为第i+1 级分解的源矩阵outmp={cV;cH;cD};% 将第i 级分解得到的高频系数矩阵cV,cH,cD存入细胞矩阵outmp % 注意细胞矩阵的赋值是用大括号“{}”的,而普通矩阵赋值是用方括号“[]”% 细胞矩阵不要求其中的子矩阵的行列数都相同coef=[outmp;coef];% 将细胞矩阵outmp 存入输出矩阵coef,coef将由空矩阵变为细胞矩阵% 注意这里的方括号不能用大括号取代% 否则,使用大括号会将初始的coef空矩阵也作为细胞矩阵的子矩阵% 而且,在迭代中coef 将是一个不断嵌套的细胞矩阵,不便于后续处理和读取% 上面这个语句是一种有效的在迭代过程中保存数据的方法% 设待存数据为data,可以是单个数、向量或矩阵% 保存数据的矩阵为mat,初始为空矩阵:mat=[]% 则可按以下格式保存迭代过程产生的数据% mat=[mat;data];% 方括号内的分号“;”表示数据data 是按“列”排序的方式存入矩阵mat% mat=[mat,data];% 方括号内的逗号“,”表示数据data 是按“行”排序的方式存入矩阵mat% data 也可以在mat 前嵌入,即mat=[data;mat] 或mat=[data,mat]end% 迭代结束后,矩阵coef 中保存的是各级分解中的高频系数矩阵% 故需将迭代后得到的矩阵cA,即第dim 级低频矩阵存入矩阵coefcoef=[cA;coef];% 最后,小波系数矩阵coef 的结构如下% coef = {cA_N;cV_N;cH_N;cD_N;cV_N-1;cH_N-1;cD_N-1;……;cV_1;cH_1;cD_1}% 画出各级低频、高频系数矩阵% 首先建立一个名为“Wavelet Decomposition -- Wavelet Type: , Levels: ”的图像窗口figure('Name',['Wavelet Decomposition -- Wavelet Type: ',wname,' , Levels: ',num2str(N)]);% 图像的第1行显示低频系数,置中,左右两个subplot为空subplot(N+1,3,2);yt=uint8(coef{1});[yrow,ycol]=size(yt);imshow(yt);title( ['Approximation A',num2str(N)]);xlabel(['Size : ',num2str(yrow),'*',num2str(ycol)]);% 第2-(N+1)行显示各级高频系数titllist={['Vertical Detail V'];['Horizontal Detail H'];['Diagonal Detail D']};pn=2;% pn 是子图的显示序号for pr=1:Nfor pc=1:3subplot(N+1,3,pn+2);yt=[];% 为了使高频细节内容(轮廓、边缘)更清晰,将高频系数增加100灰度值yt=uint8(coef{pn})+100;[yrow,ycol]=size(yt);imshow(yt);title([ titllist{pc},num2str(N-pr+1)]);xlabel(['Size : ',num2str(yrow),'*',num2str(ycol)]);% 每行的第一个图像的Y轴,显示该行高频系数对应的分解级别if mod(pn+2,3)==1ylabel(['Level ',num2str(N-pr+1)]);endpn=pn+1;endendfunction [cA,cV,cH,cD]=mydwt2(x,Lo_D,Hi_D) %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % 函数MYDWT2() 对输入的r*c维矩阵x 进行二维小波分解,输出四个分解系数子矩阵[LL,HL,LH,HH]% 输入参数:x ——输入矩阵,为r*c维矩阵。

二维离散小波变换实验报告 - 实验报告

二维离散小波变换实验报告 - 实验报告

二维离散小波变换实验报告 - 实验报告二维离散小波变换实验报告2008-11-021. 实验题目对图像进行二维离散小波变换, 变换级数大于等于3级,然后统计系数中0的个数(百分比表示) 并进行重构, 最后计算重构图像的峰值信噪比(PSNR).数据:灰度图像lena.bmp或其它图像, 滤波器系数可以调用matlab中的wfilters函数获得, wfilters函数的使用请在matlab中help wfilters.另外,峰值信噪比计算公式:MN'2()ff,,,ijij255255,ij,,11PSNRMSE,,10lg,MSEMN,'{},{}ff1,1,,,,iMjNijij其中,分别表示原始图像和重建图像, 且. 注:实验中,边缘延拓的方法和具体的小波滤波器可以自己根据实验结果进行选择。

2. 实验步骤1) 生成原始灰度图像作为标准以便对比。

在matlab中导入LENA.bmp, 使用下列命令生成,结果如图1所示。

imagesc(LENA.cdata, [0,255]); colormap(gray);图1 原始灰度图像2) 用matlab小波工具包作出分解合成图,如图2。

第 - 1 - 页图2 直接使用matlab小波工具箱进行分析3) 写代码实现DWT正反变换,见附件MyDwt2D.dsw。

我在代码中构建了一个CDwt类,输入为:@ const char* lpInputImage : 输入图像文件名@ int nAnalysisLevel : 分析级数,本题要求大于等于3@ int nThreshold = 0 : 阈值,默认值为0(即不进行阈值化)公用方法有四个为:void ForwadDwt(); /* 实现DWT变换 */void InverseDwt(); /* 实现DWT逆变换 */void StatisticThenOutput(const char* lpStatisticFile); /* 先统计,然后输出统计信息 */void OutputInversedImage(const char* lpInversedImageName); /* 输出重构图像数据 */方法调用顺序为首先调用ForwadDwt,然后调用InverseDwt,最后是类的两个输出。

[转帖]小波图像分解与合成(例子)-Matlab讨论区-振动论坛动力学,噪声-...

[转帖]小波图像分解与合成(例子)-Matlab讨论区-振动论坛动力学,噪声-...

[转帖]小波图像分解与合成(例子)-Matlab讨论区-振动论坛动力学,噪声-...转帖]小波图像分解与合成(例子)% 该函数是根据对所输入的png格式的真彩图像、小波类型(db9或haar)% 和相应的阈值进行了三级非标准小波harr或db9的分解和重构,从而达到了对原图像的压缩处理的% 目的。

它首先把通过原图像分离后的某颜色分量作为二维图像矩阵,通过调用自定义的二维离散% 小波变换函数mydwt2(),并依据指定的小波基函数'wavename'进行二维离散的行、列小波变换,% 得到了经变换后的相应颜色分量的近似分量% cA,水平细节分量cH,垂直细节分量cV,对角细节% 分量cD和中间分量cM,然后调用自定义的图像输出函数outrgb分别把中间分量以及cA、cH、cV、% cD合并后的图像阵进行R、G、B合成输出图像文件,其中某颜色分量的cA又做为下一级二维离散的% 行、列小波分解的输入图像阵,如此共完成三次。

% 其次,把经过三级非标准小波分解后的各颜色分量的各级水平细节分量、垂直细节分量、对角细% 节分量矩阵通过调用自定义函数make_0()完成了相应矩阵元素数值小于阀值系数的个数统计,并% 对它们进行小于阀值系数元素置0处理,且把分量尽数返回,以便三级的非标准小波重构处理。

% 最后,将返回得到的各颜色分量的第三级水平细节分量、垂直细节分量、对角细节分量矩阵和第% 三级分解后的近似分量作为参数,通过调用自定义的二维离散小波反变换函数myidwt2()进行二维% 离散的列、行重构,得到了经重构后的近似分量cA 和中间分量cM,把该中间分量cM以及近似分量% cA分别和经置0处理后第二级cH、cV、cD行列扩展,同时进行R、G、B合成,后调用自定义的图像% 输出函数outrgb()输出图像文件。

其中各颜色分量的cA又做为下一级二维离散的列、行小波重构% 的输入图像阵,如此共完成三次。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
0.292562,0.564406,0.292562,-0.0485391,-0.0482602,-0.0196637,
0.00569794,-0.0033276};
float g[DD]={0.00332761,0.00569794,-0.0196637,-0.0482603,0.0485391,
public:
TSubWindow(TWindow* parent);
~TSubWindow();
protected:
void EvSize(UINT sizeType, TSize& size)
{Invalidate(); TFrameWindow::EvSize(sizeType, size);}
二维小波分解与重构程序实例
// *********(基于Windows的二维小波分解与重构BC++4。5)**********//
#include <owl/owlpch.h>
#include <owl/applicat.h>
#include <owl/dc.h>
#include <owl/menu.h>
//*****Inverse Wavelet Transform*********************//
void iwt(int xs,int ys,long xsize,long ysize);
float *img[SIZE],*imgx[SIZE],*imgy[SIZE];
//****for evolution agents*****//
Attr.Y = 100;
Attr.W = 300;
Attr.H = 400;
}
//
// Destroy window. SubWinPtr[Type] is set to 0 to indicate that the window
// has be closed.
//
TSubWindow::~TSubWindow()
// facilitate receiving of clipboard change notifications. Could mix it in if
// an additional base was desired.
//
class TSubWindow : public TFrameWindow {
int AgentNum,ActiveAgent;
int SolutionX[1000],SolutionY[1000];
int SearchNum,AgentLife;
int Agent[1000][2];
int isAgentAlive[1000];
int SearchTime;
unsigned short Image[32][32];
TDib* Dib;
TBitmap* Bitmap;
TMemoryDC * pMemDC;
TPalette* Palette;
//
TWindow* SubWinPtr = 0;
TSubWindow::TSubWindow(TWindow* parent)
: TFrameWindow(parent)
{
Attr.Style |= WS_VISIBLE | WS_POPUP | WS_OVERLAPPEDWINDOW,
Attr.X = 100;
int s(float x);
//Set Inverse Filter Coefficients//
void coef();
//********Wavelet Transform************************//
void wt(int xs,int ys,long xsize,long ysize);
void Paint(TDC& dc, bool, TRect&);
DECLARE_RESPONSE_TABLE(TSubWindow);
};
DEFINE_RESPONSE_TABLE1(TSubWindow, TFrameWindow)
EV_WM_SIZE,
END_RESPONSE_TABLE;
// pointers to different child windows.
#define MAXAPPNAME 20
static const char AppName[] = "Image Processing";
//
// TBmpViewWindow, a Bitmap displaying window derived from TClipboardViewer to
0.292562,-0.564406,0.292562,0.0485391,-0.0482602,0.0196637,
0.00569794,0.0033276};
float hi[DD],gi[DD];
int wavelet_direction=1;
int a(int x,int xsize);
//Threshold//
{
SubWinPtr = 0;
}
void
TSubWindow::Paint(TDC& dc, bool, TRect&)
{
}
class TBmpViewWindow : virtual public TWindow, public TClipboardViewer {
public:
char FileName[MAXPATH];
#include <owl源自framewin.h>#include <owl/scroller.h>
#include <owl/opensave.h>
#include <owl/clipview.h>
#include <string.h>
#include <alloc.h>
#include <dir.h>
#include <math.h>
#include "stdio.h"
#include "stdlib.h"
#include "bmpview.h"
#define PI 3.1415926
#define SIZE 256
#define DD 13
float h[DD]={-0.00332761,0.00569794,0.0196637,-0.0482603,-0.0485391,
相关文档
最新文档