当前位置:首页 » 编程语言 » 小波去噪的c语言
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

小波去噪的c语言

发布时间: 2022-09-24 15:26:15

1. 小波去噪和突变点去除

stepfun(n,26)-stepfun(n,27)+stepfun(n,299)-stepfun(n,300)...
+stepfun(n,589)-stepfun(n,590)+stepfun(n,900)-stepfun(n,901));
% %在26点、299点、589点处加入脉冲信号

2. 请教小波去噪中wdencmp函数使用的问题

s=zeros(1,100);
s(50:100)=1;
subplot(2,2,1);plot(s);
title('原始信号');
[c,l]=wavedec(s,3,'db1');
a3=appcoef(c,l,'db1',3);
d3=detcoef(c,l,3);
d2=detcoef(c,l,2);
d1=detcoef(c,l,1);
dd3=zeros(1,length(d3));
dd2=zeros(1,length(d2));
dd1=zeros(1,length(d1));
c1=[a3
dd3
dd2
dd1];
s1=waverec(c1,l,'db1');
subplot(2,2,2);
plot(s1);grid;
title('强制消噪后的信号');
[thr,sorh,keepapp]=ddencmp('den','wv',s);
s2=wdencmp('gbl',c,l,'db1',3,thr,sorh,keepapp);
subplot(2,2,3);
plot(s2);grid;
title('默认阈值消噪后的信号');
softd1=wthresh(d1,'s',1.465);
softd2=wthresh(d2,'s',1.823);
softd3=wthresh(d3,'s',2.768);
c2=[a3
softd3
softd2
softd1];
s3=waverec(c2,l,'db1');
subplot(2,2,4);
plot(s3);grid;
title('给定软阈值消噪后的信号');

3. 小波变换图像处理

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

4. 小波去噪程序 谁来回答一下

X=imread('D:/12.bmp');
就行了,图片存在d盘根目录.

5. 小波阈值去噪中,ddencmp 函数获取的默认阈值是按照什么计算的,一般情况下如何确定阈值

s=zeros(1,100); s(50:100)=1; subplot(2,2,1);plot(s); title('原始信号'); [c,l]=wavedec(s,3,'db1'); a3=appcoef(c,l,'db1',3); d3=detcoef(c,l,3); d2=detcoef(c,l,2); d1=detcoef(c,l,1); dd3=zeros(1,length(d3)); dd2=zeros(1,length(d2)); dd1=zeros(1,length(d1)); c1=[a3 dd3 dd2 dd1]; s1=waverec(c1,l,'db1'); subplot(2,2,2); plot(s1);grid; title('强制消噪后的信号'); [thr,sorh,keepapp]=ddencmp('den','wv',s); s2=wdencmp('gbl',c,l,'db1',3,thr,sorh,keepapp); subplot(2,2,3); plot(s2);grid; title('默认阈值消噪后的信号'); softd1=wthresh(d1,'s',1.465); softd2=wthresh(d2,'s',1.823); softd3=wthresh(d3,'s',2.768); c2=[a3 softd3 softd2 softd1]; s3=waverec(c2,l,'db1'); subplot(2,2,4); plot(s3);grid; title('给定软阈值消噪后的信号');

6. 要对图像进行小波变换去噪,可以用哪些图像处理库(C/C++)

1.最简单的方法:
public static String reverse1(String str)
{
return new StringBuffer(str).reverse().toString();
}
2.最常用的方法:
public static String reverse3(String s)
{
char[] array = s.toCharArray();
String reverse = ""; //注意这是空串,不是null
for (int i = array.length - 1; i >= 0; i--)
reverse += array[i];
return reverse;
}
3.常用方法的变形:
public static String reverse2(String s)
{
int length = s.length();
String reverse = ""; //注意这是空串,不是null
for (int i = 0; i < length; i++)
reverse = s.charAt(i) + reverse;//在字符串前面连接, 而非常见的后面
return reverse;
}
4.C语言中常用的方法:
public static String reverse5(String orig)
{
char[] s = orig.toCharArray();
int n = s.length - 1;
int halfLength = n / 2;
for (int i = 0; i <= halfLength; i++) {
char temp = s[i];
s[i] = s[n - i];
s[n - i] = temp;
}
return new String(s); //知道 char数组和String相互转化
}

7. C语言怎么实现小波变换

#include<stdio.h>
#include<stdlib.h>
#defineLENGTH512//信号长度
/******************************************************************
*一维卷积函数
*
*说明:循环卷积,卷积结果的长度与输入信号的长度相同
*
*输入参数:data[],输入信号;core[],卷积核;cov[],卷积结果;
* n,输入信号长度;m,卷积核长度.
*
*李承宇,[email protected]
*
*2010-08-18
******************************************************************/
voidCovlution(doubledata[],doublecore[],doublecov[],intn,intm)
{
inti=0;
intj=0;
intk=0;

//将cov[]清零
for(i=0;i<n;i++)
{
cov[i]=0;
}

//前m/2+1行
i=0;
for(j=0;j<m/2;j++,i++)
{
for(k=m/2-j;k<m;k++)
{
cov[i]+=data[k-(m/2-j)]*core[k];//k针对core[k]
}

for(k=n-m/2+j;k<n;k++)
{
cov[i]+=data[k]*core[k-(n-m/2+j)];//k针对data[k]
}
}

//中间的n-m行
for(i=m/2;i<=(n-m)+m/2;i++)
{
for(j=0;j<m;j++)
{
cov[i]+=data[i-m/2+j]*core[j];
}
}

//最后m/2-1行
i=(n-m)+m/2+1;
for(j=1;j<m/2;j++,i++)
{
for(k=0;k<j;k++)
{
cov[i]+=data[k]*core[m-j-k];//k针对data[k]
}

for(k=0;k<m-j;k++)
{
cov[i]+=core[k]*data[n-(m-j)+k];//k针对core[k]
}
}

}

/******************************************************************
*一维小波变换函数
*
*说明:一维小波变换,只变换一次
*
*输入参数:input[],输入信号;output[],小波变换结果,包括尺度系数和
*小波系数两部分;temp[],存放中间结果;h[],Daubechies小波基低通滤波器系数;
*g[],Daubechies小波基高通滤波器系数;n,输入信号长度;m,Daubechies小波基紧支集长度.
*
*李承宇,[email protected]
*
*2010-08-19
******************************************************************/
voidDWT1D(doubleinput[],doubleoutput[],doubletemp[],doubleh[],
doubleg[],intn,intm)
{
// doubletemp[LENGTH]={0};//?????????????

inti=0;
/*
//尺度系数和小波系数放在一起
Covlution(input,h,temp,n,m);

for(i=0;i<n;i+=2)
{
output[i]=temp[i];
}

Covlution(input,g,temp,n,m);

for(i=1;i<n;i+=2)
{
output[i]=temp[i];
}
*/

//尺度系数和小波系数分开
Covlution(input,h,temp,n,m);

for(i=0;i<n;i+=2)
{
output[i/2]=temp[i];//尺度系数
}

Covlution(input,g,temp,n,m);

for(i=1;i<n;i+=2)
{
output[n/2+i/2]=temp[i];//小波系数
}

}

voidmain()
{

doubledata[LENGTH];//输入信号
doubletemp[LENGTH];//中间结果
doubledata_output[LENGTH];//一维小波变换后的结果
intn=0;//输入信号长度
intm=6;//Daubechies正交小波基长度
inti=0;
chars[32];//从txt文件中读取一行数据

staticdoubleh[]={.332670552950,.806891509311,.459877502118,-.135011020010,
-.085441273882,.035226291882};
staticdoubleg[]={.035226291882,.085441273882,-.135011020010,-.459877502118,
.806891509311,-.332670552950};
//读取输入信号
FILE*fp;
fp=fopen("data.txt","r");
if(fp==NULL)//如果读取失败
{
printf("错误!找不到要读取的文件/"data.txt/"/n");
exit(1);//中止程序
}

while(fgets(s,32,fp)!=NULL)//读取长度n要设置得长一点,要保证读到回车符,这样指针才会定位到下一行?回车符返回的是零值?是,非数字字符经过atoi变换都应该返回零值
{
// fscanf(fp,"%d",&data[count]);//一定要有"&"啊!!!最后读了个回车符!适应能力不如atoi啊
data[n]=atof(s);
n++;
}

//一维小波变换
DWT1D(data,data_output,temp,h,g,n,m);

//一维小波变换后的结果写入txt文件
fp=fopen("data_output.txt","w");

//打印一维小波变换后的结果
for(i=0;i<n;i++)
{
printf("%f/n",data_output[i]);
fprintf(fp,"%f/n",data_output[i]);
}

//关闭文件
fclose(fp);
}

8. 请问在小波变换图像去噪中Xnoise=X+18*(rand(size(X)))中的18是代表什么

  • 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('压缩后图片');

    程序运行结果如下图:

  • 小波分析用于图像分解

    对图像分解的目地在于可以更好的观察图像的细节,对图像做出更好的判断,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

    程序运行结果如下图:

9. 小波变换去噪函数中wavedec和wden的区别

wden完整格式[xd,cxd,lxd]=wden(x,tptr,sorh,scal,n,‘wname’)是返回经过小波消噪处理后的信号xd及其小波分解结构
wavedec格式[c,l]=wavedec(x,n,'wname');是只返回小波分解后的系数,并未消噪

10. 急!!!在线等,求解答:一个小波去噪的matlab程序,高手进

供参考:
lev=5;
[c,l]=wavedec(x,lev,wname);
sigma=wnoisest(c,l,1);
alpha=2;
thr1=wbmpen(c,l,sigma,alpha)
[thr2,nkeep]=wdcbm(c,l,alpha)
xd1=wdencmp('gbl',c,l,wname,lev,thr1,'s',1);
[xd2,cxd,lxd,perf0,perfl2]=wdencmp('lvd',c,l,wname,lev,thr2,'h');
[thr,sorh,keepapp]=ddencmp('den','wv',x)
xd3=wdencmp('gbl',c,l,wname,lev,thr,'s',1);
subplot(411);plot(x);title('原始信号','fontsize',12);
subplot(412);plot(xd1);title('使用penalty阈值降噪后信号','fontsize',12);
subplot(413);plot(xd2);title('使用Birge-Massart阈值降噪后信号','fontsize',12);
subplot(414);plot(xd3);title('使用缺省阈值降噪后信号','fontsize',12);

s=[-1.58 0.42 0.46 0.78 -0.49 0.59 -1.3 -1.42 -0.16 -1.47 -1.35 0.36 -0.44 -0.14 1 -0.5 -0.2 -0.06 -0.6 0.42 -1.52 0.51 0.76 -1.5 0.16 -1.29 -0.65 -1.48 0.6 -1.65 -0.55];
[C,L]=wavedec(s,1,'db3');
ca1=wrcoef('a',C,L,'db3',1);
x1=ca1 ;
[C,L]=wavedec(s,2,'db3');
ca2=wrcoef('a',C,L,'db3',2);
x2=ca2 ;
[C,L]=wavedec(s,3,'db3');
ca3=wrcoef('a',C,L,'db3',3);
x3=ca3 ;
[C,L]=wavedec(s,4,'db3');
ca4=wrcoef('a',C,L,'db3',4);
x4=ca4 ;
cg = wrcoef('a',C,L,'sym5',1);
x5=cg;
p=1:31;
subplot(6,1,1);plot(p,s);ylabel('s');
subplot(6,1,2);plot(p,x1);ylabel('ca1');
subplot(6,1,3);plot(p,x2);ylabel('ca2');
subplot(6,1,4);plot(p,x3);ylabel('ca3');
subplot(6,1,5);plot(p,x4);ylabel('ca4')
subplot(6,1,6);plot(p,x5);ylabel('ca5') %加入的重构,是不是你要的看