使用离散傅立叶变换来计算无限周期频谱

时间:2018-09-19 21:13:46

标签: c# opencv fft dft

使用开放式简历,我可以从示例here中大量学习。并在这里给出输入图像: enter image description here

我得到以下输出: enter image description here

但是,我不仅要查找中心光谱,而且还要查找重复结构的周期光谱。得到这样的事情: enter image description here

本质上,我想使用傅立叶变换来找到每个重复正方形的方向和中心。有没有办法在opencv中完成此操作?我尚未在网上找到任何示例。

1 个答案:

答案 0 :(得分:0)

遵循前三个步骤here

        Mat padded = new Mat();                            //expand input image to optimal size
        int optimalSizeRows = Cv2.GetOptimalDFTSize(i.Rows);
        int optimalSizeCols = Cv2.GetOptimalDFTSize(i.Cols); // on the border add zero pixels
        Cv2.CopyMakeBorder(i, padded, 0, optimalSizeRows - i.Rows, 0,
            optimalSizeCols - i.Cols, BorderTypes.Constant, Scalar.All(0));

        Mat paddedFloat = new Mat();
        padded.ConvertTo(paddedFloat, MatType.CV_32FC1);
        Mat[] planes = { paddedFloat, Mat.Zeros(padded.Size(), MatType.CV_32F) };
        Mat complexI= new Mat();
        Cv2.Merge(planes, complexI);         // Add to the expanded another plane with zeros
        Mat dftImage = new Mat();
        // Apply fourier transformation
        Cv2.Dft(complexI, dftImage, DftFlags.ComplexOutput);

然后在dft生成的图像上调用MulSpectrums(本质上是系数自动相关),然后进行逆FFT,得到所需的结果。

        Mat mulSpecMat = new Mat();
        Mat inverse = new Mat();
        Mat norm = new Mat();
        Cv2.MulSpectrums(dftImage, dftImage, mulSpecMat, DftFlags.ComplexOutput, true);
        Cv2.Dft(mulSpecMat, inverse, DftFlags.Inverse | DftFlags.RealOutput);
        Cv2.Normalize(inverse, norm, 0, 255, NormTypes.MinMax);