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

时间:2012-04-25 15:55:18

标签: java fft feature-detection

我正在尝试使用傅里叶描述符构建一个简单的系统来识别简单的形状: 我在我的程序中使用快速傅里叶变换的这种实现:(链接如下)
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值时做错了。

2 个答案:

答案 0 :(得分:8)

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

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

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

答案 1 :(得分:0)

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