使用NumPy和OpenCV进行图像频域处理:低频移中与频谱可视化

这篇博客介绍了如何使用NumPy和OpenCV对图像进行频域处理,特别是低频移中操作。我们还将学习如何可视化图像的频谱。

**代码示例:**pythonimport cv2import numpy as npfrom matplotlib import pyplot as plt%matplotlib inline%config InlineBackend.figure_format='retina'plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签plt.rcParams['axes.unicode_minus']=False #用来正常显示负号

img = cv2.imread(r'peppers.bmp',0)m, n = img.shapef = np.fft.fft2(img)fshift = np.fft.fftshift(f)fmax = np.max(np.abs(fshift))u0, v0 = m // 2, n // 2

u1 = u0 - 10v1 = v0 - 5fshift[v1, u1] = fmax / 5u2 = u0 + 10v2 = v0 + 5fshift[v2, u2] = fmax / 5f1 = np.fft.ifftshift(fshift)img1 = abs(np.fft.ifft2(f1)) #重构图像plt.figure(figsize=(20,10))plt.imshow(img1, cmap = 'gray') #显示滤波后幅值谱plt.axis('off')plt.show()print(m,n,u0,v0)print(u1,v1,u2,v2)plt.figure(figsize=(20,10))plt.imshow(20*np.log(1+abs(fshift)), cmap = 'gray')plt.show()

代码解释:

  1. 导入必要的库: 首先,我们导入 cv2 用于图像处理,numpy 用于数值计算,以及 matplotlib.pyplot 用于绘图。2. 加载图像: 使用 cv2.imread() 函数加载灰度图像。3. 傅里叶变换: 使用 np.fft.fft2() 函数对图像进行二维快速傅里叶变换,将图像从空间域转换到频域。4. 频谱移中: 使用 np.fft.fftshift() 函数将频谱的零频率分量移动到图像中心,方便观察。5. 低频移中: 代码中将两个低频分量的幅值设置为原始幅值的1/5,这模拟了低频滤波的效果。6. 逆变换: 使用 np.fft.ifftshift() 函数将频谱移回原始位置,然后使用 np.fft.ifft2() 函数进行逆傅里叶变换,将图像从频域转换回空间域。7. 获取幅值: 使用 abs() 函数获取逆变换结果的幅值,得到重构图像。8. 可视化: 使用 plt.imshow() 函数显示重构图像和处理后的频谱的对数幅值图像。

绝对值处理的重要性:

代码中的 img1 = abs(np.fft.ifft2(f1)) 使用绝对值函数处理逆变换的结果,这是因为频域滤波后的结果通常是复数。我们只对图像的振幅信息感兴趣,所以使用绝对值函数去除结果中的虚部,得到真实的图像幅值信息。

总结:

这段代码演示了如何使用NumPy和OpenCV进行基本的图像频域处理,包括傅里叶变换、低频移中和逆变换。同时,我们也学习了如何可视化图像的频谱,并理解了绝对值处理在重构图像时的重要性。

使用NumPy和OpenCV进行图像频域处理:低频移中与频谱可视化

原文地址: https://www.cveoy.top/t/topic/r6r 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录