當前位置:首頁 » 編程語言 » 小波去噪的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') %加入的重構,是不是你要的看