如何从CImg库的get_FFT()接口获取图像FFT的第三维度数值?
CImg库FFT数值获取问题解答
认知误区修正
你提到的「FFT值是256×256×3的三维复数数组」存在概念混淆:这里的第三维实际是彩色图像的通道维度,如果你的输入是单通道灰度图,维度就是256×256×1,如果是RGB三通道彩色图才是256×256×3,和复数的实部/虚部没有关系。
CImg的get_FFT()接口返回的CImgList<float>固定包含2个同尺寸的CImg对象:fft[0]存储所有通道FFT结果的实部,fft[1]存储所有通道FFT结果的虚部,两个对象的维度和输入图像完全对齐。
当前代码存在的问题
你的代码目前有两处错误,导致拿不到完整的FFT结果:
- 循环变量逻辑错误:外层循环定义变量
x,却用y<w0作为判断条件,内层循环定义变量y,却用x<h0作为判断条件,运行会出现数组越界报错。 - 未遍历通道维度:你取值时只用了
fft[0](x,y),这种写法默认只取第0通道的数值,输入如果是三通道图,就漏掉了第1、2通道的结果,也就是你说的「第三维度数值」。
正确实现方式
你可以参考如下修正后的代码,完整获取所有通道的FFT复数值:
#include "CImg.h" #include <iostream> using namespace cimg_library; int main(int argc, char * argv[]) { const char *input_file = "Lenna.png"; // 注意补全文件后缀 CImg<unsigned char> input(input_file); // 获取FFT结果,fft[0]为实部,fft[1]为虚部 CImgList<float> fft = input.get_FFT(); int width = fft[0].width(); int height = fft[0].height(); int spectrum = fft[0].spectrum(); // 通道数,单通道为1,RGB为3 printf("FFT结果尺寸:宽%d, 高%d, 通道数%d\n", width, height, spectrum); int count = 1; // 遍历每个像素的x、y坐标,以及每个通道c for (int x = 0; x < width; x++) { for (int y = 0; y < height; y++) { for (int c = 0; c < spectrum; c++) { float real = fft[0](x, y, 0, c); // 第三个参数0为深度,2D图像固定为0 float imag = fft[1](x, y, 0, c); std::cout << count << ", 通道" << c << ": " << real << "+j" << imag << std::endl; count++; } } } return 0; }
补充说明
- 如果你的输入是单通道灰度图,
spectrum值为1,不会有第三维度;如果是RGB三通道图,spectrum值为3,新增第三层循环遍历通道索引c即可拿到你所说的「第三维度数值」。 - 保存FFT实部虚部为jpg格式会丢失精度,建议保存为浮点型的tif格式或者直接导出数值文件用于后续计算。
内容的提问来源于stack exchange,提问作者SVJ
相关产品推荐
相关产品推荐

