4

我一直在阅读一些关于抗锯齿的文章,这似乎是有道理的,但有一件事我不太确定。您如何准确找到信号的最大频率(在图形的上下文中)。

我意识到有不止一种情况,所以我认为答案不止一种。但首先让我陈述一个我认为代表最大频率的简单算法,以便有人可以告诉我我是否以错误的方式概念化它。

假设它适用于一维、有限和灰度图像(以像素为单位)。我是否正确假设您可以简单地扫描整个像素线(在空间域中)以寻找最小振荡并且最小振荡的倒数将是最大频率?

防爆值 {23,26,28,22,48,49,51,49}

频率:关于设置 {}

(1/2) = .5 : {28,22}

(1/4) = .25 : {22,48,49,51}

那么0.5是最大频率吗?

对于与上述类似的像素线,计算此值的理想方法是什么?

从理论上讲,如果您的采样输入是无限的(更像现实世界)怎么办?一个有效的过程会是这样的:

Predetermine a decent interval for point sampling
Determine max frequency from point sampling
while(2*maxFrequency >  pointSamplingInterval)
{
pointSamplingInterval*=2
Redetermine maxFrequency from point sampling (with new interval)
}

我知道这些算法效率低下,那么有哪些首选方法?(不是在寻找疯狂优化的东西,只是从根本上更好的概念)

4

4 回答 4

2

解决这个问题的正确方法是使用傅立叶变换(实际上是 FFT 或快速傅立叶变换

该理论的工作原理如下:如果您有一组具有彩色/灰度的像素,那么我们可以说图像由“空间域”中的像素表示;也就是说,每个单独的数字都指定了特定空间位置的图像。

然而,我们真正想要的是图像在“频域”中的表示。不是每个单独的数字指定每个像素,而是每个数字代表整个图像中特定频率的幅度。

从“空间域”转换到“频域”的工具是傅里叶变换。FT 的输出将是一系列数字,指定不同频率的相对贡献。

为了找到最大频率,您执行 FT,并查看您获得的高频幅度 - 然后只需从最高频率向下搜索,直到您达到“最小有效幅度”阈值。

您可以编写自己的 FFT,但在实践中使用预打包的库(例如FFTW )要容易得多

于 2009-02-27T07:21:59.093 回答
2

您不会扫描最高频率的信号,然后选择您的采样频率:您选择一个足够高的采样频率来捕获您想要捕获的东西,然后过滤信号以去除高频。在采样之前,您丢弃所有高于采样率一半的东西。

我是否正确假设您可以简单地扫描整个像素线(在空间域中)以寻找最小振荡并且最小振荡的倒数将是最大频率?

如果您有一行像素,则采样已经完成。应用抗锯齿过滤器为时已晚。可能出现的最高频率是采样频率的一半(我猜是“1/2px”)。

从理论上讲,如果您的采样输入是无限的(更像现实世界)怎么办?

是的,那是您使用过滤器的时候。首先,您有一个连续函数,例如真实图像(无限采样率)。然后过滤它以删除 fs/2 以上的所有内容,然后在 fs 处对其进行采样(将图像数字化为像素)。相机实际上并没有进行任何过滤,这就是为什么在拍摄砖块等时会出现莫尔条纹的原因。

替代文字

如果您要对计算机图形进行抗锯齿处理,则必须首先考虑理想的连续数学函数,然后考虑如何对其进行过滤和数字化以在屏幕上产生输出。

例如,如果你想用计算机生成方波,你不能天真地在最大值和最小值之间交替。这就像在不先过滤的情况下对现实生活中的信号进行采样一样。高次谐波回绕到基带中,并在频谱中产生大量杂散尖峰。您需要生成点,就好像它们是从过滤的连续数学函数中采样的一样:

替代文字

于 2009-12-13T05:42:41.207 回答
1

我认为 O'Reilly 网站上的这篇文章也可能对您有用... http://www.onlamp.com/pub/a/python/2001/01/31/numerically.html ...在那里他们'指的是声音文件的频率分析,但它给了你这个想法。

于 2009-02-27T01:35:29.193 回答
0

我认为您需要的是傅立叶分析的应用程序(http://en.wikipedia.org/wiki/Fourier_analysis)。我研究过这个,但从未使用过,所以要加点盐,但我相信如果你正确地将它应用到你的一组数字上,你会得到一组频率,它们是系列的组成部分,然后你可以选择最高的一个。

我无法向您指出执行此操作的一段代码,但我确信它会在某个地方。

于 2009-02-27T01:32:44.923 回答