使用离散傅里叶变换计算无限周期谱

Use Discrete Fourier Transform to calculate infinite periodic spectrum

使用 open cv,我能够从示例中收集大量信息 here。并在此处给出输入图像:

我得到以下输出:

但是,我不仅要找到中心光谱,还要找到重复结构的周期光谱。得到这样的东西:

本质上,我想使用傅里叶变换来找到每个重复方块的方向和中心。有没有办法在 opencv 中完成这个?我还没有在网上找到任何这样的例子。

按照前三个步骤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);