使用傅里叶实现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.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
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/394624.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

从零开始手写mmo游戏从框架到爆炸(十五)— 命令行客户端改造

导航:从零开始手写mmo游戏从框架到爆炸(零)—— 导航-CSDN博客 到现在,我们切实需要一个客户端来完整的进行英雄选择,选择地图,打怪等等功能。所以我们需要把之前极为简陋的客户端改造一下。 首先…

0成本部署github前端项目流程

0成本部署github纯前端项目流程 对业内来说应该是一个比较常规的操作,对于新手来说进行过一次应该就很难忘记了,但很多人仍然是不会的,认为部署项目很难,很专业,其实现在由于这些厂商的努力,大众&#xff…

js设计模式:装饰者模式

作用: 可以给原有对象的身上添加新的属性方法 可以让对象或者组件进行扩展 示例: class Person{constructor(name,selfSkill){this.name namethis.selfSkill selfSkill}run 会走路}//所有人类都有的共同特性和技能let wjt new Person(王惊涛,写代码)let mashi new Pers…

Python实现KDJ指标计算:股票技术分析的利器系列(3)

Python实现KDJ指标计算:股票技术分析的利器系列(3) 介绍算法解释 代码rolling函数介绍计算LLV(最低价最小值)和HHV(最高价最大值)计算RSV计算SMA(简单移动平均) 完整代码…

micro-app以UMD js链接方式引入使用

npm 下载好micro-zoe/micro-app后,找到index.umd.js: 新建一个测试html,引入并使用: 参考: 微组件实践 - 掘金

八、计算机视觉-边界填充

文章目录 前言一、原理二、具体的实现 前言 在Python中使用OpenCV进行边界填充(也称为zero padding)是一种常见的图像处理操作,通常用于在图像周围添加额外的像素以便进行卷积或其他操作。下面是使用OpenCV进行边界填充的基本原理和方法 一…

答题抽奖活动怎么做_一场智慧与幸运的碰撞

答题抽奖,知识变现,一场智慧与幸运的碰撞! 在这个信息爆炸的时代,如何吸引人们的注意力,成为每个营销者都需要面对的挑战。而答题抽奖活动,以其独特的魅力,正成为越来越多品牌吸引用户、提升用…

智能无人仓|加快步伐 河北沃克HEGERLS将突破与创新“常态化”

物流的发展涉及工业、商业各个领域,涵盖原材料,生产成品从起点到终点的全过程,在室内物流操作上涵盖了收、发、存、拣等作业。近年来,由于人工成本的提高,基础劳动力取得的难度不断地加大,自动化和智能化逐…

pytest 框架自动化测试

随笔记录 目录 1. 安装 2. 安装pytest 相关插件 2.1 准备阶段 2.2 安装 2.3 验证安装成功 3. pytest测试用例的运行方式 3.1 主函数模式 3.1.1 主函数执行指定文件 3.1.2 主函数执行指定模块 3.1.3 主函数执行某个文件中的某个类、方法、函数 3.1.4 主函数执行生…

『运维备忘录』之 SSH 命令详解

运维人员不仅要熟悉操作系统、服务器、网络等知识,甚至对于开发相关的也要有所了解。很多运维工作者可能一时半会记不住那么多命令、代码、方法、原理或者用法等等。这里我将结合自身工作,持续给大家更新运维工作所需要接触到的知识点,希望大…

C++Qt:noteBookPro_01

一、创建项目 选择Qt Widgets 常用的是QWidgets和MainWindow。两者的区别: QWidgets用于简单的窗口,没有内置的菜单栏、工具栏和状态栏。适用于简单专用的应用程序,不需要复杂的界面组件。 MainWindow是包含完整的菜单栏、工具栏和状态栏的主…

入门级10寸加固行业平板—EM-I10J

亿道信息以其坚固耐用的智能终端设备而闻名,近日发布了一款理想入门级 10 英寸加固平板电脑—I10J。 EM-I10J​​ 这是一款 10 英寸的平板电脑,主要运行 Windows 10操作系统,带有硬化塑料外壳,具有 IP65 防水防尘功能和 MIL-STD 8…

unity学习(19)——客户端与服务器合力完成注册功能(1)入门准备

逆向服务器用了三天的时间,但此时觉得一切都值,又可以继续学习了。 服务器中登录请求和注册请求由command变量进行区分,上一层的type变量都是login。 public void process(Session session, SocketModel model) {switch (model.Command){ca…

nvm安装配置环境

前言 对于前端开发人员来说,多个项目可能用的不同的node版本,如何方便快速的转换版本,nvm版本管理工具的出现,解决这个问题。 实战 1. 搜索nvm版本,我用的1.1.2,下载后直接安装。 2.在d盘建立nvm空文件…

网络IO模型

前言 本篇博客主要讲解一下网络IO模型。我们常见的网络模型分为 阻塞IO模型,非阻塞IO模型,IO复用模型,信号驱动IO模型,异步IO模型。下面我详细的介绍一下这五个IO模型。 阻塞IO模型 ​ 所谓阻塞IO就是当应用A发起读取数据申请时&…

Nginx 正向代理、反向代理

文章目录 前言1. 正向代理1.1 概念1.2 逻辑图1.3 使用场景 2. 反向代理2.1 概念2.2 逻辑图2.3 使用场景 前言 正向代理主要是用来解决访问限制问题;反向代理则是提供负载均衡、安全防护等作用 1. 正向代理 1.1 概念 正向代理是一个位于客户端和目标服务器之间的代理…

红衣大叔讲AI:从OpenAI发布首个视频大模型Sora,谈2024年视觉大模型的十大趋势

OpenAI宣布推出全新的生成式人工智能模型“Sora”。据了解,通过文本指令,Sora可以直接输出长达60秒的视频,并且包含高度细致的背景、复杂的多角度镜头,以及富有情感的多个角色。 OpenAI发布首个视频大模型Sora,一句话生…

CSS-布局-MDN文档学习笔记

CSS布局 查看更多学习笔记:GitHub:LoveEmiliaForever MDN中文官网 介绍CSS布局 正常布局流简介 正常布局流是指在不对页面进行任何布局控制时,浏览器默认的 HTML 布局方式 当你使用 css 创建一个布局时,你正在离开正常布局流 …

引入成熟的Pytest自动化测试框架

虽然我们能使用脚本编写自动化测试框架,但没有必要重复找车轮子,引入成熟的自动化测试框架即可, Pytest是目前最成熟、功能最全面的Python测试框架之一,简单灵活、易于上手,可完全兼容其他测试框架如unitest&#xff…

简单介绍数据结构的基本概念

数据结构的基本概念 常用术语 数据 数据(Data)是客观事物的符号表示,是所有能输入到计算机中并被计算机程序处理的符号的总称。例如:整数、字符串、图形、图像、声音和动画等 数据元素 数据元素(Data Element&…