小波变换

DNA图谱 / 问答 / 标签

小波变换图像处理

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

求一个关于matlab的基于小波变换的图像增强代码

以下是一个基于小波变换的 MATLAB 图像增强代码示例:% 读入原始图像I = imread("lena.png");% 将图像转换为灰度图像if size(I, 3) == 3I = rgb2gray(I);end% 对图像进行小波变换[C, S] = wavedec2(I, 2, "db4");% 提取小波系数H = wrcoef2("h", C, S, "db4", 1);V = wrcoef2("v", C, S, "db4", 1);D = wrcoef2("d", C, S, "db4", 1);% 将水平、垂直、对角小波系数合并W = cat(3, H, V, D);% 对小波系数进行增强for i = 1:3W(:, :, i) = adapthisteq(W(:, :, i), "NumTiles", [8 8], "ClipLimit", 0.005);end% 将增强后的小波系数合并I_enhanced = waverec2(W, S, "db4");% 显示原始图像和增强后的图像subplot(1, 2, 1); imshow(I); title("原始图像");subplot(1, 2, 2); imshow(I_enhanced); title("增强后的图像");这段代码读入一个图像,将其转换为灰度图像,进行小波变换,并提取出水平、垂直和对角小波系数。然后,对这些小波系数进行直方图均衡化增强,并将增强后的小波系数合并。最后,使用小波反变换将增强后的小波系数合成为增强后的图像,并将原始图像和增强后的图像显示在同一窗口中。注意,这只是一个基本示例,可以根据需要进行修改和调整。

关于小波变换后的系数问题

离散小波变换变换采用普通二进小波变换系数都是减少一半的,没有见到哪个教材变换后,每一层的系数都是不变的。wavemenu小波工具箱进行变换在离散小波变换时,每一层的系数也是减少一半的,你看到是每一层变换后的小波系数重构的结果,其元素个数是和原数据大小相等的,其原因是重构过程进行了插值。除非采用离散平稳小波变换(SWT),那样变换后每一层的系数才是不变的。顺便说一句,小波变换的系数通常对分析信号没有意义,有时还是虚数,连图都成不了,只有通过重构(小波逆变换)才能变成有实际意义的结果。

关于连续小波变换的几个问题,求教

首先应明白连续或不连续多指数学的概念而已,应用中的信号都是离散的,只是你的采样足够高就可认为是连续的,所以小波变换中关心的是点数问题,而不关心信号是否连续。对于CWT或DWT其连续与否不是指分析信号,而是你说的a或b的问题,但你仍可以借鉴上面对于信号连续的理解。CWT中a是连续的,b其实就是点数,也可认为是连续的。最早的DWT是没有mallat算法的,那时a是以2的幂次方变化离散,b却是连续变化的,即二进小波变换。这种变换很鸡肋,还不如直接做CWT。DWT的应用之所以远远多于CWT就是引入了mallat算法,好处是终于可以分解和重构信号了,这种方式对信号特征的研究非常有利。DWT的核心思想其实就是CWT引出的伸缩和平移的概念,a以2的幂次方变化实现了小波的伸缩,b通过下抽样实现了小波的平移。从实际应用中进行小波变换的目的和效果来看,cwt中2/4/8/16/32的小波系数结果应该对应DWT中的阶次(层数)1/2/3/4/5的小波细节系数(或更准确的是重构后的小波细节,因为cwt的系数个数是不变的等于原信号长度,但DWT细节系数是每层近似减半的,重构后才会等长,b也是姑且认为是减半的不连续吧)。再追问吧,第二问题可能更多,我尽量精简。哎,干嘛要把问题写在一起,这就是麻烦啊,你必须追问我才能再写!

基于小波变换的图像压缩问题

matlab没怎么学。按错误提示:应该是wdencmp函数的参数不对。你搜下这个函数怎么用,小波变换这些,网上源程序也很多的

求助:在MATLAB中 如何利用mallat算法 求得小波变换系数?

如果只要得到小波系数,可以1D直接使用wavedec (2D使用wavedec2)函数进行分解,得到分解结果的CL组构(2D得到CS组构),然后用appcoef和detcoef(2D使用appcoef2和detcoef2)函数提取细节和逼近小波系数,你可以直接参看matlab的帮助文档,非常简单。

如图,使用matlab编程实现小波变换对一幅图像进行处理,从而得出4个座标图。

A = imread("image.bmp");B = A(:,:,1);[lowf,highfH,highfV,highfD,C,S] = wavelet2D(double(B),"morlet",2);function[lowf,highH,highV,highD,C,S] = wavelet2D(signal,wavelet,level)[C,S]=wavedec2(signal,level,wavelet);lowf = appcoef2(C,S,wavelet,level);highH=detcoef2("h",C,S,level);highV=detcoef2("v",C,S,level);highD=detcoef2("d",C,S,level);A = wrcoef2("a",C,S,wavelet,level);Dh =wrcoef2("h",C,S,wavelet,level);Dv =wrcoef2("v",C,S,wavelet,level);Dd =wrcoef2("d",C,S,wavelet,level);subplot(2,2,1),image(A);subplot(2,2,2),imshow(Dh);subplot(2,2,3),imshow(Dv);subplot(2,2,4),imshow(Dd);