OpenCV學習 DFT變換

2021-09-06 06:22:58 字數 2845 閱讀 9681

出處:

#include "cv.h"

#include "highgui.h"

#include "cxcore.h"

void cvshiftdft(cvarr *src_arr,cvarr *dst_arr)

if (src_arr == dst_arr)

cx=size.width/2;//取出影象的原點

cy=size.height/2;

q1=cvgetsubrect(src_arr,&q1stub,cvrect(0,0,cx,cy));

//取出影象的第一象限,由q1指標指向它

q2=cvgetsubrect(src_arr,&q2stub,cvrect(cx,0,cx,cy));

//取出影象的第二象限,由q2指標指向它

q3=cvgetsubrect(src_arr,&q3stub,cvrect(cx,cy,cx,cy));

//取出影象的第三象限,由q3指標指向它

q4=cvgetsubrect(src_arr,&q4stub,cvrect(0,cy,cx,cy));

//取出影象的第四象限,由q4指標指向它

d1=cvgetsubrect(src_arr,&d1stub,cvrect(0,0,cx,cy));

d2=cvgetsubrect(src_arr,&d2stub,cvrect(cx,0,cx,cy));

d3=cvgetsubrect(src_arr,&d3stub,cvrect(cy,cy,cx,cy));

d4=cvgetsubrect(src_arr,&d4stub,cvrect(0,cy,cx,cy));

if (src_arr!=dst_arr)

//以影象中心為原點,調整傅利葉變換影象的四個象限區,

//即第一與第三象限交換,第二與第四象限交換

cvcopy(q3,d1,0);

cvcopy(q4,d2,0);

cvcopy(q1,d3,0);

cvcopy(q2,d4,0);

}else

}int main(int argc,char ** argv)

//分配空間

realinput = cvcreateimage(cvgetsize(im),ipl_depth_64f,1);//單通道

imaginaryinput =cvcreateimage(cvgetsize(im),ipl_depth_64f,1);//單通道

complexinput = cvcreateimage(cvgetsize(im),ipl_depth_64f,2);//雙通道

cvscale(im,realinput,1.0,0.0);

//#define cvscale cvconvertscale=>readinput=im

cvzero(imaginaryinput);

//清空這個影象的內容

cvmerge(realinput,imaginaryinput,null,null,complexinput);

//混合這兩個影象作為complexinput的兩個通道

/*得到最優dft尺寸 */

dft_m = cvgetoptimaldftsize(im->height-1);

dft_n = cvgetoptimaldftsize(im->width-1);

dft_a = cvcreatemat(dft_m,dft_n,cv_64fc2);

image_re = cvcreateimage(cvsize(dft_n,dft_m),ipl_depth_64f,1);//實部

image_im = cvcreateimage(cvsize(dft_n,dft_m),ipl_depth_64f,1);//虛部

cvgetsubrect(dft_a,&tmp,cvrect(0,0,im->width,im->height));

cvcopy(complexinput,&tmp,null);

if( dft_a->cols > im->width )//若得到的最優dft尺寸在寬度上大於原圖,則重新取

cvdft(dft_a,dft_a,cv_dxt_forward,complexinput->height);

cvnamedwindow("win",0);

cvnamedwindow("magnitude",0);

cvshowimage("win",im);

//分割出實部和虛部

cvsplit(dft_a,image_re,image_im,0,0);

//計算功率譜 mag=sqrt(re^2+im^2)

cvpow(image_re,image_re,2.0);

cvpow(image_im,image_im,2.0);

cvadd(image_re,image_im,image_re,null);//image_re<=image_re+image_im

cvpow(image_re,image_re,0.5);

//計算log(1+mag)

cvadds(image_re,cvscalarall(1.0),image_re,null);

cvlog(image_re,image_re);

cvshiftdft(image_re,image_re);

cvminmaxloc(image_re,&m,&m,null,null,null);

cvscale(image_re,image_re,1.0/(m-m),1.0*(-m)/(m-m));

cvshowimage("magnitude",image_re);

cvwaitkey(-1);

return 0;

}

出處:

DCT變換和DFT變換

這裡我只談論二維的dft變換,有關一維的dft,請檢視一下部落格,裡面有詳細介紹 根據上面的公式,我們可以得到對應的離散傅利葉變換呃 下面是matlab版本的 和公式 12 是一一對應的,時間複雜度為 mn 2,通常記成n 4,因此對於乙個512 512的來說,計算量就已經很大了,更不用說別的高解析...

離散傅利葉變換DFT

dft是為適應計算機分析傅利葉變換規定的一種專門運算,本章是數字訊號處理課程的重點章節。3.7用dft進行頻譜分析 1.用dft對連續訊號進行譜分析 1 原理 2 頻率解析度與dft引數的選擇 頻率解析度是指所用的演算法能將訊號中兩個靠得很近的譜峰分開的能力。設是乙個帶限的連續時間訊號,最高頻率為f...

離散傅利葉變換 DFT

這種型別的訊號沿正負軸無窮方向伸展,並且不會出現週期性的重複.此類訊號的傅利葉變換稱為傅利葉變換.此類訊號的傅利葉變換稱為傅利葉級數.在負無窮到正無窮區間內,這類訊號僅在一些不連續的點處有定義,並且不會周期性地反覆出現.此類訊號的傅利葉變換稱為離散時間傅利葉變換.這種型別的訊號是按一定時間間隔從負無...