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()
相关推荐
学习编程的gas1 分钟前
C++面向对象编程入门:从类与对象说起(一)
开发语言·c++
冼紫菜2 分钟前
【Spring Boot 多模块项目】@MapperScan失效、MapperScannerConfigurer 报错终极解决方案
java·开发语言·mybatis
Bear on Toilet34 分钟前
Bug日记——实现“日期类”
开发语言·c++·bug
apcipot_rain38 分钟前
《面向对象程序设计-C++》实验五 虚函数的使用及抽象类
开发语言·c++
小彭律师2 小时前
数字化工厂中央控制室驾驶舱系统架构文档
python
明月看潮生3 小时前
青少年编程与数学 02-019 Rust 编程基础 05课题、复合数据类型
开发语言·青少年编程·rust·编程与数学
幼稚诠释青春3 小时前
Java学习笔记(对象)
java·开发语言
old_power3 小时前
【Python】PDF文件处理(PyPDF2、borb、fitz)
python·pdf
测试开发Kevin4 小时前
从投入产出、效率、上手难易度等角度综合对比 pytest 和 unittest 框架
python·pytest
Wyc724094 小时前
JDBC:java与数据库连接,Maven,MyBatis
java·开发语言·数据库