⚠申明: 未经许可,禁止以任何形式转载,若要引用,请标注链接地址。 全文共计3077字,阅读大概需要3分钟
🌈更多学习内容, 欢迎👏关注👀【文末】我的个人微信公众号:不懂开发的程序猿
个人网站:https://jerry-jy.co/❗❗❗知识付费,🈲止白嫖,有需要请后台私信或【文末】个人微信公众号联系我
基于OpenCv的图像傅里叶变换
- 基于OpenCv的图像傅里叶变换
- 任务需求
- 任务目标
- 1、掌握图像的傅里叶变换
- 2、掌握使用低通滤波使图像模糊
- 3、掌握使用高通滤波使图像细节增强
- 任务环境
- 1、jupyter开发环境
- 2、OpenCv
- 3、python3.6
- 任务实施过程
- 一、图像的傅里叶变换
- 1.导入所需要的工具包和读取图像
- 2.图像傅里叶变换
- 3.低通滤波
- 4.高通滤波
- 二、任务小结
- 说明
基于OpenCv的图像傅里叶变换
任务需求
傅里叶变换将原来难以处理的时域信号转换成了易于分析的频域信号,可以利用一些工具对这些频域信号进行处理、加工。最后还可以利用傅里叶反变换将这些频域信号转换成时域信号。
图像经过傅里叶变换后,大部分能力都分布于低频谱段,这对以后图像的压缩、传输都比较有利。如下图为不同图像的经过傅里叶变换后的频谱图。
任务目标
1、掌握图像的傅里叶变换
2、掌握使用低通滤波使图像模糊
3、掌握使用高通滤波使图像细节增强
任务环境
1、jupyter开发环境
2、OpenCv
3、python3.6
任务实施过程
一、图像的傅里叶变换
傅里叶变换,可以将时域转换成频域。
- 低通滤波:让低频信息通过,过滤高频信息,会使得图像模糊
- 高通滤波:让高频信息通过,过滤低频信息,会使得图像细节增强
1.导入所需要的工具包和读取图像
import cv2 # 导入opencv
import matplotlib.pyplot as plt # 导入绘图模块
import numpy as np # 导入numpy库
from utils import im_show # 导入显示图像函数
# 绘制图像直接展示,不用调用plt.show()
%matplotlib inline
# 用来正常显示中文标签
plt.rc('font',family="SimHei")
# 读取图像,0表示按单通道的方式读入图像,即灰度图像
img = cv2.imread(r'./experiment/data/lena.jpg',0)
plt.figure(figsize=(6,6))
im_show('图像', img)
2.图像傅里叶变换
cv2.dft(img, flags =cv2.DFT_COMPLEX_OUTPUT) 傅里叶变换
- img:输入的图片
- cv2.DFT_COMPLEX_OUTPUT表示进行傅里叶变换的方法
np.fft.fftshift(img) 将图像中的低频部分移动到图像的中心
- img:输入的图片
cv2.magnitude(x, y) 将sqrt(x^2 + y^2) 计算矩阵维度的平方根
参数说明:需要进行x和y平方的数
# 1.进行float32形式转换(dft()函数输入图像需要先转换成np.float32 格式)
img_float32 = np.float32(img)
# 2.使用cv2.dft()进行傅里叶变换,dft()返回的结果是双通道的(实部,虚部)
dft = cv2.dft(img_float32, flags = cv2.DFT_COMPLEX_OUTPUT)
# 3.使用np.fft.fftshift()将变换后的图像的低频转移到中心位置
dft_shift = np.fft.fftshift(dft)
# 4.使用cv2.magnitude()函数将dft()返回的实部和虚部转换成图像格式(0-255),乘以20是为了使得结果更大
img_dft = 20*np.log(cv2.magnitude(dft_shift[:,:,0],dft_shift[:,:,1]))
# 5.绘图
plt.figure(figsize=(12,12))
plt.subplot(121)
im_show('输入图像', img)
plt.subplot(122)
im_show('频谱图',img_dft)
- 1.振幅谱中越靠近中心亮点,表示该点对应频率的幅值越大。
- 2.频谱图上的各点与图像上各点不存在对应的关系。
3.低通滤波
让低频信息通过,过滤高频信息,会使得图像模糊
# 使用掩模只保留低通
# 1.读取图像
img = cv2.imread(r'./experiment/data/lena.jpg', 0)
# 2.进行float32形式转换
img_float = np.float32(img)
# 3.使用cv2.dft()进行傅里叶变换
dft = cv2.dft(img_float, flags=cv2.DFT_COMPLEX_OUTPUT)
# 4.使用np.fft.fftshift()将变换后的图像的低频转移到中心位置
dft_center = np.fft.fftshift(dft)
# 5.定义掩模:生成的掩模中间为1周围为0
# 求得图像的中心点位置
crow, ccol = int(img.shape[0] / 2), int(img.shape[1] / 2)
# 创建一个全为0的数组,设置数据类型为np.uint8
mask = np.zeros((img.shape[0], img.shape[1], 2), np.uint8)
# 中心上取30,下取3,左取30,右取30,设置为1
mask[crow-30:crow+30, ccol-30:ccol+30] = 1
# 6.将掩模与傅里叶变化后图像相乘,保留中间部分(低频部分)
mask_img = dft_center * mask
# 7.使用np.fft.ifftshift()将低频移动到原来的位置
img_idf = np.fft.ifftshift(mask_img)
# 8.使用cv2.idft进行傅里叶的反变换
img_idf = cv2.idft(img_idf)
# 9.使用cv2.magnitude转换成图像格式
img_idf = cv2.magnitude(img_idf[:, :, 0], img_idf[:, :, 1])
# 10.绘图
plt.figure(figsize=(12,12))
plt.subplot(121)
im_show('原图',img)
plt.subplot(122)
im_show('低通滤波后',img_idf)
plt.show()
4.高通滤波
让高频信息通过,过滤低频信息,会使得图像细节增强
# 使用掩模只保留高通
# 1.读取图像
img = cv2.imread(r'./experiment/data/lena.jpg', 0)
# 2.进行float32形式转换
img_float = np.float32(img)
# 3.使用cv2.dft()进行傅里叶变换
dft = cv2.dft(img_float, flags=cv2.DFT_COMPLEX_OUTPUT)
# 4.使用np.fft.fftshift()将变换后的图像的低频转移到中心位置
dft_center = np.fft.fftshift(dft)
# 5.定义掩模:生成的掩模中间为0周围为1
# 求得图像的中心点位置
crow, ccol = int(img.shape[0] / 2), int(img.shape[1] / 2)
# 创建一个全为1的数组,设置数据类型为np.uint8
mask = np.ones((img.shape[0], img.shape[1], 2), np.uint8)
# 中心上取30,下取3,左取30,右取30,设置为0
mask[crow-30:crow+30, ccol-30:ccol+30] = 0
# 6.将掩模与傅里叶变化后图像相乘,保留中间部分(低频部分)
mask_img = dft_center * mask
# 7.使用np.fft.ifftshift()将低频移动到原来的位置
img_idf = np.fft.ifftshift(mask_img)
# 8.使用cv2.idft进行傅里叶的反变换
img_idf = cv2.idft(img_idf)
# 9.使用cv2.magnitude转换成图像格式
img_idf = cv2.magnitude(img_idf[:, :, 0], img_idf[:, :, 1])
# 10.绘图
plt.figure(figsize=(12,12))
plt.subplot(121)
im_show('原图',img)
plt.subplot(122)
im_show('高通滤波后',img_idf)
二、任务小结
本次实验主要完成基于OpenCv的傅里叶变换。通过低通和高通滤波完成图像去噪和图像增强的作用。
通过本次实验需要掌握以下内容:
- 1.掌握使用低通滤波使图像模糊
- 2.掌握使用高通滤波使图像细节增强
–end–
说明
本实验(项目)/论文若有需要,请后台私信或【文末】个人微信公众号联系我