抗锯齿:确定最大频率的首选方法是什么?

4

我最近学习了一些有关反锯齿技术的知识,感觉理解了,但有一个问题不太确定。在图形中,如何找到信号的最大频率呢?

由于情况有多种,所以我认为答案也会有多个。但首先让我说出一个简单的算法,我认为它能表示最大频率,如果我理解得不对,请告诉我。

假设是一个1维、有限和灰度图像(由像素组成)。我是否正确地认为可以在整个像素线(在空间域)上扫描,寻找最小振荡,而这个最小振荡的倒数就是最大频率?

例如:{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个回答

2
你不会为了最高频率而扫描信号,然后选择采样频率:你选择一个足够高以捕捉到想要捕捉的内容的采样频率,然后你过滤信号以去除高频。在采样之前,你需要丢弃所有高于采样率一半的内容。

我猜您是想简单地扫描整个像素行(在空间域中),寻找最小振荡,然后最小振荡的倒数将是最大频率,我的理解正确吗?

如果你有一行像素,那么采样已经完成。现在应用抗混叠滤波器已经太晚了。可能存在的最高频率是采样频率的一半("1/2px")。

更加理论化的问题,如果你的采样输入是无限的(更像现实世界)会怎样?

是的,这就是您使用滤波器的时候。首先,您有一个连续函数,就像现实生活中的图像(无限采样率)。然后,您将其过滤以去除所有高于fs / 2的内容,然后以fs进行采样(将图像数字化为像素)。相机实际上不会进行任何过滤,这就是为什么拍摄砖块等物体时会出现莫尔纹理的原因。

alt text

如果您正在进行抗锯齿计算机图形处理,首先必须考虑理想的连续数学函数,并思考如何对其进行滤波和数字化以生成屏幕上的输出。
例如,如果您想要使用计算机生成方波,不能只是简单地在最大值和最小值之间交替。这就像没有先进行滤波而对现实生活中的信号进行采样一样。更高的谐波会回到基带并在频谱中引起许多杂散的尖峰。您需要生成点,就好像它们是从经过滤波的连续数学函数中采样的一样。

alt text


2
适当的方法是使用傅里叶变换(在实践中,是FFT或快速傅里叶变换)。
理论如下:如果您有一组带有颜色/灰度的像素,则可以说该图像由“空间域”中的像素表示;也就是说,每个单独的数字指定了特定空间位置上的图像。
然而,我们真正想要的是在“频率域”中表示图像。每个数字代表整个图像中特定频率的振幅,而不是每个像素的振幅。
将从“空间域”到“频率域”的转换工具是傅里叶变换。FT的输出将是指定不同频率相对贡献的一系列数字。
为了找到最大频率,您执行FT,并查看您获得的高频振幅-然后只需从最高频率向下搜索,直到达到“最小显着振幅”阈值即可。
您可以编写自己的FFT,但在实践中使用预先打包的库(例如FFTW)会更容易。

1

0
我认为你需要的是傅里叶分析( http://en.wikipedia.org/wiki/Fourier_analysis )的应用。我曾学过但从未使用过,所以请谨慎对待。但我认为如果你将其正确地应用于你的一系列数字中,你将得到一系列频率,这些频率是序列的组成部分,然后你可以挑选出最高的那一个。
我无法为你提供完成此任务的代码,但我相信这样的代码一定会存在。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接