【无标题】opencv傅里叶变换

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

傅里叶原理表明:任何连续测量的时序或信号,都可以表示为不同频率的正弦波信号的无限叠加。

一、opencv自带函数实现傅里叶变换和逆傅里叶变换

import cv2
import numpy as np
from matplotlib import pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei']   #字体

# Opencv 中主要通过 cv2.dft 和 cv2.idft(傅里叶逆变换),在输入图像之前需要先转换成把图像从 np.uint8 转换为 np.float32 格式,
# 其得到的结果中频率为 0 的部分会在左上角,要转换到中心位置,
# 通过 shift 变换来实现,与 numpy 一致,cv2.dif 返回的结果是双通道的(实部,虚部),还需要转换成图像格式才能展示.


src = cv2.imread('./mei.png',0)

# OpneCV傅里叶变换函数
# 需要将图像进行一次float转换    # 类似f = np.fft.fft2(img)
result = cv2.dft(np.float32(src), flags=cv2.DFT_COMPLEX_OUTPUT)
# 将频谱低频从左上角移动至中心位置
dft_shift = np.fft.fftshift(result)
# 频谱图像双通道复数转换为 0-255 区间  使用cv2.magnitude将实部和虚部转换为实部,乘以20是为了使得结果更大
result = 20 * np.log(cv2.magnitude(dft_shift[:, :, 0], dft_shift[:, :, 1]))

print(result)

rows, cols = src.shape
crow, ccol = rows//2, cols//2

#高通滤波
mask = np.ones((rows, cols,2), np.uint8)
mask[crow-30:crow+30, ccol-30:ccol+30] =0
#低通滤波
# mask = np.zeros((rows, cols, 2), np.uint8)
# mask[int(crow-30):int(crow+30), int(ccol-30):int(ccol+30)] = 1
#  LPF(低通滤波)
fshift = dft_shift*mask
f_ishift = np.fft.ifftshift(fshift)
img_back = cv2.idft(f_ishift)
#将复数结果转换为幅值  参数1:浮点型X坐标值,也就是实部
#参数2:浮点型Y坐标值,也就是虚部
img_back = cv2.magnitude(img_back[:, :, 0], img_back[:, :, 1])

# 图像显示
plt.subplot(141), plt.imshow(src, 'gray'), plt.title('原图')
plt.axis('off')
plt.subplot(142), plt.imshow(mask[:,:,0], "gray"), plt.title('mask')
plt.axis('off')
plt.subplot(143), plt.imshow(result, 'gray'), plt.title('fourier_img')
plt.axis('off')
plt.subplot(144), plt.imshow(img_back, 'gray'), plt.title('dft_img')
plt.axis('off')
plt.show()

在这里插入图片描述

二、使用numpy实现傅里叶变换和逆傅里叶变换

import cv2 as cv
import numpy as np
from matplotlib import pyplot as plt


#高通滤波只需改变掩莫数据
# mask = np.ones((rows, cols), np.uint8)
# mask[crow-30:crow+30, ccol-30:ccol+30] = 0



# 实现傅里叶变换的低通滤波
src = cv.imread('./mei.png', 0)
f = np.fft.fft2(src)
fshift = np.fft.fftshift(f)

rows, cols = src.shape
crow, ccol = rows//2, cols//2

# 制定掩模,大小和图像一样,np.zeros初始化
mask = np.zeros((rows, cols), np.uint8)
# 使中心位置,上下左右距离30,置为1       增加低通滤波
mask[crow-30:crow+30, ccol-30:ccol+30] =1

# 掩模与 DFT 后结果相乘只保留出中间区域
fshift = fshift*mask

# 逆傅里叶变换
ifshift = np.fft.ifftshift(fshift)
# 将复数转为浮点数进行傅里叶频谱图显示
ifimg = np.fft.ifft2(ifshift)
dft_img = np.abs(ifimg)


# 图像显示
plt.subplot(221), plt.imshow(src, "gray"), plt.title('origin')
plt.axis('off')
plt.subplot(222), plt.imshow(dft_img, "gray"), plt.title('dft_img')
plt.axis('off')
plt.subplot(223),plt.imshow(mask,"gray")
plt.show()

在这里插入图片描述


总结

图像opencv傅里叶变换的方法有opencv自带函数,和numpy两种方式,同时结合mask掩码学习,掌握高通滤波和低通滤波

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值