【问题标题】:Fourier Transform and Fourier Descriptors to extract shapes features on Java傅里叶变换和傅里叶描述符在 Java 上提取形状特征
【发布时间】:2012-05-06 08:23:08
【问题描述】:

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

这就是我的想法:

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

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

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

【问题讨论】:

标签: java fft feature-detection


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-11
      • 2021-07-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-12
      相关资源
      最近更新 更多