第4章 Python 数字图像处理(DIP) - 频率域滤波8 - 二维DFT和IDFT的一些性质 - 二维离散卷积定理

article/2025/9/26 19:49:09

目录

    • 二维DFT和IDFT的一些性质
      • 二维离散卷积定理
      • 二维离散傅里叶变换性质的小结

二维DFT和IDFT的一些性质

二维离散卷积定理

二维循环卷积表达式:
( f ⋆ h ) ( x , y ) = ∑ m = 0 M − 1 ∑ n = 0 N − 1 f ( m , n ) h ( x − m , y − n ) (4.94) (f \star h)(x, y) = \sum_{m=0}^{M-1} \sum_{n=0}^{N-1} f(m,n)h(x-m, y-n) \tag{4.94} (fh)(x,y)=m=0M1n=0N1f(m,n)h(xm,yn)(4.94)

二维卷积定理为:
( f ⋆ h ) ( x , y ) ⇔ ( F ∙ H ) ( u , v ) (4.95) (f \star h)(x, y) \Leftrightarrow (F\bullet H)(u, v) \tag{4.95} (fh)(x,y)(FH)(u,v)(4.95)

( f ∙ h ) ( x , y ) ⇔ 1 M N ( F ⋆ H ) ( u , v ) (4.96) (f \bullet h)(x, y) \Leftrightarrow \frac{1}{MN}(F\star H)(u, v) \tag{4.96} (fh)(x,y)MN1(FH)(u,v)(4.96)

f f f h h h的空间卷积的傅里叶变换,是它们的变换的乘积。

空间卷积是空间域滤波的基础,式(4.95)是在空间域和频率域滤波之间建立等价关系的纽带。

# 一维卷积与一维傅里叶变换
f = np.zeros([400])
f[:300] = 3h = np.zeros([f.shape[0]])
h[:200] = 2# 卷积
F_con = np.convolve(f, h)# 傅里叶变换,未填充零的结果
f_fft = np.fft.fft(f)
f_fft = np.fft.fftshift(f_fft)
h_fft = np.fft.fft(h)
h_fft = np.fft.fftshift(h_fft)fh_fft = f_fft * h_fft# 傅里叶反变换
fh_ifft = np.abs(np.fft.ifft(fh_fft))fig = plt.figure(figsize=(12, 6))
plt.subplot(2, 2, 1), plt.plot(f), plt.ylim([0, 5]), plt.xlim([0, 1000]), plt.xticks([0, 200, 400]), plt.title('f')
plt.subplot(2, 2, 2), plt.plot(h), plt.ylim([0, 5]), plt.xlim([0, 1000]), plt.xticks([0, 200, 400]), plt.title('h')
plt.subplot(2, 2, 3), plt.plot(F_con), plt.ylim([0, 2000]), plt.xlim([0, 1000]), plt.xticks([0, 200, 400, 600, 800]), 
plt.title('Convolution')
plt.subplot(2, 2, 4), plt.plot(fh_ifft), plt.ylim([0, 2000]), plt.xlim([0, 1000]), plt.xticks([0, 200, 400, 600, 800]), 
plt.title('IFFT')
plt.tight_layout()
plt.show()

在这里插入图片描述
从上图可以看出,卷积与傅里叶变换的结果不一样,这种错误可以通过对原函数填充零来纠正。要使得它们的长度 P P P相同,则有
P ≥ A + B − 1 (4.97) P \ge A + B - 1 \tag{4.97} PA+B1(4.97)

从下面的结果可以看出,直接的零填充得到的结果跟卷积是一样的。镜像和复制的填充结果不太一样。

二维填充的公式:
f P ( x , y ) = { f ( x , y ) , 0 ≤ x ≤ A − 1 和 0 ≤ y ≤ B − 1 0 , A ≤ x ≤ P 或 B ≤ y ≤ Q (4.98) f_P(x, y) = \begin{cases} f(x, y), & 0 \leq x \leq A -1和 0 \leq y \leq B-1 \\ 0, & A \leq x \leq P 或 B \leq y \leq Q \end{cases} \tag{4.98} fP(x,y)={f(x,y),0,0xA10yB1AxPByQ(4.98)

h P ( x , y ) = { h ( x , y ) , 0 ≤ x ≤ C − 1 和 0 ≤ y ≤ D − 1 0 , C ≤ x ≤ P 或 D ≤ y ≤ Q (4.99) h_P(x, y) = \begin{cases} h(x, y), & 0 \leq x \leq C -1和 0 \leq y \leq D-1 \\ 0, & C \leq x \leq P 或 D \leq y \leq Q \end{cases} \tag{4.99} hP(x,y)={h(x,y),0,0xC10yD1CxPDyQ(4.99)

P ≥ A + C − 1 (4.100) P \ge A + C - 1 \tag{4.100} PA+C1(4.100)
Q ≥ B + D − 1 (4.101) Q \ge B + D - 1 \tag{4.101} QB+D1(4.101)

DFT算法通过偶数大小的阵列时速度通常更快,因此经常选择 P P P Q Q Q的最小偶数整数。

如果两个阵列大小相同,则意味着
P = 2 M (4.102) P = 2M \tag{4.102} P=2M(4.102)

Q = 2 N (4.103) Q = 2N \tag{4.103} Q=2N(4.103)

在两个函数中,如果有一个或两个函数的值在取样区间的末尾不是0,那么把0添加到函数中来消除交叠错误时,会导致函数不连续。这类似于用一个盒式函数来乘以一下函数,在频率域是这一相乘意味着原变换与一个 sinc \text{sinc} sinc函数的卷积,进行导致由 sinc \text{sinc} sinc函数的高频分量产生所谓的频率泄露
频率泄露会使得图像块效应。

开窗或切趾法

  • 降低工频率泄漏的方法,就是让取样后的函数乘以另一个两端平滑地过渡到0的函数(窗函数)
# 傅里叶变换,填充堆的结果
f_pad = np.zeros([800])
f_pad[:400] = f
h_pad = np.zeros([800])
h_pad[:400] = h
f_fft = np.fft.fft(f_pad)
f_fft = np.fft.fftshift(f_fft)
h_fft = np.fft.fft(h_pad)
h_fft = np.fft.fftshift(h_fft)fh_fft = f_fft * h_fft# 傅里叶反变换
fh_ifft = np.abs(np.fft.ifft(fh_fft))fig = plt.figure(figsize=(12, 6))
plt.subplot(2, 2, 1), plt.plot(f_pad), plt.ylim([0, 5]), plt.xlim([0, 1000]), plt.xticks([0, 200, 400]), plt.title('f pad 0')
plt.subplot(2, 2, 2), plt.plot(h_pad), plt.ylim([0, 5]), plt.xlim([0, 1000]), plt.xticks([0, 200, 400]), plt.title('h pad 0')
plt.subplot(2, 2, 3), plt.plot(F_con), plt.ylim([0, 2000]), plt.xlim([0, 1000]), plt.xticks([0, 200, 400, 600, 800]), 
plt.title('Convolution')
plt.subplot(2, 2, 4), plt.plot(fh_ifft), plt.ylim([0, 2000]), plt.xlim([0, 1000]), plt.xticks([0, 200, 400, 600, 800]), 
plt.title('IFFT')
plt.tight_layout()
plt.show()

在这里插入图片描述

# 傅里叶变换,镜像
f_pad = np.zeros([800])
f_pad = np.pad(f, (400, 0), mode='reflect')
# f_pad = np.
h_pad = np.zeros([800])
h_pad = np.pad(h, (400, 0), mode='reflect')f_fft = np.fft.fft(f_pad)
f_fft = np.fft.fftshift(f_fft)
h_fft = np.fft.fft(h_pad)
h_fft = np.fft.fftshift(h_fft)fh_fft = f_fft * h_fft# 傅里叶反变换
fh_ifft = np.abs(np.fft.ifft(fh_fft))
fh_ifft = 2394 - fh_ifft
fig = plt.figure(figsize=(12, 6))
plt.subplot(2, 2, 1), plt.plot(f_pad), plt.ylim([0, 5]), plt.xlim([0, 1000]), plt.xticks([0, 200, 400]), plt.title('f pad 0')
plt.subplot(2, 2, 2), plt.plot(h_pad), plt.ylim([0, 5]), plt.xlim([0, 1000]), plt.xticks([0, 200, 400]), plt.title('h pad 0')
plt.subplot(2, 2, 3), plt.plot(F_con), plt.ylim([0, 2000]), plt.xlim([0, 1000]), plt.xticks([0, 200, 400, 600, 800]), 
plt.title('Convolution')
plt.subplot(2, 2, 4), plt.plot(fh_ifft), plt.ylim([0, 2000]), plt.xlim([0, 1000]), plt.xticks([0, 200, 400, 600, 800]), 
plt.title('IFFT')
plt.tight_layout()
plt.show()

在这里插入图片描述

二维离散傅里叶变换性质的小结

名称 表达式
f ( x , y ) f(x, y) f(x,y)的DFT F ( u , v ) = ∑ x = 0 M − 1 ∑ y = 0 N − 1 f ( x , y ) e − j 2 π ( u x / M + v y / N ) F(u, v) = \sum_{x = 0}^{M - 1} \sum_{y = 0}^{N - 1} f(x, y) e^{-j2\pi(u x/M + v y /N)} F(u,v)=x=0M1y=0N1f(x,y)ej2π(ux/M+vy/N)
F ( u , v ) F(u, v) F(u,v)的IDFT f ( x , y ) = 1 M N ∑ u = 0 M − 1 ∑ v = 0 N − 1 F ( u , v ) e j 2 π ( u x / M + v y / N ) f(x, y) = \frac{1}{MN}\sum_{u = 0}^{M - 1} \sum_{v = 0}^{N - 1} F(u, v) e^{j2\pi(u x /M + vy /N)} f(x,y)=MN1u=0M1v=0N1F(u,v)ej2π(ux/M+vy/N)

http://chatgpt.dhexx.cn/article/Vqf3Xpk6.shtml

相关文章

FFT学习笔记(DFT,IDFT)

昨天参悟了一天FFT,总算是理解了,今天的莫比乌斯反演也不太懂,干脆弃疗,决定来认真水一发博客。 什么是FFT? FFT(Fast Fourier Transformation),即为快速傅氏变换,是离散傅氏变换&…

【OpenCV4】图像的傅里叶变换 cv::dft() 和逆变换 cv::idft() 解析(c++)

图像傅里叶变换的作用: 频谱分析,获取图像中高频低频的分布情况快速卷积,两个矩阵的傅里叶变换结果相乘 案例代码: cv::Mat TestOpencvDft() {cv::Mat lena cv::imread("lena.jpg", 0);cv::resize(lena, lena, cv::…

Matlab如何进行利用离散傅里叶逆变换iDFT 从频谱恢复时域信号

文章目录 1. 定义2. 变换和处理3. 函数4. 实例演示例1:单频正弦信号(整数周期采样)例2:含有直流分量的单频正弦信号例3:正弦复合信号例4:含有随机干扰的正弦信号例5:实际案例 5. 联系作者 1. 定…

离散傅里叶变换(DFT/IDFT、FFT/IFFT)运算量的讨论

前言:关于为什么要写这个博客 最近在重新看《合成孔径雷达成像 算法与实现》这本书,看到“离散傅里叶变换记其逆变换的运算量级为”这句话,就想起当初在学《数字信号处理》中FFT那章节时,书中有对比DFT和FFT的运算量的一些文字&am…

OpenCV-离散傅里叶变换cv::dftcv::idft

作者:翟天保Steven 版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处 函数原型 void dft(InputArray src, OutputArray dst, int flags 0, int nonzeroRows 0); void idft(InputArray src, Output…

12点的idft c语言,【整理】用IDFT实现UF-OFDM和OFDM的模拟调制

cooperate with Liu Lei 用IDFT实现OFDM的代码如下: N32; xrandint(1,N,[0 3]); x1qammod(x,4); f1:N; t0:0.001:1-0.001; w2*pi*f.*t; % w12*pi*(f0.2).*t; y1x1*exp(j*w);%子载波调制 x2ifft(x1,N); %ifft figure(1); plot(t,abs(y1)); hold on; stem(0:1/N:1-1/N…

离散傅立叶变换推导(DF、IDFT)

mazonex离散傅立叶变换视频笔记 需要先了解傅里叶变换推导(FT、IFT) 本文仅作为笔记,推导思想和图片来自视频 周期为 2 π 2\pi 2π的函数的复数形式展开(傅里叶级数) 在上一篇文章中part4中提到周期 T 2 L T2L T2L函数的复数形式展开为: f ( t ) ∑…

浅谈傅里叶——8. 一维iDFT的实现

这是本系列的最后一章,原先计划是把这部分内容一并挪到上一章里的,不过喜欢凑一个整数,而且想骗一点流量,所以把它们拆成了两部分。我们在前面的内容中,通过使用不同的频率信号对原始信号进行采样,从而分析…

idft重建图像 matlab_1周学FFT——第2天 DFT和IDFT的MATLAB实现

根据定义式,可写出DFT的MATLAB代码如下[从玉良,2009,p72]: function [f, Xk] mydft(xn, fs, N) % DFT n [0:1:N-1]; k n; WN exp(-j*2*pi/N); nk n * k; % N^2 times multiply Xk xn(1:N) * WN.^nk; % N^3 times multiply f …

FT,DTFT,DFT,IDFT,FFT含义

1.傅立叶变换FT(Fourier Transform) 性质:时域连续,频域连续 周期信号只有傅立叶级数,严格意义上讲,没有傅立叶变换;但可以令周期信号的周期趋于无穷大,这样,将周期信号变为非周期信号&#x…

DFT与IDFT

DFT与IDFT 一.方法简介 序列x(n)(n0,1,…N-1)的DFT定义为 X ( k ) ∑ n 0 N − 1 x ( n ) e − j 2 π n k N X(k)\sum_{n0}^{N-1}x(n)e^{-j\frac{2\pi nk}{N}} X(k)n0∑N−1​x(n)e−jN2πnk​ 设 x …

IDFT的python实现

IDFT IDFT(Inverse Discrete Fourier Transform), 傅里叶逆变换,可以将频域信号转换到时域中, 它的公式非常简单: x [ n ] 1 N ∑ k 0 N − 1 X [ k ] e j 2 π k n / N x[n] \frac{1}{N} \sum_{k0}^{N-1} X[k] e^{j2\pi kn/N} x[n]N1​k0∑N−1​X…

一文搞懂:FT、DTFT、DFT、IDFT

一文搞懂:FT、DTFT、DFT、IDFT 写在前面一切为了计算机的处理推导步骤 总结 写在前面 近期重温了一下可爱的数字信号处理,又回想起当初被 FT、DTFT、DFT、IDFT 这几兄弟折腾的傻傻分不清的日子,今天特地在此对它们进行一个梳理。 珠玉在前&a…

LDUOJ spj 修改

特判使用教程 感谢涛巨 记录一下,省的以后忘记了。 /* Utility functions for writing output validators for the Kattis* problem format.** The primary functions and variables available are the following.* In many cases, the only functions needed are …

noip 2022 第二题 喵了个喵 meow 在 Lemon LemonLime 中 SPJ Special Judge 测评 配置 设置

noip 2022 第二题 喵了个喵 meow 在 Lemon LemonLime 中 SPJ Special Judge 测评配置设置 比赛目录如下&#xff1a; 用户程序(meow.cpp)如下&#xff1a; #include <bits/stdc.h> using namespace std;template<typename T> inline void read(T &x) {x 0; …

数据库例题(创建数据库SPJ包含S、P、J和SPJ表)

目录 运行说明 例题 例题解答 运行说明 1、运行环境&#xff1a;win10 2、所需步骤&#xff1a; &#xff08;1&#xff09; 通过PowerDesigner软件创建逻辑数据模型(CDM)&#xff0c;再将其转换为物理数据模型(PDM)&#xff0c;再导出为SQL语句。 &#xff08;2&#xff…

Lemon LemonLime 中 SPJ Special Judge 使用 实践 入门 a

精度需要SPJ 入门&#xff1a; 题目&#xff0c;以整数形式给定圆的半径&#xff0c;输出该圆的周长&#xff0c;该圆的面积。 比赛目录如下&#xff1a; 标准输入输出数据如下&#xff1a; circle1.in 1 circle1.ans 6.283185 3.141593 circle2.in 2 circle2.ans 12.566370 12…

数据库---[复习2]---数据查询---设有一个SPJ数据库,包括S、P、J及SPJ4个关系模式··· ···

文章目录 问题重述数据表S表&#xff1a;P表&#xff1a;J表&#xff1a;SPJ表&#xff1a; 问题解析1. 找出所有供应商的姓名和所在城市2. 找出所有零件的名称&#xff0c;颜色&#xff0c;重量3. 找出使用供应商S1所供应零件的工程号码4. 找出工程项目J2使用的各种零件的名称…

Lemon LemonLime 中 SPJ Special Judge 使用 实践 入门 c

多解需要SPJ 入门&#xff1a; 题目&#xff1a;输出 Hello, World!&#xff0c;大小写不限。 比赛目录如下&#xff1a; 标准输入输出数据如下&#xff1a; string1.in(空文件&#xff0c;里面没有任何内容) string1.ans Hello, World! 用户程序(string.cpp)如下&#xff1a; …

Lemon LemonLime 中 SPJ Special Judge 使用 实践 入门 b

多解需要SPJ 入门&#xff1a; 题目&#xff1a;给出一个不小于12的正整数n&#xff0c;请你输出两个合数&#xff0c;使他们的和等于n,注意&#xff0c;每个测试&#xff0c;有多组测试数据. 比赛目录如下&#xff1a; 标准输入输出数据如下&#xff1a; sum1.in 2 12 13 sum1…