如何以周期/视角报告典型空间频率巴特沃斯滤波器的结果?

How can I report the outcome of the typical spatial frequency Butterworth filter in cycles / degree of visual angle?

我正在使用来自该站点的代码进行空间频率过滤。

https://www.djmannion.net/psych_programming/vision/sf_filt/sf_filt.html

堆栈交换上有类似的代码。我想知道的是,当我报告它时,如何将 Butterworth 滤波器中使用的截止值(从 0 到 1 的数字)转换为图像中的周期/度数。我觉得我错过了一些明显的东西。我想这与图像对向的视角和分辨率有关。

心理学软件中常用于从图像中过滤空间频率的巴特沃斯滤波器通常用作低通或高通滤波器,其截止值介于 0 和 1 之间。该值将是过滤器的 50% 切割点。例如,如果它是低通,截止频率以下 50% 或更多的频率将保留在图像中,截止频率以上的频率将保留 50% 或更少。高通设置则相反。它确实在截止点附近急剧上升,因此最好使用截止点来描述过滤后的图像。

那么,截止值是多少,它意味着什么?它只是 cycles/pixel 中最大频率的一部分。一旦知道最大值就很容易推导出来,事实证明最大值是一个常数。假设您的图像是 128x128。在 128 个像素中,您可以有 64 个周期的最大频率,或 0.5 cycles/pixel。查看 numpy 或 matlab 中的 fftfreq 函数会发现最大值始终为 0.5 cycles/pixel。这是有道理的,因为一个周期需要两个像素。这意味着 0.2 的截止值将是 0.1 cycles/pixel。无论您选择什么截止点,您都可以将其分成两半,这就是 cycles/pixel。您需要做的就是将其缩放到 cycles/degree.

一旦您知道以视角度数表示的图像大小,就可以将周期数/像素转换为周期数/视角度数。例如,如果某人的眼睛与高度为 h 的图像的距离为 d,则图像将跨越 2 * atan( (h/2) / d) 度的视角(假设您的 atan 函数报告的是度数而不是弧度,您可以必须转换)。将图像中的像素数除以以度为单位的总跨度以获得像素/度。然后将频率(周期数/像素)乘以像素数/度数得到周期数/度数。

下面的伪代码等式版本:

cycles/pixel = cutoff * 0.5
d = distance_from_image_in_cm
h = height_of_image_in_cm
degrees_of_visual_angle = 2 * atan( (h/2) / d)
pixels/degree = total_pixels / degrees_of_visual_angle
cycles/degree = cycles/pixel * pixels/degree