使用傅里叶实现100倍的压缩效果(附Python源码)
傅里叶变换(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.shapecrow, ccol = rows // 2 , cols // 2mask = 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] = 1return f_data * maskf_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%的低频,仍旧能够复原识别度较高的原始图像。
傅里叶变换是一种用于分析不同频率成分的数学工具。它可以将一个复杂的信号分解为一系列简单的正弦波或余弦波,这些简单波形的频率、振幅和相位结合起来可以重建原始信号。基本原理是任何周期性信号都可以表示为不同频率的正余弦波的组合。
以一个通俗易懂的例子说明:
想象一个乐队正准备演奏一首曲子,乐队中的每种乐器代表一种特定的频率。当乐队一起演奏时,我们所听到的音乐是所有乐器声音的叠加,这就相当于一个复杂的“信号”。如果我们找不出每个乐器各自的声音,就很难分析每个乐器的贡献和特点。傅里叶变换就像是一个音乐天才,能够准确地辨识出每种乐器的声音,并告诉我们每种的音高(频率)、音量(振幅)以及它们开始的时间点(相位)。这样我们就能了解哪些乐器在此曲目中起到了主导作用,哪些则只是在背景中轻轻衬托。
傅里叶变换的应用领域广泛,主要包括:
-
信号处理:在通信系统中,用来分析各种信号的频率成分,对信号进行压缩、滤波和噪音减少。
-
图像处理:在图像分析中,用傅里叶变换来辨识图像中的频率成分,进行图像增强、边缘检测、图像压缩和去噪。
-
音频分析:在音频工程中,对音乐和其他声音进行频谱分析,进行声音编辑、降噪和音质改善等。
-
地震学:用于分析地震信号,帮助确定地震波的频率和能量分布等。
-
量子物理:在量子力学中,波函数的傅里叶变换可以用来找到粒子的位置和动量的概率分布。
-
天文学:分析从天体收集的各种光谱和辐射信号,以获得关于其性质和组成的信息。
-
医学成像:MRI和CT扫描等技术中,傅里叶变换用于从原始扫描数据中重建图像。
傅里叶变换可以说是现代科学与工程中最为重要的工具之一,为我们理解和操作不同的物理现象提供了一种有效的数学手段。
相关知识点
理解并实现OpenCV中的图像平滑技术
OpenCV中的边缘检测技术及实现
OpenCV识别人脸案例实战
入门OpenCV:图像阈值处理
参考文献
1、OpenCV轻松入门
李立宗,OpenCV轻松入门,电子工业出版社,2023
2、计算机视觉40例
李立宗,计算机视觉40例,电子工业出版社,2022