第4章 Python 数字图像处理(DIP) - 频率域滤波8 - 二维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] = 3

h = 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)
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

jasneik

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值