Используйте дискретное преобразование Фурье для расчета бесконечного периодического спектра - PullRequest
0 голосов
/ 20 сентября 2018

Используя open cv, я могу много почерпнуть из примера здесь .И учитывая входное изображение здесь: enter image description here

В качестве вывода я получаю следующее: enter image description here

Однако яхочу найти не просто центр спектра, я хочу найти периодический спектр повторяющейся структуры.Получается что-то вроде этого: enter image description here

По сути, я хочу использовать преобразование Фурье, чтобы найти ориентацию и центр для каждого повторяющегося квадрата.Есть ли способ сделать это в opencv?Я не нашел ни одного примера этого онлайн.

1 Ответ

0 голосов
/ 26 сентября 2018

Выполните первые три шага здесь :

        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);

Затем выполните вызов MulSpectrums (по существу, автокорреляция коэффициентов) для результирующего изображения dft и выполните обратное БПФ и Iполучить результаты, которые мне нужны.

        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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...