JTransforms БПФ на изображении

у меня есть изображение,которое я хочу преобразовать в частотную область с помощью FFT, кажется, нет библиотек для этого для Java, но я нашел два. Один JTransforms и другие менее известные и не имеет имени.

С менее известным 2D мог иметь только длины вейлов степеней двух, но имел простые в использовании методы, такие как FastFourierTransform.fastFT(real, imaginary, true); с реальным бытием 2D-массив двойников, полный значений каждого пикселя, а мнимая часть-2D-массив тот же размер, Полный нулей. Логическое значение будет зависеть от прямого или обратного преобразования. Это имело смысл для меня и он работал, кроме мощности двух требование, которое разрушило любые преобразования я (я изначально добавил черное пространство вокруг изображения, чтобы подогнать его к ближайшей степени двойки), что я борюсь с это работать, как с помощью эквивалентных методов для JTransforms и был бы признателен за любые рекомендации в этом направлении. Я скажу, что я сейчас делаю.

Я верю соответствующий класс будет DoubleFFT_2D, его конструктор принимает несколько строк и столбцов, которые я бы предположил как ширину и высоту моего изображения. Поскольку мой образ не имеет воображаемых частей, я думаю, что могу использовать doubleFFT.realForwardFull(real); который рассматривает мнимые части как ноль и передает реальный 2D-массив, полный пикселей. К сожалению, это не работает вообще. В Javadoc государств the input array must be of size rows*2*columns, with only the first rows*columns elements filled with real data но я не вижу, как это связано с моим изображением и что я должен сделать, чтобы удовлетворить это требование.

извините длинное и плохое объяснение, если какая-либо дополнительная информация необходима, я был бы рад предоставить ее.

библиотека JTransforms и документы можно найти здесь:https://sites.google.com/site/piotrwendykier/software/jtransforms

1 ответов


жаль, что документация для JTransforms недоступна в интернете, кроме zipped скачать. Это очень полный и полезный, вы должны проверить его!

чтобы ответить на ваш вопрос:DoubleFFT_2D.realForwardFull(double[][] a) принимает массив вещественных чисел (пиксели). Однако результат БПФ будет иметь два выходных значения для каждого входного значения-реальную и мнимую часть каждого частотного Бина. Вот почему ваш входной массив должен быть в два раза больше, чем фактический массив изображений, половина которого пуста / заполнена нулями.

обратите внимание, что все функции FFT используют a не только для ввода, но и для вывода - это означает, что любые данные изображения будут потеряны, поэтому может быть желательно скопировать в другой / больший массив в любом случае!

простое и очевидное исправление для вашего сценария будет использовать DoubleFFT_2D.realForward(double[][] a). Этот будет вычислять только положительный спектр, потому что отрицательная сторона будет симметричной к нему. Это потому, что ваши входные значения реальны.

кроме того, проверьте RealFFTUtils_2D класс В JTransforms, что сделает его намного проще для вас, чтобы получить результаты из массива впоследствии:)