opencv3实现的傅里叶变换

本文介绍了一种使用OpenCV库进行图像傅里叶变换的方法。通过对输入图像进行延扩和填充,转换到频域,并计算幅度谱,最终实现频谱的可视化。文章详细展示了从读取图像到频谱展示的全过程。
Mat CRAWView::Fourier(IplImage * Four_ipl)
{

Scalar s;

Mat  srcimage(Four_ipl->height,Four_ipl->width,CV_16U);
int t;
for(int i=0;i<srcimage.rows;i++)
{
for(int j=0;j<srcimage.cols;j++)
{

s=cvGet2D(Four_ipl,i,j);

t=s.val[0];
srcimage.at<unsigned short int>(i,j)=t;

}

}//吧*iplimage里的数据赋给Mat
//将输入图像延扩到最佳尺寸,便捷用0填充
int mm=getOptimalDFTSize(srcimage.rows);
int nn=getOptimalDFTSize(srcimage.cols);
//将添加的像素初始化为0;
Mat padded;
    copyMakeBorder(srcimage,padded,0,mm-srcimage.rows,0,nn-             srcimage.cols,BORDER_CONSTANT,Scalar::all(0));

Mat planes[]={Mat_<float>(padded),Mat::zeros(padded.size(),CV_32F)};
Mat complexI;
merge(planes,2,complexI);

dft(complexI,complexI);

split(complexI,planes);

magnitude(planes[0],planes[1],planes[0]);
Mat magnitudeImage=planes[0];


    magnitudeImage+=Scalar::all(1);
log(magnitudeImage,magnitudeImage);

magnitudeImage=magnitudeImage(Rect(0,0,magnitudeImage.cols&-2,magnitudeImage.rows&-2));

int cx=magnitudeImage.cols/2;
int cy=magnitudeImage.rows/2;
Mat q0(magnitudeImage,Rect(0,0,cx,cy));
Mat q1(magnitudeImage,Rect(cx,0,cx,cy));
Mat q2(magnitudeImage,Rect(0,cy,cx,cy));
Mat q3(magnitudeImage,Rect(cx,cy,cx,cy));


Mat tmp;
q0.copyTo(tmp);
q3.copySize(q0);
tmp.copyTo(q3);


q1.copyTo(tmp);
q2.copyTo(q1);
tmp.copyTo(q2);


normalize(magnitudeImage,magnitudeImage,0,1,NORM_MINMAX);






return magnitudeImage;





}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值