在opencv中使用FFT和IFFT有困难 我试图用OpenCV:将这个简单的MATLAB代码转换成C++: localstd=sqrt(abs(ifft2(fft2(output).*gf)));

在opencv中使用FFT和IFFT有困难 我试图用OpenCV:将这个简单的MATLAB代码转换成C++: localstd=sqrt(abs(ifft2(fft2(output).*gf)));,matlab,opencv,matrix,Matlab,Opencv,Matrix,这意味着对矩阵“output”进行fft,将其逐元素乘以矩阵“gf”,然后取其ifft,然后取其大小 我正在尝试以下简单代码: Mat planes[] = {Mat_<float>(output), Mat::zeros(output.size(), CV_32F)}; Mat complexI; merge(planes, 2, complexI); // Add to the expanded another plane with zer

这意味着对矩阵“output”进行fft,将其逐元素乘以矩阵“gf”,然后取其ifft,然后取其大小

我正在尝试以下简单代码:

    Mat planes[] = {Mat_<float>(output), Mat::zeros(output.size(), CV_32F)};
    Mat complexI;
    merge(planes, 2, complexI);         // Add to the expanded another plane with zeros

    dft(complexI, complexI,cv::DFT_SCALE);   
    for (int i=0;i<complexI.rows;i++){
        for (int j=0;j<complexI.cols;j++){
            complexI.at<float>(i,j)*=gf.at<float>(i,j);
        }
    }

    //now the inverse transform
    dft(complexI,complexI,cv::DFT_INVERSE);
    split(complexI, planes);                   // planes[0] = Re(DFT(I), planes[1] = Im(DFT(I))
    magnitude(planes[0], planes[1], planes[0]);// planes[0] = magnitude
    Mat localstd = planes[0];

for (int i=0;i<localstd.rows;i++){
    for (int j=0;j<localstd.cols;j++){
        localstd.at<float>(i,j)= sqrt(localstd.at<float>(i,j));
    }
}
Mat-planes[]={Mat_(输出),Mat::zeros(output.size(),CV_32F)};
席状复合体;
合并(平面,2,复杂);//添加到展开的另一个带有零的平面
dft(复杂度,复杂度,cv::dft_标度);

对于(int i=0;i在MatLAB版本中,从结果中取一个平方根,在OpenCV-否中,你检查过这个吗?

在MatLAB版本中,从结果中取一个平方根,在OpenCV-否中,你检查过这个吗?

在MatLAB版本中,你从结果中取一个平方根,在OpenCV-否中,你检查过这个吗?

在MatLAB版本中你从结果中取一个平方根,然后在OpenCV-no中。你检查过这个吗?

好的,一开始我就发现你的过滤有问题。我不确定这个循环会做什么,但是要进行频率过滤,你应该使用这个函数


另外,如果你想获得这个数量级的sqrt,你可以使用OpenCV的函数,而不必通过at操作符。

好的,一开始我就发现你的过滤有问题。我不确定这个循环会做什么,但要进行频率过滤,你应该使用这个函数


另外,如果你想获得这个数量级的sqrt,你可以使用OpenCV的函数,而不必通过at操作符。

好的,一开始我就发现你的过滤有问题。我不确定这个循环会做什么,但要进行频率过滤,你应该使用这个函数


另外,如果你想获得这个数量级的sqrt,你可以使用OpenCV的函数,而不必通过at操作符。

好的,一开始我就发现你的过滤有问题。我不确定这个循环会做什么,但要进行频率过滤,你应该使用这个函数


另外,如果你想获得这个数量级的sqrt,你可以使用OpenCV的函数,而不必通过at操作符。

如果gf也是一个复杂的矩阵,即CV_64FC2/CV_32FC2,你可能需要使用多光谱。否则,如果你想自己将它们相乘,那么你应该使用std::complex来访问那些复杂的vvalue.std::complex将为您执行复杂操作

for (int i=0;i<complexI.rows;i++){
        for (int j=0;j<complexI.cols;j++){
            complexI.at<complex<double>>(i,j)*=gf.at<complex<double>>(i,j);
        }
    }

for(int i=0;i如果gf也是复数矩阵,即CV_64FC2/CV_32FC2,则可能需要使用多光谱。否则,如果您想自己将它们相乘,则应使用std::complex访问这些复数值。std::complex将为您执行复数操作

for (int i=0;i<complexI.rows;i++){
        for (int j=0;j<complexI.cols;j++){
            complexI.at<complex<double>>(i,j)*=gf.at<complex<double>>(i,j);
        }
    }

for(int i=0;i如果gf也是复数矩阵,即CV_64FC2/CV_32FC2,则可能需要使用多光谱。否则,如果您想自己将它们相乘,则应使用std::complex访问这些复数值。std::complex将为您执行复数操作

for (int i=0;i<complexI.rows;i++){
        for (int j=0;j<complexI.cols;j++){
            complexI.at<complex<double>>(i,j)*=gf.at<complex<double>>(i,j);
        }
    }

for(int i=0;i如果gf也是复数矩阵,即CV_64FC2/CV_32FC2,则可能需要使用多光谱。否则,如果您想自己将它们相乘,则应使用std::complex访问这些复数值。std::complex将为您执行复数操作

for (int i=0;i<complexI.rows;i++){
        for (int j=0;j<complexI.cols;j++){
            complexI.at<complex<double>>(i,j)*=gf.at<complex<double>>(i,j);
        }
    }


for(int i=0;iIn openCV中我取平方根(magnity取平方根)。请看这里:我的意思是在MatLAB中你取额外的平方根。MatLAB中复杂数据的函数abs与openCV中的magnity做的相同谢谢,我添加了sqrt,但结果仍然非常不同。在openCV中我取平方根(震级取平方根)。参见此处:我的意思是在MatLAB中取额外的平方根。MatLAB中用于复杂数据的函数abs与OpenCV中的震级相同。谢谢,我添加了sqrt,但结果仍然非常不同。在OpenCV中,我取平方根(震级取平方根)。请看这里:我的意思是在MatLAB中,你需要额外的平方根。MatLAB中复杂数据的函数abs与OpenCV中的幅值相同。谢谢,我添加了sqrt,但结果仍然非常不同。在OpenCV中,我需要平方根(幅值取平方根)。请看这里:我的意思是在MatLAB中你需要额外的平方根。MatLAB中用于复杂数据的函数abs与OpenCV中的幅值相同。谢谢,我添加了sqrt,但结果仍然非常不同。如何定义过滤器?如何定义过滤器?如何定义过滤器?如何定义过滤器?如何定义过滤器?谢谢,我将尝试根据你的评论修改我的代码。没问题,希望它能帮助汉克斯,我会根据你的评论修改我的代码。没问题,希望它能帮助汉克斯,我会根据你的评论修改我的代码。没问题,希望它能帮助汉克斯,我会根据你的评论修改我的代码。没问题,希望它能帮助汉克斯!谢谢你的帮助谢谢你的帮助!谢谢你的帮助!谢谢你的帮助!