首页 > 解决方案 > 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恢复形状时,生成的形状是原始形状的反射。我该如何解决这个问题?

标签: matlabpattern-matchingfftfourier-descriptors

解决方案


请注意应用于傅立叶分量的标准化:

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+2end-n:end)。n通常为 10,但也可以在这里尝试较小的值。

比较这些的最简单方法是计算Euclidean distance,尽管我确信其他距离度量也很有用。


TL;博士:

距离dtw测量对我来说似乎是错误的,请尝试使用正常的欧几里德距离(均方差)。此外,仅比较前 10 个组件,后续组件将添加比有用信息更多的噪声。但是忽略前两个元素,因为标准化使它们变得无用。


推荐阅读