0

如何在 OpenCV 中将复杂的 Mat 与真实的 Mat 分开?我想计算相位相关的互功率谱,但使用除法时出现运行时错误。

更新 我想出了一种计算交叉功率谱的方法,但我没有得到合适的结果来找到图像的翻译。下面是代码。我拆分了逆 dft 的结果,因为它有两个通道。然后,我能够划分,但结果仅在水平轴上不适合平移。最大值应该只有一个,但最大值有很多。

图片

void computeFFTMag(Mat&,Mat&,Mat&);
string getImgType(int );

int main( int argc, char** argv )
{
    Mat ref,sens,refMag,sensMag,refFFT,sensFFT;
    ref = imread("lena1.jpg",CV_LOAD_IMAGE_GRAYSCALE);
    sens = imread("lena3.jpg",CV_LOAD_IMAGE_GRAYSCALE);


    namedWindow( "Sensed Image", CV_WINDOW_AUTOSIZE );
    imshow( "Sensed Image", sens );

    computeFFTMag(ref,refMag,refFFT);
    computeFFTMag(sens,sensMag,sensFFT);


    Mat R1,R2,R,r,rf[2],rff;
    mulSpectrums(refFFT,sensFFT,R1,0,true);
    multiply(refMag,sensMag,R2);
    dft(R1,r,DFT_REAL_OUTPUT);
    split(r,rf);
    divide(rf[0],R2,r);
    normalize(r, r, 0, 1, CV_MINMAX);
    namedWindow( "Reference Image", CV_WINDOW_AUTOSIZE );
    imshow("Reference Image"       , r   );
}



void computeFFTMag(Mat& input,Mat& fftMag,Mat& complexFFT){
    Mat inputPadded;
    /*int r=getOptimalDFTSize(input.rows);
    int c=getOptimalDFTSize(input.cols);
    copyMakeBorder(input,inputPadded,0,r-input.rows,0,c-input.cols,BORDER_CONSTANT, Scalar::all(0));*/
    Mat fftPlanes[] = {Mat_<float>(input), Mat::zeros(input.size(), CV_32F)};
    //Mat complexFFT;
    merge(fftPlanes, 2, complexFFT);

    dft(complexFFT,complexFFT);
    split(complexFFT,fftPlanes);
    magnitude(fftPlanes[0],fftPlanes[1],fftPlanes[0]);

    fftMag=fftPlanes[0];

    //fftMag = fftMag(Rect(0, 0, fftMag.cols & -2, fftMag.rows & -2));
    int cx = fftMag.cols/2;
    int cy = fftMag.rows/2;
    Mat q0(fftMag, Rect(0, 0, cx, cy));   // Top-Left - Create a ROI per quadrant
    Mat q1(fftMag, Rect(cx, 0, cx, cy));  // Top-Right
    Mat q2(fftMag, Rect(0, cy, cx, cy));  // Bottom-Left
    Mat q3(fftMag, Rect(cx, cy, cx, cy)); // Bottom-Right

    Mat tmp;                           // swap quadrants (Top-Left with Bottom-Right)
    q0.copyTo(tmp);
    q3.copyTo(q0);
    tmp.copyTo(q3);

    q1.copyTo(tmp);                    // swap quadrant (Top-Right with Bottom-Left)
    q2.copyTo(q1);
    tmp.copyTo(q2);
}
4

0 回答 0