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, что сделает его намного проще для вас, чтобы получить результаты из массива впоследствии:)