请注意应用于傅立叶分量的标准化:
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,但也可以在这里尝试较小的值。
比较这些的最简单方法是计算Euclidean distance,尽管我确信其他距离度量也很有用。
TL;博士:
距离dtw
测量对我来说似乎是错误的,请尝试使用正常的欧几里德距离(均方差)。此外,仅比较前 10 个组件,后续组件将添加比有用信息更多的噪声。但是忽略前两个元素,因为标准化使它们变得无用。