使用开放式简历,我可以从示例here中大量学习。并在这里给出输入图像:
但是,我不仅要查找中心光谱,而且还要查找重复结构的周期光谱。得到这样的事情:
本质上,我想使用傅立叶变换来找到每个重复正方形的方向和中心。有没有办法在opencv中完成此操作?我尚未在网上找到任何示例。
答案 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);