MATLAB中的傅立叶描述符

时间:2018-09-19 21:47:32

标签: matlab pattern-matching fft fourier-descriptors

我试图找到不完全匹配的形状边界之间的匹配分数。我使用傅立叶描述符来表示这些边界,并基于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 个答案:

答案 0 :(得分:0)

请注意您应用于傅立叶组件的规范化:

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,但也可以在此处尝试使用较小的值。

比较这些最简单的方法是计算欧几里得距离,尽管我确信其他距离测量方法也可能有用。


TL; DR:

dtw距离度量对我来说似乎是错误的,请尝试使用正常的欧几里得距离(均方差)。此外,仅比较前约10个分量,后继分量会比有用信息增加更多的噪声。但是请忽略前两个元素,因为归一化使它们变得无用。