Python+OpenCV(1)---傅里叶变换

一,傅里叶变换原理

傅里叶的原理表明,任何连续测量的时序或信号,都可以表示为不同频率的正弦波信号的无限叠加。利用傅立叶变换算法直接测量原始信号,以累加方式来计算该信号中不同正弦波信号的频率振幅相位就可以表示原始信号。

二,傅里叶变换

python 复制代码
import cv2
import numpy as np
import matplotlib.pyplot as plt
# 读取图像
o=cv2.imread("test.png",0)
# 傅里叶变换
f=np.fft.fft2(o)
# 傅里叶变换后,将低频部分移到中心位置
fshift=np.fft.fftshift(f)
# 傅里叶逆变换 转到0-255
result=20*np.log(np.abs(fshift))
# 显示图像  1行2列,的第一列
plt.subplot(121)
# 原始图像
plt.imshow(o,cmap='gray')
# 傅里叶变换结果
plt.title('original')
# 关闭坐标轴
#plt.axis('off')

# 显示图像  1行2列的第二列
plt.subplot(122)
# 傅里叶变换结果
plt.imshow(result,cmap='gray')
# 傅里叶变换结果
plt.title('result')
# 关闭坐标轴
#plt.axis('off')
# 显示图像
plt.show()

三,逆傅里叶变换

python 复制代码
import cv2
import numpy as np
import matplotlib.pyplot as plt
#加载图像
o=cv2.imread('test.png', cv2.IMREAD_UNCHANGED)
#傅里叶变换
f=np.fft.fft2(o)
#傅里叶变换后,将低频部分移到中心位置
fshift=np.fft.fftshift(f)
#傅里叶逆变换
ishift=np.fft.ifftshift(fshift)
#傅里叶逆变换
io=np.fft.ifft2(ishift)
#取绝对值
io=np.abs(io)

#显示图像
plt.subplot(121)
#原始图像
plt.imshow(o,cmap='gray')
#原始图像的标题
plt.title('original')
#原始图像的坐标轴不显示
plt.axis('off')

#显示图像
plt.subplot(122)
#傅里叶变换结果图像
plt.imshow(io,cmap='gray')
#傅里叶变换结果图像的标题
plt.title('result')
#傅里叶变换结果图像的坐标轴不显示
plt.axis('off')
#显示图像
plt.show()

四,高通滤波

高频对应图像内变化越来越快的灰度分量,是由灰度的尖锐过渡造成的。例如,在一幅大草原的图像中,其中狮子的边缘等信息。

python 复制代码
# 傅里叶 高通滤波
# 
import cv2
import numpy as np
import matplotlib.pyplot as plt
o=cv2.imread('test.png',0)
# 傅里叶变换
f=np.fft.fft2(o)
# 傅里叶变换后,将低频部分移到中心位置
fshift=np.fft.fftshift(f)
# 高通滤波
rows,cols=o.shape
# 中心位置
crow,ccol=int(rows/2),int(cols/2)
# 高通滤波,将低频部分置零 (中心部分)
fshift[crow-30:crow+30,ccol-30:ccol+30]=0
# 傅里叶逆变换
ishift=np.fft.ifftshift(fshift)
# 傅里叶逆变换
io=np.fft.ifft2(ishift)
# 取绝对值
io=np.abs(io)
# 显示图像
plt.subplot(121)
plt.imshow(o,cmap='gray')
# 显示图像
plt.subplot(122)
plt.imshow(io,cmap='gray')
plt.show()

五,低通滤波

低频对应图像内变化缓慢的灰度分量。例如,在一幅大草原的图像中,低频对应着广袤的颜色趋于一致的草原。

python 复制代码
import cv2
import numpy as np
import matplotlib.pyplot as plt
o=cv2.imread("test.png",0)
dft=cv2.dft(np.float32(o),flags=cv2.DFT_COMPLEX_OUTPUT)
dshift=np.fft.fftshift(dft)
rs,cs=o.shape
cr,cc=int(rs/2),int(cs/2)
mask=np.zeros((rs,cs,2),np.int8)
mask[cr-30:cr+30,cc-30:cc+30]=1
md=dshift*mask
imd=np.fft.ifftshift(md)
io=cv2.idft(imd)
i0=cv2.magnitude(io[:,:,0],io[:,:,1])

# 原图像
plt.subplot(121)
plt.imshow(o,cmap='Grays')
plt.axis('off')
plt.title('original')

# 频域处理后图像
plt.subplot(122)
plt.imshow(io ,cmap='Grays')
plt.axis('off')
plt.title('result')
plt.show()
相关推荐
朝新_9 分钟前
【多线程初阶】阻塞队列 & 生产者消费者模型
java·开发语言·javaee
立莹Sir11 分钟前
Calendar类日期设置进位问题
java·开发语言
风逸hhh1 小时前
python打卡day46@浙大疏锦行
开发语言·python
火兮明兮2 小时前
Python训练第四十三天
开发语言·python
ascarl20102 小时前
准确--k8s cgroup问题排查
java·开发语言
互联网杂货铺3 小时前
完美搭建appium自动化环境
自动化测试·软件测试·python·测试工具·职场和发展·appium·测试用例
Gyoku Mint3 小时前
机器学习×第二卷:概念下篇——她不再只是模仿,而是开始决定怎么靠近你
人工智能·python·算法·机器学习·pandas·ai编程·matplotlib
fpcc3 小时前
跟我学c++中级篇——理解类型推导和C++不同版本的支持
开发语言·c++
莱茵菜苗3 小时前
Python打卡训练营day46——2025.06.06
开发语言·python
爱学习的小道长3 小时前
Python 构建法律DeepSeek RAG
开发语言·python