2012-11-15 1 views
6

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

С менее известным из них 2D может иметь только длины значений степеней двух, но имеет простые в использовании методы, такие как FastFourierTransform.fastFT(real, imaginary, true);, причем реальное является двумерным массивом удвоений, полным всех значений пикселей, а мнимая часть - это 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 Библиотека и Docs можно найти здесь: https://sites.google.com/site/piotrwendykier/software/jtransforms

ответ

5

Это слишком плохо документация JTransforms не доступна в Интернете, кроме архивированном download. Это очень полно и полезно, вы должны это проверить!

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

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

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

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

+0

На самом деле, кажется, что (новые) документы сейчас на сайте GitHub : http://wendykierp.github.io/JTransforms/apidocs/ –

 Смежные вопросы

  • Нет связанных вопросов^_^