Дескрипторы Фурье в 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 компонентов, последующие компоненты добавят больше шума, чем полезной информации. Но пропустите первые два элемента, так как они были сделаны бесполезными в результате нормализации.