当前位置: 首页 > news >正文

使用傅里叶实现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%的低频,仍旧能够复原识别度较高的原始图像。

傅里叶变换是一种用于分析不同频率成分的数学工具。它可以将一个复杂的信号分解为一系列简单的正弦波或余弦波,这些简单波形的频率、振幅和相位结合起来可以重建原始信号。基本原理是任何周期性信号都可以表示为不同频率的正余弦波的组合。

以一个通俗易懂的例子说明:

想象一个乐队正准备演奏一首曲子,乐队中的每种乐器代表一种特定的频率。当乐队一起演奏时,我们所听到的音乐是所有乐器声音的叠加,这就相当于一个复杂的“信号”。如果我们找不出每个乐器各自的声音,就很难分析每个乐器的贡献和特点。傅里叶变换就像是一个音乐天才,能够准确地辨识出每种乐器的声音,并告诉我们每种的音高(频率)、音量(振幅)以及它们开始的时间点(相位)。这样我们就能了解哪些乐器在此曲目中起到了主导作用,哪些则只是在背景中轻轻衬托。

傅里叶变换的应用领域广泛,主要包括:

  1. 信号处理:在通信系统中,用来分析各种信号的频率成分,对信号进行压缩、滤波和噪音减少。

  2. 图像处理:在图像分析中,用傅里叶变换来辨识图像中的频率成分,进行图像增强、边缘检测、图像压缩和去噪。

  3. 音频分析:在音频工程中,对音乐和其他声音进行频谱分析,进行声音编辑、降噪和音质改善等。

  4. 地震学:用于分析地震信号,帮助确定地震波的频率和能量分布等。

  5. 量子物理:在量子力学中,波函数的傅里叶变换可以用来找到粒子的位置和动量的概率分布。

  6. 天文学:分析从天体收集的各种光谱和辐射信号,以获得关于其性质和组成的信息。

  7. 医学成像:MRI和CT扫描等技术中,傅里叶变换用于从原始扫描数据中重建图像。

傅里叶变换可以说是现代科学与工程中最为重要的工具之一,为我们理解和操作不同的物理现象提供了一种有效的数学手段。

相关知识点

理解并实现OpenCV中的图像平滑技术

OpenCV中的边缘检测技术及实现

OpenCV识别人脸案例实战

入门OpenCV:图像阈值处理

参考文献

1、OpenCV轻松入门
李立宗,OpenCV轻松入门,电子工业出版社,2023
在这里插入图片描述

2、计算机视觉40例
李立宗,计算机视觉40例,电子工业出版社,2022
在这里插入图片描述

相关文章:

  • 【TCP/IP】组播
  • WPF 控件禁用时,显示悬浮提示
  • http协议工具:apache详解
  • 数学建模:BP神经网络(含python实现)
  • geoserver 热力图样式
  • 从kafka如何保证数据一致性看通常数据一致性设计
  • 利用LaTex批量将eps转pdf、png转eps、eps转png、eps转svg
  • 这才开工没几天收到Offer了,简历改的好,找工作没烦恼。
  • 基于ant的图片上传组件封装(复制即可使用)
  • 2个wordpress优化SEO主题模板
  • TypeScript基础知识点
  • 捕捉消费新趋势,脉纷纷让生活更便捷
  • 学习鸿蒙基础(4)
  • python加载模块
  • 【工具类】开源照片管理工具pthtoprism
  • 2018以太坊智能合约编程语言solidity的最佳IDEs
  • canvas绘制圆角头像
  • Java 多线程编程之:notify 和 wait 用法
  • nginx 配置多 域名 + 多 https
  • Promise面试题2实现异步串行执行
  • python学习笔记-类对象的信息
  • redis学习笔记(三):列表、集合、有序集合
  • vue-router的history模式发布配置
  • WordPress 获取当前文章下的所有附件/获取指定ID文章的附件(图片、文件、视频)...
  • Work@Alibaba 阿里巴巴的企业应用构建之路
  • 创建一种深思熟虑的文化
  • 电商搜索引擎的架构设计和性能优化
  • 检测对象或数组
  • 马上搞懂 GeoJSON
  • 如何用vue打造一个移动端音乐播放器
  • ​LeetCode解法汇总2696. 删除子串后的字符串最小长度
  • # 日期待t_最值得等的SUV奥迪Q9:空间比MPV还大,或搭4.0T,香
  • #if 1...#endif
  • #pragma data_seg 共享数据区(转)
  • $.extend({},旧的,新的);合并对象,后面的覆盖前面的
  • (10)工业界推荐系统-小红书推荐场景及内部实践【排序模型的特征】
  • (备忘)Java Map 遍历
  • (附源码)spring boot车辆管理系统 毕业设计 031034
  • (附源码)spring boot建达集团公司平台 毕业设计 141538
  • (剑指Offer)面试题34:丑数
  • (转) ns2/nam与nam实现相关的文件
  • *** 2003
  • [ 英语 ] 马斯克抱水槽“入主”推特总部中那句 Let that sink in 到底是什么梗?
  • [C#][DevPress]事件委托的使用
  • [C#]手把手教你打造Socket的TCP通讯连接(一)
  • [c]统计数字
  • [C++]类和对象【下】
  • [Contiki系列论文之2]WSN的自适应通信架构
  • [CTO札记]如何测试用户接受度?
  • [Docker]十一.Docker Swarm集群raft算法,Docker Swarm Web管理工具
  • [Docker]五.Docker中Dockerfile详解
  • [EFI]Atermiter X99 Turbo D4 E5-2630v3电脑 Hackintosh 黑苹果efi引导文件
  • [FROM COM张]如何解决Nios II SBTE中出现的undefined reference to `xxx'警告
  • [Java性能剖析]Sun JDK基本性能剖析工具介绍
  • [leetcode 双指针]