gpt4 book ai didi

c++ - 图像的 FFT

转载 作者:搜寻专家 更新时间:2023-10-31 00:49:35 27 4
gpt4 key购买 nike

我有一个关于 fftw 的作业,我试图编写一个小程序来创建图像的 fft。我正在使用 CImg 来读取和写入图像。但我得到的只是一张带有单个白点的深色图像:(

我很可能以错误的方式执行此操作,如果有人可以解释应该如何完成,我将不胜感激。我不需要代码,我只需要知道执行此操作的正确方法是什么。

这是我的代码:

CImg<double> input("test3.bmp");
CImg<double> image_fft(input, false);

unsigned int nx = input.dimx(), ny = input.dimy();
size_t align = sizeof(Complex);

array2<Complex> in (nx, ny, align);

fft2d Forward(-1, in);

for (int i = 0; i < input.dimx(); ++i) {
for (int j = 0; j < input.dimy(); ++j) {
in(i,j) = input(i,j);
}
}

Forward.fft(in);

for (int i = 0; i < input.dimx(); ++i) {
for (int j = 0; j < input.dimy(); ++j) {
image_fft(i,j,0) = image_fft(i,j,1) = image_fft(i,j,2) = std::abs(in(i,j));
}
}

image_fft.normalize(0, 255);
image_fft.save("test.bmp");

最佳答案

您需要对震级进行对数。单个白点是基值(0 Hz,DC,随便你怎么调用它),所以它几乎总是你拍摄的任何图像的最大组成部分(因为像素值不能为负,DC 值将始终为正且大)。

您需要做的是计算每个点的幅度(所以在您从复数形式转换为幅度/相位形式(相量表示法 iirc?)之后)的对数(ln,无论如何,某种对数计算)在对其进行归一化之前。

请注意,这些值在那里,与 DC 值相比它们真的很小,取对数(这会使较小的值变大很多,而较大的值只会稍微变大)将使其他频率可见。

关于c++ - 图像的 FFT,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1114324/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com