Преобразование Фурье и дескрипторы Фурье для извлечения функций фигур на Java

Я пытаюсь создать простую систему для распознавания простых фигур с использованием дескрипторов Фурье: я использую эту реализацию быстрого преобразования Фурье в своей программе: (ссылка ниже)
http://www.wikijava.org/wiki/The_Fast_Fourier_Transform_in_Java_%28part_1%29

fft(double[] inputReal, double[] inputImag, boolean direction)

входы: реальная часть и часть изображения (которые, по сути, являются координатами x, y граничного параметра, который у меня есть), а выходы - преобразованные числа реального и изображения.

вопрос: Как я могу использовать вывод (преобразованный реальный, образ) в качестве инвариантных дескрипторов моих простых форм?

Вот что я подумал:

  • вычислить R = sqrt( real^2 + imag^2 ) для каждых N шагов.
  • разделите каждое R на R[1] = коэффициент нормализации, чтобы сделать его неизменным.

Проблема в том, что я получаю очень разные значения R для немного разных изображений (например, небольшие повороты и т. Д.).

Другими словами :
Мои дескрипторы не инвариантны... Я думаю, что делаю что-то не так, получая значение R.


person user1356658    schedule 25.04.2012    source источник
comment
Отличный сайт для рядов Фурье, взгляните на него Серии Фурье   -  person Tirtha    schedule 13.08.2012


Ответы (2)


Есть некоторая теория, которую вам нужно знать в первую очередь о дескрипторах Фурье: это чрезвычайно интересный метод, но его следует разработать правильно. Вам нужна инвариантность; инвариантность к вращению, переносу, может быть, даже к аффинным преобразованиям. Чтобы обеспечить хорошее сравнение с другими наборами дескрипторов Фурье, вы должны принять во внимание следующие вещи:

  • если вы хотите инвариантности к переводу, не используйте термин DC, который является первым элементом в результирующем массиве коэффициентов Фурье.
  • если вы хотите инвариантность к масштабированию, сделайте соотношение сравнения подобным, например, разделив каждый коэффициент Фурье на DC-коэффициент. f*[1] = f[1]/f[0], f*[2]/f[0] и так далее.
  • если вы хотите инвариантности к начальной точке вашего контура, используйте только абсолютные значения результирующих коэффициентов Фурье.
  • Только первые 5–8 коэффициентов Фурье полезны при сравнении коэффициентов двух разных объектов; более высокие коэффициенты относятся только к деталям вашего контура, что в основном не очень полезно. (важна глобальная форма)
  • Допустим, у вас есть 2 объекта и их дескрипторы Фурье. Результирующий массив коэффициентов Фурье может иметь разный размер, что означает, что «частотный интервал» результирующего частотного содержания различен для обеих форм. Нельзя сравнивать яблоки с грушами. Обнулите самый короткий контур, чтобы он соответствовал размеру самого длинного контура, а затем рассчитайте дескрипторы Фурье. Теперь у вас есть аналогия между коэффициентами и хорошее сравнение.

Надеюсь это поможет. Кстати, на мой взгляд, пользовательским решениям FFT нельзя доверять. Воспользуйтесь решениями, доступными в библиотеках. При работе с изображениями OpenCV предоставляет утилиты преобразования Фурье.

person filipsch    schedule 13.08.2012

Если вы хотите сопоставить разные формы, попробуйте использовать разные дескрипторы формы из стандарта MPEG-7. Вам, вероятно, понадобится классификатор, взгляните на SVM, Boosting, Neural Networks...: http://docs.opencv.org/modules/ml/doc/ml.html

person Przemyslaw Szeptycki    schedule 12.06.2013