使用傅里叶实现100倍的压缩效果(附Python源码)

这篇具有很好参考价值的文章主要介绍了使用傅里叶实现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’来展示灰度图像。

过程及结果显示

下面是原始图像及对应的傅里叶变换图谱
使用傅里叶实现100倍的压缩效果(附Python源码),计算机视觉,计算机视觉,opencv,人工智能,python
下面是1%的低频信号,复原图像:
使用傅里叶实现100倍的压缩效果(附Python源码),计算机视觉,计算机视觉,opencv,人工智能,python

结论

从上述变化您可以看到,即使仅仅保留1%的低频,仍旧能够复原识别度较高的原始图像。

相关知识点

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

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

OpenCV识别人脸案例实战

入门OpenCV:图像阈值处理

参考文献

1、OpenCV轻松入门
李立宗,OpenCV轻松入门,电子工业出版社,2023
使用傅里叶实现100倍的压缩效果(附Python源码),计算机视觉,计算机视觉,opencv,人工智能,python

2、计算机视觉40例
李立宗,计算机视觉40例,电子工业出版社,2022
使用傅里叶实现100倍的压缩效果(附Python源码),计算机视觉,计算机视觉,opencv,人工智能,python文章来源地址https://www.toymoban.com/news/detail-829046.html

到了这里,关于使用傅里叶实现100倍的压缩效果(附Python源码)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Python 傅里叶变换 Fourier Transform

    flyfish 一图胜千言 Fast Fourier Transform (FFT) 快速傅里叶变换 快速傅里叶逆变换 p e r i o d = 1 f r e q u e n c y period = frac{1}{frequency} p er i o d = f re q u e n cy 1 ​ 因为1、3、7相对2000,在坐标轴上太小把上述代码freq_feature 改成100,300,700更容易看出特点 继续绘制freq_feature =1、3、7的傅里叶变

    2024年02月20日
    浏览(37)
  • 傅里叶变换及应用python版(2)

    欢迎关注公众号:sumsmile /专注图形学 起初,只是想弄清楚2D图像的频谱图的含义,没想到越肝越深,前后肝了一个多月。 接《傅里叶变换及应用python版(1)》,这篇主要讲代码,通过几个典型的案例,直观的理解傅里叶变换 代码参考教程: https://www.bilibili.com/video/BV1X8411a74G/?v

    2024年02月02日
    浏览(47)
  • 快速傅里叶变换MATLAB代码实现

    任何连续测量的时序或信号,都可以表示为不同频率的余弦(或正弦)波信号的无限叠加。FFT(Fast Fourier Transform)是离散傅立叶变换的快速算法,可以将一个信号变换到频域。 对于包含 n n n 个均匀采样点的向量 x x x ,其傅里叶变换定义为 y k + 1 = ∑ j = 0 n − 1 ω j k x j + 1

    2023年04月09日
    浏览(62)
  • 傅里叶变换的相关实验——matlab实现

    图像变换是数字图像处理中常用的技术,在图像增强、图像复原、图像压缩编码等数字图像处理中,都会用到图像变换技术,傅里叶变换是数字图像处理中应用最广的一种变换。 从空间域到频率的唯一途径是进行傅里叶变换; 傅里叶变换有明确的物理意义,即任何时域连续

    2023年04月11日
    浏览(41)
  • QT+FFTW库 实现傅里叶变换

    DFT(FFT)结果,采样率,信号频谱的理解 - 知乎 (zhihu.com)] (28条消息) FFT与采样点数的关系原理_CodingAsura的博客-CSDN博客_fft点数和采样点数 概括为:假设采样频率为Fs,采样点数为N,做FFT之后,某一点n(n从1开始)表示的频率为:Fn=(n-1)*Fs/N;该点的模值除以N/2就是对应该频率

    2023年04月15日
    浏览(49)
  • Python轴承故障诊断 (一)短时傅里叶变换STFT

    目录 前言 1 短时傅里叶变换STFT原理介绍 1.1 傅里叶变换的本质 1.2 STFT概述 1.3 STFT的原理和过程 1.3.1 时间分割 1.3.2 傅里叶变换 1.3.3 时频图: 1.4 公式表示 2 基于Python的STFT实现与参数对比 2.1 代码示例 2.2 参数选择和对比 2.2.1 nperseg(窗口长度): 2.2.2 noverlap(重叠长度): 2

    2024年02月03日
    浏览(43)
  • 快速傅里叶变换(FFT)c语言实现

    基本原理在这里就不多讲了,可以看看其他高浏览量的博文,这篇文章针对c语言的实现         我们都知道C语言本身是没有复数运算的,很多DSP、单片机要用到也没有开源库可以使用复数运算,针对FFT在硬件上运行只能手动从底层开始 定义复数类型         这里用最简单

    2023年04月15日
    浏览(46)
  • FPGA:实现快速傅里叶变换(FFT)算法

    第一次使用FPGA实现一个算法,搓手手,于是我拿出一股势在必得的心情打开了FFT的视频教程,看了好几个视频和好些篇博客,于是我迷失在数学公式推导中,在一位前辈的建议下,我开始转换我的思维, 从科研心态转变为先用起来 ,于是我关掉我的推导笔记,找了一篇叫我

    2024年02月03日
    浏览(42)
  • 从傅里叶变换,到短时傅里叶变换,再到小波分析(CWT),看这一篇就够了(附MATLAB傻瓜式实现代码)

    本专栏中讲了很多时频域分析的知识,不过似乎还没有讲过时频域分析是怎样引出的。 所以本篇将回归本源,讲一讲从傅里叶变换→短时傅里叶变换→小波分析的过程。 为了让大家更直观得理解算法原理和推导过程,这篇文章将主要使用图片案例。 频谱分析可以告诉我们一

    2024年01月16日
    浏览(38)
  • Python中利用FFT(快速傅里叶变换)进行频谱分析

    本文将从实例的角度出发讲解fft函数的基本使用,不包含复杂的理论推导。 要对一个信号进行频谱分析,首先需要知道几个基本条件。 采样频率fs 信号长度N(信号的点数) 采样频率fs: 根据采样定理可知,采样频率应当大于等于被测信号里最高频率的2倍,才能保证不失真

    2024年01月17日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包