傅里叶变换和傅立叶描述符在Java上提取形状特征

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

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

输入是:真实和图像部分(它本质上是边界参数的x,y坐标),输出是变换的实数和图像数。

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

这就是我的想法:

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

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

换句话说
我的描述符不是不变的…我认为我在获取R值时出错了。

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

  • 如果你想要平移不变,不要使用DC项,这是你得到的傅里叶系数数组中的第一个元素
  • 如果你想要不变缩放,可以进行比较比例,例如将每个傅立叶系数除以DC系数。 f * [1] = f [1] / f [0],f * [2] / f [0],依此类推。
  • 如果希望不变量到轮廓的起点,只使用得到的傅立叶系数的绝对值。
  • 当比较两个不同对象的系数时,只有前5到8个傅里叶系数是有用的。 较高的系数只会进入轮廓的细节,而这些细节大多不是非常有用的信息。 (这是重要的全球forms)
  • 假设您有2个对象及其傅里叶描述符。 得到的傅里叶系数arrays可以具有不同的大小,这意味着所得到的频率内容的“频率间隔”对于两种形状都是不同的。 你无法将苹果与梨进行比较。 对最短轮廓进行零填充以匹配最长轮廓的大小,然后计算傅里叶描述符。 现在你有系数和良好的比较之间的类比。

希望这可以帮助。 顺便说一句,用户自己的FFT解决方案在我看来并不值得信任。 寻找解决方案库。 如果使用图像,OpenCV提供傅里叶变换实用程序。

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