Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
FFT和IFFT-Matlab和openCV中结果之间的差异 我试图用OpenCV:将这个简单的MATLAB代码转换成C++: localstd=sqrt(abs(ifft2(fft2(output).*gf)));_Matlab_Opencv_Image Processing - Fatal编程技术网

FFT和IFFT-Matlab和openCV中结果之间的差异 我试图用OpenCV:将这个简单的MATLAB代码转换成C++: localstd=sqrt(abs(ifft2(fft2(output).*gf)));

FFT和IFFT-Matlab和openCV中结果之间的差异 我试图用OpenCV:将这个简单的MATLAB代码转换成C++: localstd=sqrt(abs(ifft2(fft2(output).*gf)));,matlab,opencv,image-processing,Matlab,Opencv,Image Processing,这意味着对矩阵“output”进行fft,将其逐元素乘以矩阵“gf”,然后取其ifft,然后取其大小 我正在尝试以下简单代码: Mat complexI; dft(output, complexI,cv::DFT_SCALE||DFT_COMPLEX_OUTPUT); Mat copmlexI2=Mat(n,n,CV_32F); mulSpectrums(complexI,gf,copmlexI2,DFT_COMPLEX_OUTPUT); dft(copmlexI2,copmlexI2,cv::

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

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

Mat complexI;
dft(output, complexI,cv::DFT_SCALE||DFT_COMPLEX_OUTPUT);
Mat copmlexI2=Mat(n,n,CV_32F);
mulSpectrums(complexI,gf,copmlexI2,DFT_COMPLEX_OUTPUT);
dft(copmlexI2,copmlexI2,cv::DFT_INVERSE||DFT_COMPLEX_OUTPUT);

Mat planes[]= {Mat::zeros(output.size(), CV_32F), Mat::zeros(output.size(), CV_32F)};;
split(copmlexI2, 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));
    }
}

for (int i=0;i<localstd.rows;i++){
        for (int j=0;j<localstd.cols;j++){
            localstd.at<float>(i,j)/= 255;
        }
    }
matcomplexi;
dft(输出,复杂度,cv::dft_标度| | dft_复数_输出);
Mat copmlexI2=Mat(n,n,CV_32F);
多光谱(复数、gf、copmlexI2、DFT_复数_输出);
dft(copmlexI2,copmlexI2,cv::dft_逆| | dft_复|输出);
Mat平面[]={Mat::zeros(output.size(),cv32f),Mat::zeros(output.size(),cv32f)};;
拆分(copmlexI2,平面);//平面[0]=Re(DFT(I),平面[1]=Im(DFT(I))
幅值(平面[0],平面[1],平面[0]);//平面[0]=幅值
Mat localstd=平面[0];
对于(int i=0;i这是不正确的

cv::DFT_INVERSE||DFT_COMPLEX_OUTPUT
,如果要组合二进制值,应使用“二进制或”:

or+操作

cv::DFT_INVERSE + DFT_COMPLEX_OUTPUT
A | | B-是逻辑或。A、B和结果只能是真或假

A | B-是按位或

您也可以尝试DFT_比例标志

DFT_SCALE缩放结果:将其除以数组数 元素。通常,它与DFT_逆组合


嗯,乍一看,你在MATLAB中调用2D fft,在OpenCV中调用1D fft:这可能是原因吗?它们有什么不同?你能提供图像吗?@fpe,你确定它是1D fft吗?什么函数在OpenCV中执行2D fft?谢谢!顺便说一句,你取平方根的循环会非常慢(因为
at
会在每个像素处重新计算索引)。请改为:同样,对于缩放,您可以将localstd乘以
(1.0f)/255.0f)
。无需循环-请参阅。这无助于解决我们眼前的问题。
cv::DFT_INVERSE + DFT_COMPLEX_OUTPUT