OpenCV实现fft2、ifft2变换和matlab中psf2otf()函数的功能

     Mat fft2(Mat src)
      {
           Mat Fourier;
           Mat planes[]={Mat_<float>(src), Mat::zeros(src.size(),CV_32F)}; //定义一个planes数组
           merge(planes, 2, Fourier);      
           dft(Fourier, Fourier);
           return Fourier;
       }

    
     Mat ifft2(Mat src)
      {
           Mat Fourier;
           idft(src, Fourier,0);        //或者写为:dft(src, Fourier, DFT_INVERSE);
           vector<Mat> planes(2);
           split(Fourier, planes);
           magnitude(planes[0], planes[1], planes[0]); //将复数转化为幅值
           normalize(planes[0], planes[0], 0,1,NORM_MINMAX);//归一化
           return planes[0];
       }

    void psf2otf(Mat src,int rows,int cols, Mat& dst)
    {   // matlab中该函数的形式为:D=psf2otf(d,[rows,cols]); 其中d的行数和列数可能小于rows和cols,此处d相当于src.
Mat src_fill=Mat::zeros(rows,cols,CV_32F);
Mat src_fill_out=Mat::zeros(rows,cols,CV_32F);
for (int i=0;i<src.rows;i++)
{
float* data=src_fill.ptr<float>(i);
float* data2=src.ptr<float>(i);
for (int j=0;j<src.cols;j++)
{
data[j]=data2[j];
}
}
circshift(src_fill, -int(src.rows/2), -int(src.cols/2), src_fill_out);
dst=fft2(src_fill_out);
return;
      }
      上面的函数中,circshift()定义如下:
    void circshift(Mat img, int dw, int dh, Mat& dst)
   {
int rows=img.rows;
int cols=img.cols;
dst=img.clone();
if (dw<0 && dh<0)
{
for (int i=0; i<rows; i++)
{
int t=i+dw;
if (t>=0)
{
float* data=img.ptr<float>(i);
float* data2=dst.ptr<float>(t);
for (int j=0;j<cols; j++)
{
data2[j]=data[j];
}

else
{
float* data=img.ptr<float>(i);
float* data2=dst.ptr<float>(dst.rows+t);
for (int j=0;j<cols; j++)
{
data2[j]=data[j];
}
}
}


for (int j=0; j<cols; j++)
{
int t=j+dh;
if (t>=0)
{
for (int i=0;i<rows; i++)
{
float* data=img.ptr<float>(i);
float* data2=dst.ptr<float>(i);
data2[t]=data[j];
}

else
{
for (int i=0;i<rows;i++)
{
float* data=img.ptr<float>(i);
float* data2=dst.ptr<float>(i);
data2[dst.cols+t]=data[j];
}
}
}
}
return;
    }


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值