You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用FFT与IFFT实现图像模糊时输出黑屏,求错误排查

图像模糊程序错误分析与修正

问题现象

编写的图像模糊程序未输出预期的模糊图像,反而得到带有若干白点的黑屏。代码流程如下:读取灰度图像,创建3×3均值核(误表述为高斯核),对核进行零填充后执行np.fft.ifft;随后将图像的FFT结果与核的FFT结果相乘,再执行np.fft.ifft2并取实部得到滤波结果。

代码中的错误

  • 核的频域转换逻辑完全错误:对填充后的二维核执行了一维逆FFT(np.fft.ifft),违背频域滤波的基本逻辑。频域滤波需要将空域核转换到频域,应该使用二维FFT(np.fft.fft2),而非逆FFT操作。
  • 缺少结果归一化处理:np.fft.ifft2输出的实部结果数值范围通常不在0-255区间内,cv2.imshow默认按uint8格式显示,超出范围的数值会被强制截断,最终导致黑屏或白点异常。

修正后的完整代码

import numpy as np
import cv2

# 读取灰度图像
im1 = cv2.imread('beato.jpg', 0)
cv2.imshow('Original Image', im1)
cv2.waitKey(0) 

# 创建3×3均值核
kernel = np.ones((3,3)) / 9
# 计算填充尺寸,将核扩展至与图像同尺寸
sz = (im1.shape[0] - kernel.shape[0], im1.shape[1] - kernel.shape[1])
# 对称填充,保证核中心与图像中心对齐
kernel_padded = np.pad(kernel, (((sz[0]+1)//2, sz[0]//2), ((sz[1]+1)//2, sz[1]//2)), 'constant')

# 对图像和填充后的核分别执行二维FFT
im_fft = np.fft.fft2(im1)
kernel_fft = np.fft.fft2(kernel_padded)

# 频域相乘后做逆FFT,取实部得到空域结果
filtered = np.real(np.fft.ifft2(im_fft * kernel_fft))

# 将结果归一化到0-255区间,转换为uint8格式适配显示
filtered = cv2.normalize(filtered, None, 0, 255, cv2.NORM_MINMAX, dtype=cv2.CV_8U)

# 显示模糊后的图像
cv2.imshow('Blurred Image', filtered)
cv2.waitKey(0)
cv2.destroyAllWindows()

内容的提问来源于stack exchange,提问作者levgor

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 17:10:24