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

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

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

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

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

Это было то, что я думал:

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

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

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

2 ответа

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

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

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

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

Другие вопросы по тегам