目录

  • 二维DFT和IDFT的一些性质
    • 傅里叶频谱和相角

二维DFT和IDFT的一些性质

傅里叶频谱和相角

F(u,v)=R(u,v)+jI(u,v)=∣F(u,v)∣ejϕ(u,v)(4.86)F(u, v) = R(u, v) + jI(u, v) = |F(u, v)|e^{j\phi(u,v)} \tag{4.86}F(u,v)=R(u,v)+jI(u,v)=∣F(u,v)∣ejϕ(u,v)(4.86)

  • 幅度,称为傅里叶频谱(或频谱)

∣F(u,v)∣=[R2(u,v)+I2(u,v)]1/2(4.87)|F(u, v)| = \Big[ R^2(u, v) + I^2(u, v)\Big]^{1/2} \tag{4.87}∣F(u,v)∣=[R2(u,v)+I2(u,v)]1/2(4.87)

  • 相角或相位谱

ϕ(u,v)=arctan[I(u,v)R(u,v)](4.88)\phi(u,v) = \text{arctan}\Bigg[ \frac{I(u, v)}{R(u, v)}\Bigg] \tag{4.88}ϕ(u,v)=arctan[R(u,v)I(u,v)​](4.88)

  • 功率谱
    P(u,v)=∣F(u,v)∣2=R2(u,v)+I2(u,v)(4.89)P(u, v) = |F(u, v)|^2 = R^2(u, v) + I^2(u, v) \tag{4.89}P(u,v)=∣F(u,v)∣2=R2(u,v)+I2(u,v)(4.89)

实函数的傅里叶变换是共轭对称的,则有

频谱是关于原点偶对称的
∣F(u,v)∣=∣F(−u,−v)∣(4.90)|F(u, v)| = |F(-u, -v)| \tag{4.90}∣F(u,v)∣=∣F(−u,−v)∣(4.90)

相角是关于原点奇对称的:
ϕ(u,v)=−ϕ(−u,−v)(4.91)\phi(u,v) = - \phi(-u, -v) \tag{4.91}ϕ(u,v)=−ϕ(−u,−v)(4.91)

∣F(0,0)∣=MN∣fˉ∣,fˉ是f(x,y)的平均值(4.93)|F(0, 0)| = MN |\bar f|, \quad \bar f 是f(x, y)的平均值\tag{4.93}∣F(0,0)∣=MN∣fˉ​∣,fˉ​是f(x,y)的平均值(4.93)

def spectrum_fft(fft):"""return FFT spectrum"""return np.sqrt(np.power(fft.real, 2) + np.power(fft.imag, 2))def phase_fft(fft):"""return FFT phase angle"""return np.angle(fft)
# 矩形函数的频谱
img = cv2.imread('DIP_Figures/DIP3E_Original_Images_CH04/Fig0424(a)(rectangle).tif', -1)# FFT
img_fft = np.fft.fft2(img.astype(np.float32))# 非中心化的频谱
spectrum = spectrum_fft(img_fft)
spectrum = np.uint8(normalize(spectrum) * 255)# 中心化
fshift = np.fft.fftshift(img_fft)            # 将变换的频率图像四角移动到中心# 中心化后的频谱
spectrum_fshift = spectrum_fft(fshift)
spectrum_fshift_n = np.uint8(normalize(spectrum_fshift) * 255)# 对频谱做对数变换
spectrum_log = np.log(1 + spectrum_fshift)plt.figure(figsize=(15, 15))
plt.subplot(2, 2, 1), plt.imshow(img, cmap='gray'), plt.title('Original'), plt.xticks([]), plt.yticks([])
plt.subplot(2, 2, 2), plt.imshow(spectrum, cmap='gray', vmin=0, vmax=255), plt.title('FFT Not Shift to Center'),
plt.xticks([]), plt.yticks([])
plt.subplot(2, 2, 3), plt.imshow(spectrum_fshift_n, cmap='gray', vmin=0, vmax=255),
plt.title('FFT Shift but not log'), plt.xticks([]), plt.yticks([])
plt.subplot(2, 2, 4), plt.imshow(spectrum_log, cmap='gray'), plt.title('FFT Shift log'), plt.xticks([]), plt.yticks([])
plt.tight_layout()
plt.show()

# 矩形函数的频谱,平移,旋转
# shift,平移后的频谱与原图像的频谱相同
img_ori = cv2.imread('DIP_Figures/DIP3E_Original_Images_CH04/Fig0424(a)(rectangle).tif', -1)#[[1, 0, 250], [0, 1, -250]]   表示平移变换:其中250表示水平方向上向右的平移距离,-250表示竖直方向上的向上平移距离。
mat_translation = np.float32([[1, 0, 250],[0, 1, -250]])  #变换矩阵:设置平移变换所需的计算矩阵:2行3列
img_1 = cv2.warpAffine(img_ori, mat_translation, (img_ori.shape[0], img_ori.shape[1]))  #变换函数fft_shift = np.fft.fft2(img_ori.astype(np.float32))
fshift_shift = np.fft.fftshift(fft_shift)            # 将变换的频率图像四角移动到中心
res_shift = spectrum_fft(fshift_shift)
res_log_shift = np.log(1 + res_shift)# rotate,旋转后的频谱也旋转了
matRotate = cv2.getRotationMatrix2D((img_ori.shape[0]*0.5, img_ori.shape[1]*0.5), -30, 1) # mat rotate: 1 center,  2 angle,  3 scale
img_rotate = cv2.warpAffine(img_ori, matRotate, (img_ori.shape[0], img_ori.shape[1]), flags=cv2.INTER_CUBIC)fft_rotate = np.fft.fft2(img_rotate.astype(np.float32))
fshift_rotate = np.fft.fftshift(fft_rotate)            # 将变换的频率图像四角移动到中心
res_rotate = spectrum_fft(fshift_rotate)
res_log_rotate = np.log(1 + res_rotate)plt.figure(figsize=(15, 15))
plt.subplot(2, 2, 1), plt.imshow(img_1, cmap='gray'), plt.title('Shift Rectangle'), plt.xticks([]), plt.yticks([])
plt.subplot(2, 2, 2), plt.imshow(res_log_shift, cmap='gray'), plt.title('Shift rectangle FFT'), plt.xticks([]), plt.yticks([])
plt.subplot(2, 2, 3), plt.imshow(img_rotate, cmap='gray'), plt.title('Rotate Rectangle'), plt.xticks([]), plt.yticks([])
plt.subplot(2, 2, 4), plt.imshow(res_log_rotate, cmap='gray'), plt.title('Rotate Rectangle FFT'), plt.xticks([]), plt.yticks([])
plt.tight_layout()
plt.show()

中心化矩形的相角图,平移后的相角图, 旋转后的相角图

# 中心化矩形的相角图,平移后的相角图, 旋转后的相角图
phi = phase_fft(fshift)
phi_shift = phase_fft(fft_shift)
phi_rotate = phase_fft(fshift_rotate)# 下面实现是一样的功能
# phi = np.angle(fshift)
# phi_shift = np.angle(fft_shift)
# phi_rotate = np.angle(fshift_rotate)plt.figure(figsize=(15, 15))
plt.subplot(1, 3, 1), plt.imshow(phi, cmap='gray'), plt.title('Shift Rectangle'), plt.xticks([]), plt.yticks([])
plt.subplot(1, 3, 2), plt.imshow(phi_shift, cmap='gray'), plt.title('Shift rectangle FFT'), plt.xticks([]), plt.yticks([])
plt.subplot(1, 3, 3), plt.imshow(phi_rotate, cmap='gray'), plt.title('Rotate Rectangle'), plt.xticks([]), plt.yticks([])
plt.tight_layout()
plt.show()

频谱和相角对图像信息的贡献

# 频谱和相角对图像信息的贡献
img_woman = cv2.imread('DIP_Figures/DIP3E_Original_Images_CH04/Fig0427(a)(woman).tif', -1)
img_rectangle = cv2.imread('DIP_Figures/DIP3E_Original_Images_CH04/Fig0424(a)(rectangle).tif', -1)
# 原图是1024x1024,下采样为512x512
img_rectangle = img_rectangle[::2, ::2]# FFT
fft_woman = np.fft.fft2(img_woman.astype(np.float32))
fft_rectangle = np.fft.fft2(img_rectangle.astype(np.float32))# 中心化
fshift_woman = np.fft.fftshift(fft_woman)
fshift_rectangle = np.fft.fftshift(fft_rectangle)# 频谱
spectrum_woman = spectrum_fft(fshift_woman)
spectrum_rectangle = spectrum_fft(fshift_rectangle)# 相角
phi_woman = phase_fft(fshift_woman)
phi_rectangle = phase_fft(fshift_rectangle)# 只用相角重建,未做增强的情况
img_phase_recon = np.abs(np.fft.ifft2(np.fft.ifftshift(np.exp(phi_woman * 1j))))
# 下面这种与课本说明不符,但结果更接近增强的效果
# img_phase_recon = np.abs(np.fft.ifft2(np.fft.ifftshift(phi_woman)))# 只用频谱重建
img_spec_recon = np.abs(np.fft.ifft2(np.fft.ifftshift(spectrum_woman)))# 用女人的相角与矩形的频谱重建
f_woman_rectangle = spectrum_rectangle * np.exp(phi_woman * 1j)
img_woman_rectangle = np.abs(np.fft.ifft2(np.fft.ifftshift(f_woman_rectangle)))# 用女人的频谱与矩形的相角重建
f_woman_rectangle = spectrum_woman * np.exp(phi_rectangle * 1j)
img_rectangle_woman = np.abs(np.fft.ifft2(np.fft.ifftshift(f_woman_rectangle)))plt.figure(figsize=(15, 10))
plt.subplot(2, 3, 1), plt.imshow(img, cmap='gray'), plt.title('Original'), plt.xticks([]), plt.yticks([])
plt.subplot(2, 3, 2), plt.imshow(phi_woman, cmap='gray'), plt.title('Phase'), plt.xticks([]), plt.yticks([])
plt.subplot(2, 3, 3), plt.imshow(img_phase_recon, cmap='gray'), plt.title('Reconstruct with Phase only'),
plt.xticks([]), plt.yticks([])
plt.subplot(2, 3, 4), plt.imshow(img_spec_recon, cmap='gray'), plt.title('Reconstruct with Spectrume only'),
plt.xticks([]), plt.yticks([])
plt.subplot(2, 3, 5), plt.imshow(img_woman_rectangle, cmap='gray'), plt.title('Reconstruct with Woman Phase and Rectangle Spectrume'),
plt.xticks([]), plt.yticks([])
plt.subplot(2, 3, 6), plt.imshow(img_rectangle_woman, cmap='gray'), plt.title('Reconstruct with Woman Spectrum and Rectangle Phase'),
plt.xticks([]), plt.yticks([])
plt.tight_layout()
plt.show()

第4章 Python 数字图像处理(DIP) - 频率域滤波7 - 二维DFT和IDFT的一些性质 - 傅里叶频谱和相角相关推荐

  1. 第4章 Python 数字图像处理(DIP) - 频率域滤波6 - 二维DFT和IDFT的一些性质 - 平移和旋转、周期性、对称性

    目录 二维DFT和IDFT的一些性质 空间间隔和频率间隔的关系 平移和旋转 周期性 对称性 二维DFT和IDFT的一些性质 空间间隔和频率间隔的关系 Δu=1MΔT(4.69)\Delta u = \ ...

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

    目录 二维DFT和IDFT的一些性质 二维离散卷积定理 二维离散傅里叶变换性质的小结 二维DFT和IDFT的一些性质 二维离散卷积定理 二维循环卷积表达式: (f⋆h)(x,y)=∑m=0M−1∑n= ...

  3. 第4章 Python 数字图像处理(DIP) - 频率域滤波5 - 二变量函数的傅里叶变换、图像中的混叠、二维离散傅里叶变换及其反变换

    目录 二变量函数的傅里叶变换 二维冲激及其取样性质 二维连续傅里叶变换对 二维取样和二维取样定理 图像中的混叠 二维离散傅里叶变换及其反变换 二变量函数的傅里叶变换 二维冲激及其取样性质 两个连续变量 ...

  4. 第4章 Python 数字图像处理(DIP) - 频率域滤波10 - 使用低通频率域滤波器平滑图像 - 理想、高斯、巴特沃斯低通滤波器

    目录 使用低通频率域滤波器平滑图像 理想低通滤波器(ILPF) 高斯低通滤波器(GLPF) 巴特沃斯低通滤波器 低通滤波的例子 使用低通频率域滤波器平滑图像 理想低通滤波器(ILPF) 在以原点为中心 ...

  5. 第4章 Python 数字图像处理(DIP) - 频率域滤波11 - 使用高通滤波器锐化图像

    目录 使用高通滤波器锐化图像 由低通滤波器得到理想.高斯和巴特沃斯高通滤波器 指纹增强 频域中的拉普拉斯 钝化掩蔽.高提升滤波和高频强调滤波 同态滤波 使用高通滤波器锐化图像 由低通滤波器得到理想.高 ...

  6. 第4章 Python 数字图像处理(DIP) - 频率域滤波1 - 傅里叶级数和变换简史

    本章主要讲解频域域滤波的技术,主要技术用到是大家熟悉的傅里叶变换与傅里叶反变换.这里有比较多的篇幅讲解的傅里叶的推导进程,用到Numpy傅里叶变换.本章理论基础比较多,需要更多的耐心来阅读,有发现有错 ...

  7. 第4章 Python 数字图像处理(DIP) - 频率域滤波12 - 选择性滤波 - 带阻

    目录 选择性滤波 带阻滤波器和带通滤波器 陷波滤波器 选择性滤波 处理特定的频带的滤波器称为频带滤波器 带阻滤波器: 若某个频带中的频率被滤除 带通滤波器: 若某个频带中的频率被通过 处理小频率矩形区 ...

  8. 第4章 Python 数字图像处理(DIP) - 频率域滤波4 - 单变量的离散傅里叶变换DFT

    目录标题 单变量的离散傅里叶变换 由取样后的函数的连续变换得到DFT 取样和频率间隔的关系 单变量的离散傅里叶变换 由取样后的函数的连续变换得到DFT 对原函数的变换取样后的业的发展的变换F~(μ)\ ...

  9. 第4章 Python 数字图像处理(DIP) - 频率域滤波2 - 复数、傅里叶级数、连续单变量函数的傅里叶变换、卷积

    目录 基本概念 复数 傅里叶级数 冲激函数及其取样(筛选)性质 连续单变量函数的傅里叶变换 卷积 基本概念 复数 复数CCC的定义为 C=R+jI(4.3)C = R + jI \tag{4.3}C= ...

最新文章

  1. 面了个 32+ 岁 Java 大佬,一言难尽......
  2. R语言数据包自带数据集之survival包的colon数据集字段解释、数据导入实战
  3. 一文看懂机器视觉芯片
  4. cve-2019-6340 drupal8 rest rce 漏洞复现
  5. Linux下如何查看系统启动时间和运行时间(转)
  6. CV书单-Benjio PAMI review (up tp 2013)
  7. 利用邻接表完成图的BFS和DFS
  8. 互联网1分钟 |1130
  9. 七夕来临!来支付宝“结个婚”吧 全国5个省市可用
  10. java public_java中public,private,protected和default的区别
  11. 2016.1.20 总结(for语句,选择语句和循环语句混合使用)
  12. Taro使用wxParse富文本组件
  13. 110kv/35kv变电所无功补偿技术的研究+matlab仿真模型
  14. java hotmail日历,我用java写的日历
  15. VMware中安装win7虚拟机后共享问题的解决
  16. NW集成打包 自定义图标及注意事项
  17. CSDN:2019年度CSDN博客之星评选竞赛——105号【一个处女座的程序猿】,感谢您,投上的宝贵一票,感谢!感恩!
  18. 华为新机预装鸿蒙,华为新机来了!预装鸿蒙OS,搭载麒麟9000
  19. 工业机器人码垛教学实施_《工业机器人码垛工作站安装与调试》教学设计文本.doc...
  20. 关于在VM安装CentOS的经验总结

热门文章

  1. beta冲刺总结那周余嘉熊掌将得队
  2. centos 7 php7 yum源
  3. springboot之session、cookie
  4. VS2003,VS2005,VS2008 低版本打开高版本的解决方案和工程文件
  5. Java中abstract和interface的区别
  6. SmartGit 过期解决方案之 非商业版本安装使用
  7. docker --- 将已有的项目发布到云端
  8. 笔试小结---非对称加密算法
  9. 前端知识点梳理(一)
  10. 在django中使用celery