图像的采样和量化(二维DFT公式详细推导)

最近复习图像和视频处理课,好多基础推导都不能得心应手,复习进度相当缓慢,过程异常痛苦。图像的二维傅里叶变换的公式始终没成功推出来,执着地僵持了很久,于是成此文。

数字图像(M行*N列)是二维离散信号,可以认为是从一维离散时间信号(也就是 序列)的推广。

(一)二维脉冲阵列信号的FT

考虑二维脉冲阵列信号:

(1) p ( x , y ) = ∑ k = 0 M − 1 ∑ l = 0 N − 1 δ ( x − k Δ x , y − l Δ y ) p(x,y)=\sum_{k=0}^{M-1}\sum_{l=0}^{N-1}\delta(x-k\Delta x, y-l\Delta y)\tag1 p(x,y)=k=0M1l=0N1δ(xkΔx,ylΔy)(1)
k,l只是序号,实际上 x x x只能取离散值 k Δ x k\Delta x kΔx, y y y只能取 l Δ y l\Delta y lΔy.
Δ x , Δ y \Delta x,\Delta y Δx,Δy分别是图像在空域x和y方向的采样间隔。而 1 Δ x , 1 Δ y \frac{1}{\Delta x},\frac{1}{\Delta y} Δx1,Δy1是频域u和v方向的采样率.

显然,
p ( x , y ) = δ ( x , y ) + δ ( x , y − Δ y ) + ⋯ + δ ( x , y − ( N − 1 ) Δ y ) p(x,y)=\delta(x,y)+\delta(x,y-\Delta y)+\cdots+\delta(x,y-(N-1)\Delta y) p(x,y)=δ(x,y)+δ(x,yΔy)++δ(x,y(N1)Δy)
+ δ ( x − Δ x , y ) + δ ( x − Δ x , y − Δ y ) + ⋯ + δ ( x − Δ x , y − ( N − 1 ) Δ y ) + +\delta(x-\Delta x,y)+\delta (x-\Delta x,y-\Delta y)+\cdots+\delta(x-\Delta x,y-(N-1)\Delta y)+ +δ(xΔx,y)+δ(xΔx,yΔy)++δ(xΔx,y(N1)Δy)+
⋯ \cdots
(2) + δ ( x − ( M − 1 ) Δ x , y − ( N − 1 ) Δ y ) +\delta(x-(M-1)\Delta x,y-(N-1)\Delta y)\tag2 +δ(x(M1)Δx,y(N1)Δy)(2)
所以它是M*N的阵列,每个点的值都是1 .

对(1)做二维FT:(关于二维傅里叶变换公式,移步这里.
(3) P ( u , v ) = 1 Δ x 1 Δ y ∑ k = 0 M − 1 ∑ l = 0 N − 1 p ( x , y ) e − j 2 π ( u k Δ x + v l Δ y ) = P(u,v)=\frac{1}{\Delta x}\frac{1}{\Delta y}\sum_{k=0}^{M-1}\sum_{l=0}^{N-1}p(x,y)e^{-j2\pi(uk\Delta x+vl\Delta y)}=\tag3 P(u,v)=Δx1Δy1k=0M1l=0N1p(x,y)ej2π(ukΔx+vlΔy)=(3)
直接把(1)进来:

(4) 1 Δ x 1 Δ y ∑ k = 0 M − 1 ∑ l = 0 N − 1 ∑ k = 0 M − 1 ∑ l = 0 N − 1 δ ( x − k Δ x , y − l Δ y ) e − j 2 π ( u k Δ x + v l Δ y ) = \frac{1}{\Delta x}\frac{1}{\Delta y}\sum_{k=0}^{M-1}\sum_{l=0}^{N-1}\sum_{k=0}^{M-1}\sum_{l=0}^{N-1}\delta(x-k\Delta x, y-l\Delta y)e^{-j2\pi(uk\Delta x+vl\Delta y)}=\tag4 Δx1Δy1k=0M1l=0N1k=0M1l=0N1δ(xkΔx,ylΔy)ej2π(ukΔx+vlΔy)=(4)

由冲激函数的抽样性,只有当 x = k Δ x , y = l Δ y x=k\Delta x,y=l\Delta y x=kΔx,y=lΔy时冲激函数取值为1,则:
(5) 1 Δ x 1 Δ y ∑ k = 0 M − 1 ∑ l = 0 N − 1 e − j 2 π ( x u + y v ) = \frac{1}{\Delta x}\frac{1}{\Delta y}\sum_{k=0}^{M-1}\sum_{l=0}^{N-1}e^{-j2\pi(xu+yv)}=\tag5 Δx1Δy1k=0M1l=0N1ej2π(xu+yv)=(5)
由于 x = k Δ x , y = l Δ y x=k\Delta x,y=l\Delta y x=kΔx,y=lΔy,所以:
(6) 1 Δ x 1 Δ y ∑ k = 0 M − 1 ∑ l = 0 N − 1 e − j 2 π ( k Δ x u + l Δ y v ) = \frac{1}{\Delta x}\frac{1}{\Delta y}\sum_{k=0}^{M-1}\sum_{l=0}^{N-1}e^{-j2\pi(k\Delta xu+l\Delta yv)}=\tag6 Δx1Δy1k=0M1l=0N1ej2π(kΔxu+lΔyv)=(6)
由于指数的括号里面的值一定是整数 ,所以 ∑ k = 0 M − 1 ∑ l = 0 N − 1 e − j 2 π ( k Δ x u + l Δ y v ) \sum_{k=0}^{M-1}\sum_{l=0}^{N-1}e^{-j2\pi(k\Delta xu+l\Delta yv)} k=0M1l=0N1ej2π(kΔxu+lΔyv)就是M*N个1,于是可以写成:
(7) 1 Δ x 1 Δ y ∑ k = 0 M − 1 ∑ l = 0 N − 1 δ ( u − k Δ x , v − l Δ y ) \frac{1}{\Delta x}\frac{1}{\Delta y}\sum_{k=0}^{M-1}\sum_{l=0}^{N-1}\delta(u-\frac{k}{\Delta x},v-\frac{l}{\Delta y})\tag7 Δx1Δy1k=0M1l=0N1δ(uΔxk,vΔyl)(7)

其实(6)—(7) 的过程我不是特别明白,没完全想清楚,如有读者清楚欢迎在评论区说明,谢谢啦。

(二)图像的采样和重建

对图像采样就是原始信号 f ( x , y ) f(x,y) f(x,y)与采样脉冲序列 p ( x , y ) p(x,y) p(x,y)相乘
f s ( x , y ) = f ( x , y ) p ( x , y ) f_s(x,y)=f(x,y)p(x,y) fs(x,y)=f(x,y)p(x,y)
那么在频域就有:
F s ( u , v ) = 1 2 π F ( u , v ) ∗ P ( u , v ) = F_s(u,v)=\frac{1}{2\pi}F(u,v)*P(u,v)= Fs(u,v)=2π1F(u,v)P(u,v)=
1 2 π F ( u , v ) ∗ [ 1 Δ x 1 Δ y ∑ k = 0 M − 1 ∑ l = 0 N − 1 δ ( u − k Δ x , v − l Δ y ) ] = \frac{1}{2\pi}F(u,v)*[\frac{1}{\Delta x}\frac{1}{\Delta y}\sum_{k=0}^{M-1}\sum_{l=0}^{N-1}\delta(u-\frac{k}{\Delta x},v-\frac{l}{\Delta y})]= 2π1F(u,v)[Δx1Δy1k=0M1l=0N1δ(uΔxk,vΔyl)]=
1 2 π 1 Δ x 1 Δ y ∑ k = 0 M − 1 ∑ l = 0 N − 1 F ( u − k Δ x , v − l Δ y ) \frac{1}{2\pi}\frac{1}{\Delta x}\frac{1}{\Delta y}\sum_{k=0}^{M-1}\sum_{l=0}^{N-1}F(u-\frac{k}{\Delta x},v-\frac{l}{\Delta y}) 2π1Δx1Δy1k=0M1l=0N1F(uΔxk,vΔyl)

根据Nyquist定理,只要有
1 Δ x ≥ 2 U m a x , 1 Δ y ≥ 2 V m a x \frac{1}{\Delta x}\geq2U_{max},\frac{1}{\Delta y}\geq2V_{max} Δx12Umax,Δy12Vmax
原始的模拟信号就可以从采样得到的数字图像中完美重建。

而在实际中,重构是利用低通滤波器实现的。如下图,原始模拟信号经过采样,频谱延拓并周期性重复,用LowPass filter滤出一个完整频谱即可。
在这里插入图片描述

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
二维 DFT(离散傅里叶变换)是一种广泛应用于数字图像处理中的处理方法,可以用来对图像进行平移和旋转等操作。下面是 Python 实现二维 DFT 平移和旋转的示例代码: 平移操作: ```python import cv2 import numpy as np # 读取原始图像 img = cv2.imread("image.jpg", 0) # 计算傅里叶变换 dft = cv2.dft(np.float32(img), flags=cv2.DFT_COMPLEX_OUTPUT) # 将零频率分量移到频谱中心 dft_shift = np.fft.fftshift(dft) # 定义平移距离 rows, cols = img.shape tx, ty = 100, 100 # 构造平移矩阵 M = np.float32([[1, 0, tx], [0, 1, ty]]) # 应用平移矩阵 dft_shift = cv2.warpAffine(dft_shift, M, (cols, rows)) # 将频谱中心还原到零频率分量 dft_back_shift = np.fft.ifftshift(dft_shift) # 计算傅里叶反变换 img_back = cv2.idft(dft_back_shift) # 取反变换的实部作为输出图像 img_back = cv2.magnitude(img_back[:, :, 0], img_back[:, :, 1]) # 显示结果 cv2.imshow("Image", img) cv2.imshow("Image Back", img_back.astype(np.uint8)) cv2.waitKey(0) cv2.destroyAllWindows() ``` 旋转操作: ```python import cv2 import numpy as np # 读取原始图像 img = cv2.imread("image.jpg", 0) # 计算傅里叶变换 dft = cv2.dft(np.float32(img), flags=cv2.DFT_COMPLEX_OUTPUT) # 将零频率分量移到频谱中心 dft_shift = np.fft.fftshift(dft) # 定义旋转角度 angle = 45 # 构造旋转矩阵 M = cv2.getRotationMatrix2D((cols/2, rows/2), angle, 1) # 应用旋转矩阵 dft_shift = cv2.warpAffine(dft_shift, M, (cols, rows)) # 将频谱中心还原到零频率分量 dft_back_shift = np.fft.ifftshift(dft_shift) # 计算傅里叶反变换 img_back = cv2.idft(dft_back_shift) # 取反变换的实部作为输出图像 img_back = cv2.magnitude(img_back[:, :, 0], img_back[:, :, 1]) # 显示结果 cv2.imshow("Image", img) cv2.imshow("Image Back", img_back.astype(np.uint8)) cv2.waitKey(0) cv2.destroyAllWindows() ``` 以上代码中,平移操作使用了 OpenCV 的 warpAffine 函数,旋转操作使用了 getRotationMatrix2D 函数。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值