3

我正在尝试构建一个简单的系统来使用傅立叶描述符识别简单的形状:我在我的程序中使用快速傅立叶变换的这种实现:(下面的链接)
http://www.wikijava.org/wiki/The_Fast_Fourier_Transform_in_Java_%28part_1%29

fft(double[] inputReal, double[] inputImag, boolean direction)

输入是:real 和 imag 部分(本质上是我拥有的边界参数的 x,y 坐标),输出是转换后的 real 和 imag 数。

问题:如何使用输出(变换的 real,imag )作为我的简单形状的不变描述符?

这就是我的想法:

  • 每N步计算R = sqrt( real^2 + imag^2 )
  • 将每个R除以R[1]= 归一化因子以使其不变。

问题是对于略有不同的图像(例如应用轻微旋转等),我得到了非常不同的 R 值

换句话说
我的描述符不是一成不变的......我认为我在获取 R 值方面做错了。

4

2 回答 2

9

关于傅立叶描述符,您首先需要了解一些理论:这是一种非常有趣的技术,但应该正确设计。你想要的是不变性;旋转、平移甚至仿射变换的不变性。为了与其他傅里叶描述符集进行良好比较,您应该考虑以下事项:

  • 如果您想要平移不变性,请不要使用 DC 项,它是结果傅立叶系数数组中的第一个元素
  • 如果您想要缩放不变性,请使比较比率类似,例如通过将每个傅立叶系数除以 DC 系数。f*[1] = f[1]/f[0]、f*[2]/f[0] 等等。
  • 如果您想要轮廓起点的不变性,请仅使用所得傅立叶系数的绝对值。
  • 在比较两个不同对象的系数时,只有前 5 到 8 个傅里叶系数有用;更高的系数只会进入轮廓的细节,而这些细节大多不是非常有用的信息。(重要的是全局形式)
  • 假设您有 2 个对象和它们的傅立叶描述符。得到的傅立叶系数数组可以具有不同的大小,这意味着对于两种形状,得到的频率内容的“频率间隔”是不同的。你不能将苹果与梨进行比较。零填充最短轮廓以匹配最长轮廓的大小,然后计算傅立叶描述符。现在你有了系数之间的类比和一个很好的比较。

希望这可以帮助。顺便说一句,我认为用户制作的 FFT 解决方案不可信。寻求解决方案库。如果使用图像,OpenCV 提供傅立叶变换实用程序。

于 2012-08-13T11:59:35.937 回答
0

如果您希望匹配不同的形状,请尝试使用来自 MPEG-7 标准的不同形状描述符。您可能需要一个分类器,看看 SVM、Boosting、Neural Networks ...:http ://docs.opencv.org/modules/ml/doc/ml.html

于 2013-06-12T10:40:17.290 回答