我正在尝试构建一个简单的系统来使用傅立叶描述符识别简单的形状:
我在我的程序中使用快速傅立叶变换的实现:(链接如下)
http://www.wikijava.org/wiki/The_Fast_Fourier_Transform_in_Java_%28part_1%29 http://www.wikijava.org/wiki/The_Fast_Fourier_Transform_in_Java_%28part_1%29
fft(double[] inputReal, double[] inputImag, boolean direction)
输入是:实数和图像部分(本质上是我所拥有的边界参数的 x,y 坐标)
输出是变换后的实数和图像数。
问题:我如何使用输出(转换后的 real,imag )作为简单形状的不变描述符?
这就是我的想法:
- 计算
R = sqrt( real^2 + imag^2 )
对于每 N 个步骤。
- 分别划分
R
by R[1]
= 使其不变的归一化因子。
问题是,对于稍微不同的图像,我得到非常不同的 R 值(例如应用了轻微的旋转等)
换句话说 :
我的描述符不是不变的...我认为我在获取 R 值时做错了什么。
您首先需要了解一些关于傅立叶描述符的理论:这是一种非常有趣的技术,但应该正确设计。你想要的是不变性;旋转、平移、甚至仿射变换的不变性。为了与其他傅里叶描述符集进行良好的比较,您应该考虑以下事项:
- 如果您想要平移不变性,请不要使用 DC 项,它是所得傅里叶系数数组中的第一个元素
- 如果您希望缩放不变,请使比较类似于比率,例如将每个傅立叶系数除以直流系数。 f*[1] = f[1]/f[0]、f*[2]/f[0] 等等。
- 如果您希望轮廓起点不变,则仅使用所得傅立叶系数的绝对值。
- 比较两个不同对象的系数时,只有前 5 到 8 个傅立叶系数有用;较高的系数仅涉及轮廓的细节,这大多不是非常有用的信息。 (重要的是全局形式)
- 假设您有 2 个对象及其傅立叶描述符。所得的傅里叶系数数组可以具有不同的大小,这意味着两种形状的所得频率内容的“频率间隔”是不同的。你不能将苹果与梨进行比较。对最短轮廓进行零填充以匹配最长轮廓的大小,然后计算傅立叶描述符。现在您已经有了系数之间的类比和良好的比较。
希望这可以帮助。顺便说一句,我认为用户制作的 FFT 解决方案并不值得信任。寻求解决方案图书馆的帮助。如果处理图像,OpenCV 提供傅里叶变换实用程序。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)