傅里叶变换(Fourier Transform)是一种将一个函数(在时间或空间域)转换为另一个函数(在频率域)的数学变换方法。它在信号处理、图像处理、通信等领域有广泛应用。
实现过程
将傅里叶系数核心的1%保留,其余全部删除。
然后利用这留下的1%复原原始图像,得到相对清晰的原始图像。显示原始图像,傅里叶、仅保留1%的傅里叶,复原图像。
Python实现
本部分我们使用Python实现这一过程,并观察实际的结果。
Python实现代码
# -*- coding: utf-8 -*-
"""
Created on Sun Feb 18 18:09:22 2024
@author: 李立宗
公众号:计算机视觉之光
知识星球:计算机视觉之光
"""
# -*- coding: utf-8 -*-
"""
Created on Sun Feb 18 18:09:22 2024
@author: 李立宗
公众号:计算机视觉之光
知识星球:计算机视觉之光
"""
import numpy as np
from PIL import Image
import matplotlib.pyplot as plt
# 步骤1 - 加载并显示原始图像
original_image = Image.open('lena.bmp').convert('L') # 将图像转换为灰度
plt.figure(figsize=(6, 6))
plt.imshow(original_image, cmap='gray')
plt.title('Original Image')
plt.show()
# 步骤2 - 计算图像的二维傅里叶变换,并中心化
f_transform = np.fft.fft2(original_image)
f_shifted = np.fft.fftshift(f_transform)
magnitude_spectrum = 20*np.log(np.abs(f_shifted))
plt.figure(figsize=(6, 6))
plt.imshow(magnitude_spectrum, cmap='gray')
plt.title('Magnitude Spectrum')
plt.show()
# 步骤3 - 保留傅里叶变换系数核心的1%
def keep_central_percentage(f_data, percentage=0.01):
# 创建一个只有中心1%区域是1, 其余是0的掩模
rows, cols = f_data.shape
crow, ccol = rows // 2 , cols // 2
mask = np.zeros((rows, cols), np.uint8)
mask[crow-int(rows*np.sqrt(percentage))//2:crow+int(rows*np.sqrt(percentage))//2, ccol-int(cols*np.sqrt(percentage))//2:ccol+int(cols*np.sqrt(percentage))//2] = 1
return f_data * mask
f_central = keep_central_percentage(f_shifted)
magnitude_spectrum_central = 20*np.log(np.abs(f_central))
plt.figure(figsize=(6, 6))
plt.imshow(magnitude_spectrum_central, cmap='gray')
plt.title('Central 1% Magnitude Spectrum')
plt.show()
# 步骤4 - 使用逆变换复原图像
f_ishifted = np.fft.ifftshift(f_central)
img_back = np.fft.ifft2(f_ishifted)
img_back = np.abs(img_back)
plt.figure(figsize=(6, 6))
plt.imshow(img_back, cmap='gray')
plt.title('Reconstructed Image from 1% Coefficients')
plt.show()
代码分析
在这段代码中,keep_central_frequency函数用于创建掩码,在中心周围创建一个指定百分比的圆形区域,并将这个区域外的部分置零。请务必替换代码中的img_path变量值为你将要处理的图像的实际路径。
注意:傅里叶变换的结果(fshift)是复数数组,而掩码是实数数组。当我们实行点乘运算时,只有那些直径中心周围特定百分比的傅里叶系数被保留下来。之后,我们执行逆傅里叶变换并取其绝对值来得到重建后的图像。
最后,使用matplotlib库来显示图像,其中包括原始图像、傅里叶变换的幅度谱、只保留中心1%频率后的幅度谱比和由1%的傅里叶系数重建的图像。这里使用了cmap='gray’来展示灰度图像。
过程及结果显示
下面是原始图像及对应的傅里叶变换图谱
下面是1%的低频信号,复原图像:
结论
从上述变化您可以看到,即使仅仅保留1%的低频,仍旧能够复原识别度较高的原始图像。
相关知识点
理解并实现OpenCV中的图像平滑技术
OpenCV中的边缘检测技术及实现
OpenCV识别人脸案例实战
入门OpenCV:图像阈值处理
参考文献
1、OpenCV轻松入门
李立宗,OpenCV轻松入门,电子工业出版社,2023
2、计算机视觉40例
李立宗,计算机视觉40例,电子工业出版社,2022