数学基础 -- 使用FFT对352x288的图像变换示例

server/2024/9/25 2:05:22/

变换

一维FFT的基本概念

FFT基于复数运算。对于任意一维信号(在这里是图像的一行或一列),假设有 (N) 个数据点,一维FFT的目标是将这些点从时间域(或空间域)转换到频域。一维FFT的结果也是一个长度为 (N) 的序列,表示不同频率成分的复数幅度。

一维离散傅里叶变换(DFT)的定义为:
X [ k ] = ∑ n = 0 N − 1 x [ n ] ⋅ e − i 2 π k n N X[k] = \sum_{n=0}^{N-1} x[n] \cdot e^{-i 2\pi \frac{kn}{N}} X[k]=n=0N1x[n]ei2πNkn
其中,

  • (X[k]) 是频域中的第 (k) 个成分,
  • (x[n]) 是时域中的第 (n) 个样本,
  • (N) 是样本总数,
  • (i) 是虚数单位。

对图像行的FFT

对于352x288的图像,首先对每行(共288行)进行FFT:

  1. 对于每一行,我们有352个数据点。应用上述DFT公式,为每个频率 (k) (从0到351),计算该频率的复数幅度:
    X [ k ] = ∑ n = 0 351 x [ n ] ⋅ e − i 2 π k n 352 X[k] = \sum_{n=0}^{351} x[n] \cdot e^{-i 2\pi \frac{kn}{352}} X[k]=n=0351x[n]ei2π352kn

  2. 这个计算为每一行生成一个新的352个元素的行,这些元素现在表示原始数据在频域中的复数表示。

对图像列的FFT

完成所有行的变换后,每列(现在是转换后的352个频域数据)也要进行FFT:

  1. 对于每一列,同样应用DFT公式,但这次是对每个列的288个数据点进行变换。这为每个频率 (k) (从0到287)计算复数幅度:
    Y [ k ] = ∑ m = 0 287 X [ m ] ⋅ e − i 2 π k m 288 Y[k] = \sum_{m=0}^{287} X[m] \cdot e^{-i 2\pi \frac{km}{288}} Y[k]=m=0287X[m]ei2π288km

  2. 这个计算为每一列生成一个新的288个元素的列,这些元素代表了该列的频域数据。

结果的解释

经过上述两次FFT(先行后列),我们得到一个新的352x288的复数矩阵,其中的每个元素 (Y[j][k]) 都代表了原图像在特定频率上的复数幅度。这个矩阵展示了图像的频域特性,其幅值和相位分别反映了频率成分的强度和相位信息。

应用

这个频域矩阵可以用来进行图像的频域分析和处理,比如滤波、压缩等。通过修改这个矩阵中的特定元素,然后应用逆FFT,我们可以实现对原始图像的各种修改和改进。

逆变换

逆离散傅里叶变换(IDFT)

逆离散傅里叶变换(IDFT)是离散傅里叶变换(DFT)的逆操作,用于将数据从频域转换回空间域。对于一个经过DFT得到的频域矩阵,其IDFT公式定义如下:

x [ n ] = 1 N ∑ k = 0 N − 1 X [ k ] ⋅ e i 2 π k n N x[n] = \frac{1}{N} \sum_{k=0}^{N-1} X[k] \cdot e^{i 2\pi \frac{kn}{N}} x[n]=N1k=0N1X[k]ei2πNkn

其中:

  • (x[n]) 是空间域中的第 (n) 个样本(或像素值),
  • (X[k]) 是频域中的第 (k) 个成分,
  • (N) 是样本总数(在图像中即为像素数),
  • (i) 是虚数单位。

逆FFT操作的步骤

对于一个352x288的图像,其频域矩阵同样为352x288。逆FFT操作首先对频域矩阵的每一列执行一维逆FFT,然后对每一行执行一维逆FFT。以下是详细步骤:

  1. 对每一列执行一维逆FFT

    • 对于矩阵中的每一列(共352列),应用上述IDFT公式。对于列 (m),第 (n) 个元素的计算为:
      x [ m ] [ n ] = 1 288 ∑ k = 0 287 X [ m ] [ k ] ⋅ e i 2 π k n 288 x[m][n] = \frac{1}{288} \sum_{k=0}^{287} X[m][k] \cdot e^{i 2\pi \frac{kn}{288}} x[m][n]=2881k=0287X[m][k]ei2π288kn
  2. 对每一行执行一维逆FFT

    • 对于经过列变换后得到的每一行(共288行),再次应用IDFT公式。对于行 (n),第 (m) 个元素的计算为:
      x [ n ] [ m ] = 1 352 ∑ j = 0 351 x [ n ] [ j ] ⋅ e i 2 π j m 352 x[n][m] = \frac{1}{352} \sum_{j=0}^{351} x[n][j] \cdot e^{i 2\pi \frac{jm}{352}} x[n][m]=3521j=0351x[n][j]ei2π352jm

结果与应用

通过以上步骤,我们得到了一个新的352x288的空间域图像矩阵,该矩阵反映了所有在频域进行的修改。这允许我们实现图像的修复、重建或其他形式的处理,从而得到改善或具有特定特征的图像。


http://www.ppmy.cn/server/36441.html

相关文章

流畅的python-学习笔记_一等函数

函数对象 函数也是对象,操作可像对象一般操作 高阶函数 高阶函数指接受参数为函数,或返回函数的函数 不少高阶函数在py3已经有了替代品。map, filter可通过生成式实现,reduce(在functools里)可通过sum实…

Mac idea gradle解决异常: SSL peer shut down incorrectly

系统:mac 软件:idea 解决异常: SSL peer shut down incorrectly 查看有没有安装 gradle -v安装 根据项目gradle提示安装版本 brew install gradle7idea的配置 在settings搜索gradle,配置Local installation,选择自己的安装目录…

docker的介绍及使用--解决应用程序的环境配置问题

系列文章目录 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 TODO:写完再整理 文章目录 系列文章目录前言docker的介绍及使用参考资料前言 认知有限,望大家多多包涵,有什么问题也希望能够与大家多交流,共同成长! 本文先对docker的介绍及使用–解决…

【linux-1-Ubuntu常用命令-vim编辑器-Vscode链接ubuntu远程开发】

目录 1. 安装虚拟机Vmare和在虚拟机上安装Ubuntu系统:2. 常用的Ubuntu常识和常用命令2.1 文件系统结构2.2 常用命令2.3 vim编辑器 3. Ubuntu能联网但是ping不通电脑:4. Windows上安装VScode链接ubuntu系统,进行远程开发: 1. 安装虚…

make、makefile、cmake、nmake

GCC:即GNU Compiler Collection(GNU编译器套件),可简单认为是编译器。它可以编译很多种编程语言(如C、C、Objective-C、Fortran、Java等)。当程序只有一个源文件时,直接就可以用gcc命令编译它。…

expdp突然变非常慢

检查日志expdp日志,发现已经表都已经基本上导出完成,都是0 KB 0 rows,就没是导出完成的标识。检查dba_datapump_jobs发现expdp任务还在执行中。 检查v$session,发现存在等待事件“Streams AQ: Enqueue Blocked On Low Memory” …

管理能力学习笔记九:授权的常见误区和如何有效授权

授权的常见误区 误区一:随意授权 管理者在授权工作时,需要依据下属的能力、经验、意愿问最自己:这项工作适合授权给Ta做吗?如果没有,可以通过哪些方法进行培训呢? 误区二:缺乏信任 心理暗示…

【报错】spark序列化报错:Kryo serialization failed: Buffer overflow

文章目录 spark序列化报错问题解决 spark序列化报错 org.apache.spark.SparkException: Kryo serialization failed: Buffer overflow. Available: 0, required: 61186304. To avoid this, increase spark.kryoserializer.buffer.max value.at org.apache.spark.serializer.Kry…