使用离散傅里叶变换计算无限周期谱
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);
使用 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);