OpenCV C++中傅里叶逆变换无法还原原图像问题求助
问题分析与解决办法
你的核心问题出在三个地方:补零填充未裁剪、缺少IDFT缩放步骤、归一化的时机和范围不匹配,具体拆解:
1. 补零填充后的尺寸未裁剪
你用getOptimalDFTSize给L通道补了零,让尺寸变成DFT最优大小,但IDFT后得到的图像是补零后的尺寸(比原L通道大),直接显示的话会包含边缘的黑色补零区域,这和原L通道的尺寸、内容都不一样。
2. IDFT缺少缩放步骤
OpenCV的dft在逆变换时默认不会自动缩放结果,需要加上DFT_SCALE标志,否则输出的数值会是原图像的rows*cols倍(因为DFT的数学定义里逆变换需要除以元素总数),导致数值范围严重偏离原L通道的0-255。
3. 归一化的问题
原L通道是8位无符号整数(0-255),而IDFT后的结果是浮点型,你直接归一化到0-1后显示,虽然imshow会把0-1映射到0-255,但因为前面两个问题没解决,结果还是不对。
修正后的代码
// MARK: Split LAB Channel each cv::Mat lab_resized_host_image; cv::cvtColor(resized_host_image, lab_resized_host_image, cv::COLOR_BGR2Lab); imshow("lab_resized_host_image", lab_resized_host_image); std::vector<cv::Mat> channel_LAB_host_image(3); cv::split(lab_resized_host_image, channel_LAB_host_image); cv::Mat channel_L_host_image = channel_LAB_host_image[0]; imshow("channel_L_host_image", channel_L_host_image); // MARK: DFT the channel_L host image. cv::Mat padded_L; int rows_L = getOptimalDFTSize(channel_L_host_image.rows); int cols_L = getOptimalDFTSize(channel_L_host_image.cols); copyMakeBorder(channel_L_host_image, padded_L, 0, rows_L - channel_L_host_image.rows, 0, cols_L - channel_L_host_image.cols, BORDER_CONSTANT, Scalar::all(0)); Mat planes_L[] = {Mat_<float>(padded_L), Mat::zeros(padded_L.size(), CV_32F)}; Mat complexI_L; merge(planes_L, 2, complexI_L); dft(complexI_L, complexI_L); // MARK: iDFT Channel_L. Mat complexI_channel_L_idft; // 加上DFT_SCALE做缩放,同时保留DFT_REAL_OUTPUT cv::dft(complexI_L, complexI_channel_L_idft, cv::DFT_INVERSE | cv::DFT_REAL_OUTPUT | cv::DFT_SCALE); // 裁剪回原L通道的尺寸 cv::Mat idft_cropped = complexI_channel_L_idft(cv::Rect(0, 0, channel_L_host_image.cols, channel_L_host_image.rows)); // 转换回8位无符号整数,匹配原L通道的格式和范围 cv::Mat idft_result; idft_cropped.convertTo(idft_result, CV_8U); imshow("IDFT恢复的L通道", idft_result);
验证方法
你可以计算原L通道和恢复后图像的均方误差(MSE),如果接近0就说明恢复正确:
double mse = cv::norm(channel_L_host_image, idft_result, cv::NORM_L2) / (channel_L_host_image.rows * channel_L_host_image.cols); std::cout << "MSE: " << mse << std::endl;
内容的提问来源于stack exchange,提问作者Hyun Bin CHo
相关产品推荐
相关产品推荐

