当前位置:首页 > 代码 > 正文

小波逆变换c语言代码(小波变换逆变换)

admin 发布:2022-12-20 00:27 145


今天给各位分享小波逆变换c语言代码的知识,其中也会对小波变换逆变换进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

本文目录一览:

小波变换的c是什么意思

小波变换的c是(WT,Wavelet Transform)是用小波函数族ya,b(t)按不同尺度对函数f(t)ÎL2 (R) 进行的一种线性分解运算:

对应的逆变换为:

小波变换有如下性质:

(1)小波变换是一个满足能量守恒方程的线形运算,它把一个信号分解成对空间和尺度(即时间和频率)的独立贡献,同时又不失原信号所包含的信息;

(2)小波变换相当于一个具有放大、缩小和平移等功能的数学显微镜,通过检查不同放大倍数下信号的变化来研究其动态特性;

(3)小波变换不一定要求是正交的,小波基不惟一。小波函数系的时宽-带宽积很小,且在时间和频率轴上都很集中,即展开系数的能量很集中;

(4)小波变换巧妙地利用了非均匀的分辨率,较好地解决了时间和频率分辨率的矛盾;在低频段用高的频率分辨率和低的时间分辨率(宽的分析窗口),而在高频段则用低的频率分辨率和高的时间分辨率(窄的分析窗口),这与时变信号的特征一致;

(5)小波变换将信号分解为在对数坐标中具有相同大小频带的集合,这种以非线形的对数方式而不是以线形方式处理频率的方法对时变信号具有明显的优越性;

(6)小波变换是稳定的,是一个信号的冗余表示。由于a、b是连续变化的,相邻分析窗的绝大部分是相互重叠的,相关性很强;

(7)小波变换同傅立叶变换一样,具有统一性和相似性,其正反变换具有完美的对称性。小波变换具有基于卷积和QMF的塔形快速算法。

如何用C语言实现小波多层变换wavedec2

C语言标准库当中没有这种函数,去OpenCV库当中找找有没有类似函数,如果自己实现想是相当麻烦

小波变换图像处理

生活中需要对一些图像进行处理,比如压缩,去噪,图像增强,图像锐化与钝化,图像融合,图像的分解等,以便对于图像的成分,边缘等细节信息有更加深刻的认识,小波分析由于其固有的时频特性,既可以对图像进行时域分析,也可以对图像进行频率分析,这使得小波分析在图像处理中得到了广泛的应用,本节对其中一些图像处理功能及函数进行讲解:

wavedec2函数用于对图像进行二维小波分解,其函数调用格式如下:

[c,l]=wavedec2(X,n,’wname’);

其中,X表示原始图像,n表示分解层数,wname表示小波函数,c表示各层系数,l表示各层系数对应的长度

ddencmp用于得到全局阀值,其调用格式如下:

[thr,sorh,keepapp]=ddencmp(‘cmp’,’wp’,X);

[thr,sorh,keepapp]=ddencmp(‘cmp’,’wv’,X);

其中cmp表示压缩,wp表示小波包,wv表示小波,X表示原始信号,thr表示阀值,sorh表示阀值类型,s表示软阀值,h表示硬阀值,keepapp=1表示保持近似系数不变

wdencmp用于对数据或图像进行阀值去噪或压缩,其调用格式如下:

[xcomp,c1,l1,perf0,perfl2]=wdencmp(‘gbl’,c,l,’wname’,n,thr,sorh,keepapp);

glb表示利用全局阀值,perf0表示恢复比,perfl2表示压缩比

示例:利用二维小波对图像进行压缩

编写对应的m文件如下:

clc;

load woman;

subplot(1,2,1)

imshow(X,map);

title('原始图像');

[c,l]=wavedec2(X,3,'sym4');

%%获取全局阀值%%

[thr,sorh,keepapp]=ddencmp('cmp','wp',X);

[xcmp,c1,l1,perf0,perfl2]=wdencmp('gbl',c,l,'sym4',3,thr,sorh,keepapp);

subplot(1,2,2)

imshow(xcmp,map);

title('压缩后图片');

程序运行结果如下图:

小波变换用与图像去噪,噪声会影响图像处理的输入,采集,处理的各个环节及输出结果等全过程,因此对于图像的噪声处理是一个不可忽略的重要的问题,去噪已经成为图像处理中不可或缺的一部分

示例:对图像进行二维小波去噪

编写对应的m文件如下:

load julia;

%%产生噪声信号%%

init=3718025452;

rand('seed',init);

xnoise=X+8*rand(size(X));

colormap(map);

subplot(1,3,1)

imshow(X,map);

title('原始信号')

subplot(1,3,2)

imshow(xnoise,map);

title('含有噪声的信号');

%%获取全局阀值%%

[thr,sorh,keepapp]=ddencmp('den','wp',xnoise);

[xden,c1,l1]=wdencmp('gbl',xnoise,'sym4',3,thr,sorh,keepapp);

subplot(1,3,3)

imshow(xden,map);

title('去除噪声后信号');

程序运行结果如下图:

小波分析用于图像增强,图像增强是对图像进行一定处理,使图像比原图更加清晰,视觉效果更好。

示例:利用小波分析对图像进行增强

编写对应的m文件如下:

clc;

load facets;

subplot(1,2,1)

imshow(X,map);

title('原始信号');

[c,l]=wavedec2(X,3,'sym4');

sizec=size(c);

fori=1:sizec(2)

if(c(i)250)

c(i)=2*c(i);

else

c(i)=0.5*c(i);

end

end

y=waverec2(c,l,'sym4');

subplot(1,2,2)

imshow(y,map);

title('增强图像');

程序运行结果如下图:

图像钝化

图像的钝化可以在时域中,也可以在频域中,在时域中处理较为简单,只需要加一个平滑滤波器,使图像中每个点与其邻点做平滑处理即可,在此主要说明图像钝化在频域中的处理。图像钝化是为了突出低频信息,弱化高频信息。

示例:对图像进行频域钝化处理,

编写对应的m文件如下:

load chess;

subplot(1,2,1)

imshow(X,map);

title('原始图像');

[c,l]=wavedec2(X,3,'db4');

sizec=size(c);

fori=1:sizec(2)

if(c(i)280)

c(i)=c(i)*2;

else

c(i)=c(i)*0.5;

end

end

y=waverec2(c,l,'db4');

subplot(1,2,2)

imshow(y,map);

title('采用小波方法钝化图像');

程序运行结果如下图:

图像锐化,与图像钝化刚好相反,是为了突出高频信息,弱化低频信息,从快速变化的成分中分离出系统边界成分,以便进一步识别或者分割等操作。

示例:对图像进行锐化处理

编写对应的m文件如下:

load chess;

subplot(1,2,1)

imshow(X,map);

title('原始图像');

[c,l]=wavedec2(X,3,'db5');

sizec=size(c);

%%突出高频信息,弱化低频信息%%

fori=1:sizec(2)

if(abs(c(i))280)

c(i)=c(i)*2;

else

c(i)=c(i)*0.5;

end

end

y=waverec2(c,l,'db5');

subplot(1,2,2)

imshow(y,map);

title('采用小波方法锐化图像');

程序运行结果如下图:

小波分析用于图像融合

图像融合是将同一图像的两个部分或者不同图像合成一张图,以便合成之后的图形比原来更容易理解。

示例:利用二维小波变换将两幅图像融合在一起

编写对应的m文件如下:

clear all;

load bust;

X1=X;

map1=map;

load woman;

X2=X;

map2=map;

subplot(1,3,1)

imshow(X1,map1);

title('第一幅图像');

subplot(1,3,2)

imshow(X2,map2);

title('第二幅图像');

%%对第二幅图形低频部分和高频部分进行处理%%

fori=1:256

forj=1:256

if(X2(i,j)120)

X2(i,j)=X2(i,j)*2;

else

X2(i,j)=X2(i,j)*0.5;

end

end

end

[c1,l1]=wavedec2(X1,3,'sym4');

[c2,l2]=wavedec2(X2,3,'sym4');

%%对图像进行融合%%

c=c1+c2;

%%减少图像的亮度%%

c=c*0.5;

y=waverec2(c,l1,'sym4');

subplot(1,3,3)

imshow(y,map2);

title('融合后图像');

程序运行结果如下图:

小波分析用于图像分解

对图像分解的目地在于可以更好的观察图像的细节,对图像做出更好的判断,swt2函数用于对图像进行分解,其调用格式如下:

[sa,sh,sv,sd]=swt2(X,N,’wname’);

其中sa,sh,sv,sd分别表示近似系数,水平系数,竖直系数,对角系数,x分解图像,N分解的层数,wname表示小波基名称

示例:对图像进行分解

编写对应的m文件如下:

clear all;

load woman;

[sa,sh,sv,sd]=swt2(X,3,'db3');

s=1;

fori=1:3

subplot(3,4,s)

image(wcodemat(sa(:,:,i),192));

title(['第',num2str(i),'层近似系数']);

subplot(3,4,s+1)

image(wcodemat(sh(:,:,i),192));

title(['第',num2str(i),'层水平系数']);

subplot(3,4,s+2)

image(wcodemat(sv(:,:,i),192));

title(['第',num2str(i),'层竖直系数']);

subplot(3,4,s+3)

image(wcodemat(sd(:,:,i),192));

title(['第',num2str(i),'层对角系数']);

s=s+4;

end

程序运行结果如下图:

小波分解与合成的完整代码

% Load original 1D signal.

load leleccum; s = leleccum(1:3920);

ls = length(s);

% Perform one step decomposition of s using db1.

[ca1,cd1] = dwt(s,'db1');

% Perform one step reconstruction of ca1 and cd1.

a1 = upcoef('a',ca1,'db1',1,ls);

d1 = upcoef('d',cd1,'db1',1,ls);

% Now plot a1 + d1.

% Invert directly decomposition of s using coefficients.

a0 = idwt(ca1,cd1,'db1',ls);

% Perform decomposition at level 3 of s using db1.

[c,l] = wavedec(s,3,'db1')

% Extract approximation coefficients at level 3,

% from wavelet decomposition structure [c,l].

ca3 = appcoef(c,l,'db1',3);

% Extract detail coefficients at levels 1, 2 and 3,

% from wavelet decomposition structure [c,l].

cd3 = detcoef(c,l,3);

cd2 = detcoef(c,l,2);

cd1 = detcoef(c,l,1);

% Reconstruct approximation at level 3,

% from wavelet decomposition structure [c,l].

a3 = wrcoef('a',c,l,'db1',3);

% Reconstruct detail coefficients at levels 1,2 and 3,

% from the wavelet decomposition structure [c,l].

d3 = wrcoef('d',c,l,'db1',3);

d2 = wrcoef('d',c,l,'db1',2);

d1 = wrcoef('d',c,l,'db1',1);

% Reconstruct s from the wavelet decomposition structure [c,l].

a0 = waverec(c,l,'db1');

小波变换

我给你大概标注了一下,但是你的程序有问题,

% 小波图像压缩 - 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维小波分解

[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')

关于小波逆变换c语言代码和小波变换逆变换的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。

版权说明:如非注明,本站文章均为 AH站长 原创,转载请注明出处和附带本文链接;

本文地址:http://ahzz.com.cn/post/32045.html


取消回复欢迎 发表评论:

分享到

温馨提示

下载成功了么?或者链接失效了?

联系我们反馈

立即下载