从 FFT 中提取清晰度

信息处理 fft
2022-02-07 11:56:36

我总共有 6 张图像,来自 2 个摄像头(因此每个摄像头 3 个)存储 16 位数据。

我需要向用户反馈的就像某种锐度系数,最好是在他调整整个系统的焦点时直播(因为它是看着眼睛的,这取决于患者的屈光度)。

我目前使用的是与标准偏差相结合的对比度系数,它应该可以正常工作,但是随着焦点的变化,视野会发生轻微变化,这会影响对比度。

现在我想知道当我开始使用 FFTW 库来获取图像的 FFT 时,它会产生一个 fftw_complex 数组(它是 double[2])。

就我的目的而言,计算结果数组的平均值应该没问题,但我不明白如何在其中破坏真实/复杂的组件。我是否遍历整个数组,计算等于 double[0] 和 double[1] 之和的总和,还是我在这里完全错了?我真的不明白为什么会有一个真实而复杂的组件。我知道 FFT 会产生不同频率正弦波的系数,但波的频率取决于它在阵列中的位置,而幅度应该是实部。实数和复数变量的组合是否负责图像中的方向,或者它用于什么,我将如何使用它来了解图像中的“平均”频率(锐度)?

1个回答

正如您所说,在傅立叶变换中,波的频率取决于它在数组中的位置。但是,波的幅度并不总是实部,它实际上是复数的幅度()。real2+imaginary2

如果您的初始图像沿精确中心完全对称,您可以获得真实系数,但它很少出现在图像分析中。

编辑:这里有更多细节......找不到我所指的图片......

离散傅里叶变换是每个 FFT 算法的基础,定义如下:

Xk=n=0N1xnei2πkn/N

根据欧拉公式,复指数可以分离为余弦和正弦的复数之和:

eix=cos(x)+isin(x)

如果我们现在回顾傅里叶变换,它可以分为两个和: 作为旁注,如果您的图像(或信号)关于其中心完全对称,则余弦将与您的图像产生强烈共鸣,同时窦不会输出任何东西。它将产生一个完全真实的图像。对于完全反对称的信号,其中一半是另一半的负数,情况正好相反。

Xk=n=0N1xncos(2πkn/N)+in=0N1xnsin(2πkn/N)

现在知道了这一点,使用我在第一段中给出的公式可以直接计算得到的 FFT 的幅度。

要获得图像本身的频率就不太明显了。我们希望结果看起来有点像这样,中心是零频率分量。然而,事实并非如此。 移位 fft

“标准” FFT 算法会将零频率分量放在一个角落(我不记得是左上角还是左下角!),使得数组索引 [0,0] 对应于 . 但是等等,一旦你越过 N/2,像素就代表负频率,倒数。一个很好的提醒是 Python 的 scipy.fftpack.fftfreq() 函数fftfreq()kx=ky=0

我个人的快速查看图像光谱的技巧是移动它然后显示它的对数。当它不移动时,很难看到不对称。在查看非日志版本时,通常只是一个黑色的大方块,上面有一个模糊的灰色小点......