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;
}
{ // 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;
}
{
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;
}