- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我使用 fftw_plan_dft_2d()
获取图像的二维 FFTW 输出。据我了解,输出表示复数的二维数组(宽度 x 高度)。
有人可以向我解释我应该如何解释这个数组吗?每个点代表什么?每个点的值代表什么?
如果我想应用高通滤波器,我该怎么做?我尝试了下面的代码,但是当我进行反向 FFT 时,我得到的只是重叠的移位图像。
for (y = 0; y < height; y++)
{
for (x = 0; x < width; x++)
{
xx = ABS(x - width / 2);
yy = ABS(y - height / 2);
if (sqrt(xx * xx + yy * yy) > width / 2)
{
fft[y * width + x][0] = 0;
fft[y * width + x][1] = 0;
}
}
最佳答案
FFT 将空间域(x 和y)中的图像转换为频域。在空间域中,每个点代表一个像素,其大小代表像素的颜色。而在频域中,每个点代表一个频率,其大小是该频率对图像的贡献。幅度的强弱决定了该频率贡献的强弱。
另一种看待 FFT 的方式是将图像分解为不同频率的正弦和余弦分量。
fftw_plan_dft_2d()
的结果当您使用 fftw_plan_dft_2d()
和 fftw_execute()
将 2D FFT 应用于图像时,生成的输出将是图像的频谱。 0Hz对应的直流分量会出现在out[0]
中,而高频分量会出现在out[N-1]
中> 其中 N = n x m 和 n 是 x 方向上的像素数,m 是数量y 方向的像素数。
FFTW 的输出与通常绘制的图像形成对比,其中直流分量 (0Hz) 通常位于图像的中心,如下所示,并且频率随着您的变化呈放射状增加远离中心。
应用于 FFT 输出以使其直流分量居中的典型方法是使用名为 fftshift()
的函数。它在 MATLAB 中定义或 Octave并且有一个 discussion on converting它到C/C++ on StackOverflow .
应用fftshift()
后,应用高通(或任何其他类型的)filter 就变得微不足道了。到 FFT 输出。高通滤波器只允许高频通过,可以用
for (int i = 0; i < n; ++i) {
for (int j = 0; j < m; ++j) {
int index = i + j*m;
double x = i*dx;
double y = i*dy;
if (sqrt(x*x + y*y) < radius) { // All frequencies in radius deleted
fft[index][0] = 0;
fft[index][1] = 0;
}
}
}
FFTW 计算非标准化的 FFT 和 IFFT,因此当您执行 IFFT 时,您需要乘以 1/N 因子才能返回原始图像。
关于c - 如何在 fftw 输出上应用频率滤波器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32664476/
我是一名优秀的程序员,十分优秀!