Дескрипторы Фурье в MATLAB

Я пытаюсь найти совпадение между границами фигур, которые не совсем совпадают. Я использую дескриптор Фурье для представления этих границ и нахожу сходство на основе DTW следующим образом: (X,Y) координаты границы, отсортированные по часовой стрелке.

Z = complex(X, Y);
FD = fft(Z);
FD(1) = 0;
FD = FD/FD(2);

Тогда для меры сходства:

Dist = dtw(abs(FD1),abs(FD2));

Результат сходства не является точным, поэтому я хотел бы проверить, правильно ли я применил дескриптор Фурье и какие-либо рекомендации по критерию подобия.

Когда я пытаюсь ifft чтобы вернуть форму, полученная форма является отражением исходной формы. Как мне решить эту проблему?

1 ответ

Обратите внимание на нормализации, которые вы применяете к компонентам Фурье:

FD = fft(Z);
FD(1) = 0;       % ignore translation
FD = FD/FD(2);   % normalize for size, and rotate

FD(1) является компонентом DC и кодирует перевод. FD(2) самая низкая частота, которую она представляет (вместе с FD(end)) единственный компонент синус + косинус для контура. С помощью этого компонента вы можете представлять эллипс. Фаза кодирует ориентацию эллипса, величина кодирует размер, а разница в величине между FD(2) а также FD(end) представляет соотношение сторон. Делением на FD(2)Вы нормализуетесь по размеру и устанавливаете определенное вращение, определяемое только эллипсом наилучшего соответствия. Это объясняет, почему ваша форма казалась отраженной при использовании IFFT, она поворачивается в какую-то стандартную ориентацию.

В вашей мере ошибки, вы сравниваете только величину компонентов двух фигур. Игнорируя фазу, вы отбрасываете много того, что делает форму. Например, попробуйте построить IFFT для величины дескриптора Фурье. Вы увидите что-то, что совсем не похоже на вашу первоначальную форму.

Однако это обычное дело, так как это самый простой способ получения инвариантности вращения. Стандартизация ориентации на основе эллипса наилучшего соответствия очень чувствительна к шуму (с шумом, например, расположение образцов вдоль контура). Фактически, значение большинства элементов дескриптора Фурье очень чувствительно к этим местоположениям. Если контур выбирается в разных местах, дескриптор Фурье значительно изменяется.

Таким образом, в идеале мера ошибки учитывает как величину, так и фазу (или как действительные, так и мнимые компоненты). Но на практике трудно использовать информацию о фазе, и люди в основном сравнивают амплитуды, даже если многие различные формы станут подобными.

Далее, так как FD(1) был установлен на 0 и FD(2) 1, эти два компонента бесполезны. Кроме этого, вы должны смотреть только на первые несколько компонентов (скажем, n):

FD(1)   % ignore, set to 0 above
FD(2)   % ignore, set to 1 above
FD(3)
FD(4)
...
FD(n+2)

Эти частотные компоненты имеют связанный элемент, который можно найти по адресу:

FD(1)   -> none
FD(2)   -> FD(end)
FD(3)   -> FD(end-1)
FD(4)   -> FD(end-2)
...
FD(n+2) -> FD(end-n)

Я могу себе представить, что большинство людей просто игнорируют их, но я бы обязательно включил их в сравнение, поскольку они предоставляют дополнительную соответствующую информацию.

Это ведет к 2*n-1 числа (3:n+2 а также end-n:end). n обычно составляет 10, но и здесь экспериментируйте с меньшими значениями.

Самый простой способ сравнить их - это вычислить евклидово расстояние, хотя я уверен, что другие меры расстояния также могут быть полезны.


TL; DR:

dtw Мера расстояния мне кажется неправильной, попробуйте использовать нормальное евклидово расстояние (среднеквадратическая разница). Далее сравните только первые ~10 компонентов, последующие компоненты добавят больше шума, чем полезной информации. Но пропустите первые два элемента, так как они были сделаны бесполезными в результате нормализации.

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