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

目录

    • 二维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)=MNfˉ,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()

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/260713.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

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

目录二维DFT和IDFT的一些性质二维离散卷积定理二维离散傅里叶变换性质的小结二维DFT和IDFT的一些性质 二维离散卷积定理 二维循环卷积表达式: (f⋆h)(x,y)∑m0M−1∑n0N−1f(m,n)h(x−m,y−n)(4.94)(f \star h)(x, y) \sum_{m0}^{M-1} \sum_{n0}^{N-1} f(m,n)h(x…

jmeter中重定向多个正则表达式_2020年jmeter技术实战续集,最新技术全栈,值得收藏

在上一篇:主要介绍线程组、HTTP请求默认值、用户定义的变量、固定定时器的应用场景及实战。以下主要介绍正则表达式提取器、调式取样器(Debug Sampler)、响应断言、HTTP信息头管理器的应用场景及实战。一、正则表达式提取器1、使用场景从请求的响应结果中取到需要的…

[置顶] 均衡音效

[置顶] 均衡音效 1均衡的作用 均衡器是一种可以分别调节各种频率成分电信号放大量的电子设备,通过对各种不同频率的电信号的调节来补偿扬声器和声场的缺陷,补偿和修饰各种声源及其它特殊作用。具体来说,它的作用如下: &#xff08…

第4章 Python 数字图像处理(DIP) - 频率域滤波9 - 频率域滤波基础、频率域的滤波过程、低通、高通

目录频率域滤波基础频率域的其他特性频率域滤波基础知识频率域滤波步骤小结空间域和频率域滤波之间的对应关系频率域滤波基础 频率域的其他特性 频率域中的滤波过程如下: 首先修改傅里叶变换以在到特定目的然后计算IDFT,返回到空间域 # 频率域中的其…

C# :试玩EventLog

1. 专门创建Source的Log   创建了Source,log显示在 Event viewer/Applications and Services logs/ 自定义Source 中,待遇比较高,专门显示的。 创建Source需要管理员身份,否则Crash。 如果已经打开了 Computer Management,请关闭…

css 宋体_Java前端基础(一)之html/css

1.1 htmlHTML:超文本标记语言(Hyper Text Markup Language),标准通用标记语言下的一个应用。HTML 不是一种编程语言,而是一种标记语言 (markup language),是网页制作所必备的WEB开发工具:hbuilder/webstorm/vs code/eclpise最简单…

gpio的8种工作模式_Stm32之GPIO工作模式简介

GPIO的8种工作模式GPIO初始化结构体的时候,必须要配置合适的工作模式,这样才能使得IO口发挥应有的作用。工作模式大体上共分为输入输出两类,共8种,下面将介绍这8种工作模式。GPIO工作模式输入模式GPIO_Mode_AIN 模拟输入 GPIO_Mod…

vagrant,流浪汉,我又来啦。

最近学个DEVOPS2.0,讲微服务,容器华,持续部署,很到位,就一个一个工具撸一撸。。。 vagrant,以前接触过,所以上手快,,哈哈,,用时再具体配置。 virt…

dedecms最新版本修改任意管理员漏洞

此漏洞无视gpc转义,过80sec注入防御。 补充下,不用担心后台找不到。这只是一个demo,都能修改任意数据库了,还怕拿不到SHELL? 起因是全局变量$GLOBALS可以被任意修改,随便看了下,漏洞一堆&#x…

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

目录使用低通频率域滤波器平滑图像理想低通滤波器(ILPF)高斯低通滤波器(GLPF)巴特沃斯低通滤波器低通滤波的例子使用低通频率域滤波器平滑图像 理想低通滤波器(ILPF) 在以原点为中心的一个圆内无衰减地通过所有频率,而在这个圆外“截止”所有的频率的二维低通滤波…

bluecam连接步骤说明_厂家详解旋片式真空泵使用说明

旋片式真空泵是有区分单双极高速直联结构的真空泵,是用来对密封容器抽除气体的基本设备之一。旋片式真空泵的泵与电机连轴,有着高转速、外型小、结构紧凑、流动性工作方便的优点。本文所使用旋片式真空泵使用说明资料,是台冠真空泵技术团队工…

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

目录使用高通滤波器锐化图像由低通滤波器得到理想、高斯和巴特沃斯高通滤波器指纹增强频域中的拉普拉斯钝化掩蔽、高提升滤波和高频强调滤波同态滤波使用高通滤波器锐化图像 由低通滤波器得到理想、高斯和巴特沃斯高通滤波器 HHP(u,v)1−HLP(u,v)(4.118)H_{HP}(u, v) 1 - H_{…

漫步者lollipods如何调节音量_漫步者MF5扩音器体验:老师值得入手

对于教师职业来说,保护好嗓子是很重要的。每天为学生操劳,频繁的讲课,很多老师都遇上了喉咙沙哑的问题。怎么样才能保护好老师的嗓子呢?“小蜜蜂”是很多老师们的选择,这种扩音器可以挂在腰间,通过麦克风&a…

pandas删除某列有空值的行_Python-零基础学习Pandas知识点整理(2)

DataFrame数据的清洗--预处理操作import pandas as pdimport numpy as np#DataFrame数据框行或列的删除#df.drop(labelsNone,axis0,indexNone,columnsNone,levelNone,inplaceFalse,error"raise")#labels 表示需要删除的行或列的标签,多行或多列用列表传入…

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

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

python打包工具报错_python打包生成exe报错

如图所示 如果出现的是这个问题可以可以考虑以下方法 首先卸载原先下载的 Pyinstaller pip uninstall pyinstaller 再执行以下代码,去github上下载 pip install https://github.com/pyinstaller/pyinstaller/archive/develop.zip 注释:再次打包&#xff…

去除lcd图片的摩尔纹_宝妈时尚产后有妊娠纹怎么办?教你这三招,轻松修复肚皮!...

产后肚子上长妊娠纹,相信是很多妈妈的痛点。首先我们来介绍一下什么是妊娠纹。由于妊娠期荷尔蒙的影响,加之腹部膨隆使皮肤的弹力纤维与胶原纤维损伤或断裂,腹部皮肤变薄变细,出现一些宽窄不同、长短不一的粉红色或紫红色的波浪状…

anaconda 换清华镜像源 windows

方法1 Windows 下安装好Anaconda 应该会有如下这些应用,我们打开如下图anaconda Prompt(下面简称prompt),(当然CMD也可以,只是我比较喜欢用prompt) 打开如下图 使用下面命令,即可以添加清华镜像 conda config --add channels …

提高表格可读性的一些技巧

表格的应用由于工作原因,经常接触到表格。我们发现,表格不但广泛的运用在各类数据收集和分析,同时通过表格这样一种二维矩阵来整理和陈列信息时(即便最后的展示方式并非一个典型的表格样式),能够很好的表达…

分页第一页用0还是1_如何设计api分页

常规的分页方式API处理分页看似简单,实际上暗藏危机。最常见的分页方式,大概是下面这样的/users/?page1&limit5//服务端返回最理想的情况下,客户端请求第一页的5条数据,服务端如常返回,比如下图:拿Twitter的图用一…