OpenCV逆傅里叶变换复原灰度图像出现严重失真问题求解
问题原因
你的代码存在3处明确错误,直接导致输出图像失真:
- 冗余逻辑无意义:你提前合并实部虚部生成了
complexI,但正向傅里叶变换时输入的是单通道灰度图gray_in,该操作未实际生效,虽不直接报错但属于无效代码。 - 通道转换错误:逆变换时你指定了
DFT_REAL_OUTPUT参数,输出结果为单通道32位浮点数,你强制将其转换为CV_32FC2双通道格式,导致OpenCV读写图像时通道解析完全错乱,是失真的核心诱因。 - 浮点图像适配错误:OpenCV的
imshow对32位浮点图像默认取值范围为[0,1],而逆变换输出的数值范围为原灰度图的[0,255],直接显示会出现全白过曝;imwrite也不支持普通图像格式的32位浮点多通道存储,需要先转成8位无符号单通道格式。
修正后可运行代码
// 转换为灰度图 cvtColor(src, gray_in, COLOR_BGR2GRAY); gray_in.convertTo(gray_in, CV_32FC1); // 执行正向傅里叶变换,直接输出复数结果 Mat complexI; dft(gray_in, complexI, DFT_COMPLEX_OUTPUT); // 执行逆傅里叶变换,输出单通道实数结果 Mat tgt; dft(complexI, tgt, DFT_SCALE | DFT_INVERSE | DFT_REAL_OUTPUT); // 转换为8位单通道整型,适配显示和保存要求 tgt.convertTo(tgt, CV_8UC1); // 保存并显示结果 imwrite(outfile, tgt); namedWindow(windowName); imshow(windowName, tgt); waitKey(0); destroyWindow(windowName);
修正后直接运行即可得到和原图一致的输出结果。
内容的提问来源于stack exchange,提问作者Robby Czajkowski
相关产品推荐
相关产品推荐

