基于Python实现图像的傅里叶变换

目录
  • 前言
    • (1)基本概念
    • (2)读取图像信息
  • 1. 傅里叶变换
    • (1)基本概念
    • (2)numpy实现
    • (3)OpevCV实现 
  • 2. 傅里叶逆变换
    • (1)基本概念
    • (2)代码实现

前言

首先是本文总体代码,改一下图像的读取路径就可以运行了,但我还是建议大家先看后面的步骤一行行敲代码,这样效果更好:

"""
Author:XiaoMa
date:2021/11/7
"""
import cv2
import matplotlib.pyplot as plt
import numpy as np

#读取图像信息
from numpy.fft import ifftshift

img0 = cv2.imread("E:\From Zhihu\For the desk\cvthirteen2.jpg")
img1 = cv2.resize(img0, dsize = None, fx = 0.5, fy = 0.5)
img2 = cv2.cvtColor(img1, cv2.COLOR_BGR2GRAY)               #转化为灰度图
h, w = img1.shape[:2]
print(h, w)
cv2.namedWindow("W0")
cv2.imshow("W0", img2)
cv2.waitKey(delay = 0)
#将图像转化到频域内并绘制频谱图
##numpy实现
plt.rcParams['font.family'] = 'SimHei'       #将全局中文字体改为黑体
f = np.fft.fft2(img2)
fshift = np.fft.fftshift(f)   #将0频率分量移动到图像的中心
magnitude_spectrum0 = 20*np.log(np.abs(fshift))
#傅里叶逆变换
#Numpy实现
ifshift = np.fft.ifftshift(fshift)
# 将复数转为浮点数进行傅里叶频谱图显示
ifimg = np.log(np.abs(ifshift))
if_img = np.fft.ifft2(ifshift)
origin_img = np.abs(if_img)
imggroup = [img2, magnitude_spectrum0, ifimg, origin_img]
titles0 = ['原始图像', '经过移动后的频谱图', '逆变换得到的频谱图', '逆变换得到的原图']
for i in range(4):
    plt.subplot(2, 2, i + 1)
    plt.xticks([])                               #除去刻度线
    plt.yticks([])
    plt.title(titles0[i])
    plt.imshow(imggroup[i], cmap = 'gray')
plt.show()
##OpenCV实现
dft = cv2.dft(np.float32(img2), flags = cv2.DFT_COMPLEX_OUTPUT)
dft_shift = np.fft.fftshift(dft)
magnitude_spectrum1 = 20*np.log(cv2.magnitude(dft_shift[:, :, 0], dft_shift[:, :, 1]))
plt.subplot(121), plt.imshow(img2, cmap = 'gray')
plt.title('原图'), plt.xticks([]), plt.yticks([])
plt.subplot(122), plt.imshow(magnitude_spectrum1, cmap = 'gray')
plt.title('频谱图'), plt.xticks([]), plt.yticks([])
plt.show()

(1)基本概念

一般我们观察信号是直接在时域内(声音信号)或者空间内(图像)对其进行分析,这样虽然符合常理,但信号中的一些有用的条件就不会被我们考虑进去,从而达不到分析的效果,所以我们要将信号转化到其他的一些变换域中进行分析。

(2)读取图像信息

本系列文章经典操作:

"""
Author:XiaoMa
date:2021/11/7
"""
import cv2
import matplotlib.pyplot as plt
import numpy as np

#读取图像信息
img0 = cv2.imread("E:\From Zhihu\For the desk\cvthirteen2.jpg")
img1 = cv2.resize(img0, dsize = None, fx = 0.5, fy = 0.5)
img2 = cv2.cvtColor(img1, cv2.COLOR_BGR2GRAY)               #转化为灰度图
h, w = img1.shape[:2]
print(h, w)
cv2.namedWindow("W0")
cv2.imshow("W0", img1)
cv2.waitKey(delay = 0)

得到图像信息如下:

540 960 

1. 傅里叶变换

代码参考:OpenCV官网

(1)基本概念

当我们描述一段声音时,我们不仅会说它的音量的大小如何,还有可能会说它的频率是高的还是低的,那么我们该怎么理解频率这个概念呢?以前学习三角函数时我们被告知每一个正弦信号有它的固定的频率,就是它的周期的倒数。那么什么是频域呢?我们也接触过其他形状的波形,比如方波、三角波等等,而这些不同形状的波呢,就是用一个个频率不相同的正弦波组成的,如果我们将那些不同频率的正弦波按照它们的频率大小排列起来,就得到了一个频率轴(这是一维的),然后我们将各个频率对应的幅度值给它们对应起来(就像xoy平面一样)得到的二维的平面,就是频域了。傅里叶变换就是将信号从时域转化到频域的一个工具。对于傅里叶变换中的的理解可以参考下面的图片:

当然如果你想更加深入的了解傅里叶变换,你可以按照图片上的水印去搜索,他那里讲的非常清晰。 

(2)numpy实现

#将图像转化到频域内并绘制频谱图
plt.rcParams['font.family'] = 'SimHei'       #将全局中文字体改为黑体
f = np.fft.fft2(img2)
fshift = np.fft.fftshift(f)       #将0频率分量移动到中心
magnitude_spectrum = 20*np.log(np.abs(fshift))
plt.xticks([])                               #除去刻度线
plt.yticks([])
plt.title("频谱图")
plt.imshow(magnitude_spectrum, cmap = 'gray')
plt.show()

(3)OpevCV实现 

#OpenCV实现
dft = cv2.dft(np.float32(img2), flags = cv2.DFT_COMPLEX_OUTPUT)
dft_shift = np.fft.fftshift(dft)
magnitude_spectrum1 = 20*np.log(cv2.magnitude(dft_shift[:, :, 0], dft_shift[:, :, 1]))
plt.subplot(121), plt.imshow(img2, cmap = 'gray')
plt.title('原图'), plt.xticks([]), plt.yticks([])
plt.subplot(122), plt.imshow(magnitude_spectrum1, cmap = 'gray')
plt.title('频谱图'), plt.xticks([]), plt.yticks([])
plt.show()

2. 傅里叶逆变换

(1)基本概念

前面提到,经过傅里叶变换图像可以转化到频域内,那么经过傅里叶逆变换,图像肯定能从频域内转化到时域中,所以傅里叶逆变换就是将信号从频域转化到时域的工具。

(2)代码实现

此处的代码接上面的使用 Numpy 进行傅里叶变换

#傅里叶逆变换
#Numpy实现
ifshift = np.fft.ifftshift(fshift)
# 将复数转为浮点数进行傅里叶频谱图显示
ifimg = np.log(np.abs(ifshift))
if_img = np.fft.ifft2(ifshift)
origin_img = np.abs(if_img)
imggroup = [img2, magnitude_spectrum0, ifimg, origin_img]
titles0 = ['原始图像', '经过移动后的频谱图', '逆变换得到的频谱图', '逆变换得到的原图']
for i in range(4):
    plt.subplot(2, 2, i + 1)
    plt.xticks([])                               #除去刻度线
    plt.yticks([])
    plt.title(titles0[i])
    plt.imshow(imggroup[i], cmap = 'gray')
plt.show()

到此这篇关于基于Python实现图像的傅里叶变换的文章就介绍到这了,更多相关Python图像傅里叶变换内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Python实现快速傅里叶变换的方法(FFT)

    本文介绍了Python实现快速傅里叶变换的方法(FFT),分享给大家,具体如下: 这里做一下记录,关于FFT就不做介绍了,直接贴上代码,有详细注释的了: import numpy as np from scipy.fftpack import fft,ifft import matplotlib.pyplot as plt import seaborn #采样点选择1400个,因为设置的信号频率分量最高为600赫兹,根据采样定理知采样频率要大于信号频率2倍,所以这里设置采样频率为1400赫兹(即

  • opencv python 傅里叶变换的使用

    理论 傅立叶变换用于分析各种滤波器的频率特性,对于图像,2D离散傅里叶变换(DFT)用于找到频域.快速傅里叶变换(FFT)的快速算法用于计算DFT. 于一个正弦信号,x(t)=Asin(2πft),我们可以说 f 是信号的频率,如果它的频率域被接受,我们可以看到 f 的峰值.如果信号被采样来形成一个离散信号,我们得到相同的频率域,但是在[−π,π] or [0,2π]范围内是周期性的 (or [0,N] for N-point DFT). 可以将图像视为在两个方向上采样的信号.因此,在X和Y方向

  • python用opencv 图像傅里叶变换

    傅里叶变换 dft = cv.dft(np.float32(img),flags = cv.DFT_COMPLEX_OUTPUT) 傅里叶逆变换 img_back = cv.idft(f_ishift) 实验:将图像转换到频率域,低通滤波,将频率域转回到时域,显示图像 import numpy as np import cv2 as cv from matplotlib import pyplot as plt img = cv.imread('d:/paojie_g.jpg',0) rows,

  • python傅里叶变换FFT绘制频谱图

    本文实例为大家分享了python傅里叶变换FFT绘制频谱图的具体代码,供大家参考,具体内容如下 频谱图的横轴表示的是 频率, 纵轴表示的是振幅 #coding=gbk import numpy as np import pandas as pd import matplotlib.pyplot as plt #依据快速傅里叶算法得到信号的频域 def test_fft(): sampling_rate = 8000 #采样率 fft_size = 8000 #FFT长度 t = np.arang

  • OpenCV-Python使用cv2实现傅里叶变换

    前言 在前一篇的博文中,我们详细讲解了傅里叶变换的原理以及使用Numpy库实现傅里叶变换.但是其实OpenCV有直接实现傅里叶变换的函数. 在OpenCV中,我们通过cv2.dft()来实现傅里叶变换,使用cv2.idft()来实现逆傅里叶变换.两个函数的定义如下: cv2.dft(原始图像,转换标识) 这里的原始图像必须是np.float32格式.所以,我们首先需要使用cv2.float32()函数将图像转换.而转换标识的值通常为cv2.DFT_COMPLEX_OUTPUT,用来输出一个复数阵

  • 使用python实现离散时间傅里叶变换的方法

    我们经常使用傅里叶变换来计算数字信号的频谱,进而分析数字信号,离散时间傅里叶变换的公式为: 可是自己动手实现一遍才是最好的学习. 在数字分析里面,傅里叶变换默认等时间间隔采样,不需要时间序列,只需要信号数组即可分析. 分析过程如下: 对于含有 n 个样本值的数字信号序列,根据奈奎斯特采样定律,包含的周期数最大为 n/2,周期数为 0 代表直流分量.所以,当周期数表示为离散的 0,1,2,3-n/2 ,总的数目为 n/2+1个 傅里叶变换之后的结果为复数, 下标为 k 的复数 a+b*j 表示时域

  • 基于Python实现图像的傅里叶变换

    目录 前言 (1)基本概念 (2)读取图像信息 1. 傅里叶变换 (1)基本概念 (2)numpy实现 (3)OpevCV实现  2. 傅里叶逆变换 (1)基本概念 (2)代码实现 前言 首先是本文总体代码,改一下图像的读取路径就可以运行了,但我还是建议大家先看后面的步骤一行行敲代码,这样效果更好: """ Author:XiaoMa date:2021/11/7 """ import cv2 import matplotlib.pyplot a

  • 详解基于python的图像Gabor变换及特征提取

    1.前言 在深度学习出来之前,图像识别领域北有"Gabor帮主",南有"SIFT慕容小哥".目前,深度学习技术可以利用CNN网络和大数据样本搞事情,从而取替"Gabor帮主"和"SIFT慕容小哥"的江湖地位.但,在没有大数据和算力支撑的"乡村小镇"地带,或是对付"刁民小辈","Gabor帮主"可以大显身手,具有不可撼动的地位.IT武林中,有基于C++和OpenCV,或

  • 基于Python的图像阈值化分割(迭代法)

    1.阈值化分割原理 通过对图像的灰度直方图进行数学统计,选择一个或多个阈值将像素划分为若干类.一般情况下,当图像由灰度值相差较大的目标和背景组成时,如果目标区域内部像素灰度分布均匀一致,背景区域像素在另一个灰度级上也分布均匀,这时图像的灰度直方图会呈现出双峰特性. 在这种情况下,选取位于这两个峰值中间的谷底对应的灰度值T作为灰度阈值,将图像中各个像素的灰度值与这个阈值进行比较,根据比较的结果将图像中的像素划分到两个类中.像素灰度值大于阈值T的像素点归为一类,其余像素点归为另一类.经阈值化处理后的

  • 基于Python实现图像文字识别OCR工具

    目录 引言 功能列表 OCR部分 界面部分 软件代码 参考链接 引言 最近在技术交流群里聊到一个关于图像文字识别的需求,在工作.生活中常常会用到,比如票据.漫画.扫描件.照片的文本提取. 博主基于 PyQt + PaddleOCR 写了一个桌面端的OCR工具,用于快速实现图片中文本区域自动检测+文本自动识别. 识别效果如下图所示: 所有框选区域为OCR算法自动检测,右侧列表有每个框对应的文字内容: 点击右侧"识别结果"中的文本记录,然后点击"复制到剪贴板"即可复制该

  • 基于Python制作图像完美超分处理工具

    目录 前言 安装 使用 图片超分 视频超分 项目说明 代码说明 总结 前言 很久没更新这个专栏了,最近比较忙.前段时间看到了这个模型觉着很有意思,弄下来自己玩了玩,但是没时间写文章,一直搁置到现在. 废话不多说,先上Github地址: RealBasicVSR地址 从给出的效果来看,还是很不错的,左侧是超分后的画面,右边是原画质,得到明显提升.下面我说一下我的安装过程,还有一些使用中的踩坑,让大家去测试项目的时候可以提前规避. 安装 项目拉下来之后,我们先打开README,看看说明. 安装的步骤

  • 基于python读取图像的几种方式汇总

    目录 本文介绍几种基于python的图像读取方式: 基于PIL库的图像读取.保存和显示 基于matplotlib的图像读取.显示和保存 基于scikit-image的图像读取.保存和显示 基于imageio的图像读取.显示和保存 总结 本文介绍几种基于python的图像读取方式: 基于PIL库的图像读取.保存和显示 基于opencv-python的图像读取.保存和显示 基于matplotlib的图像读取.保存和显示 基于scikit-image的图像读取.保存和显示 基于imageio的图像读取

  • 基于Python的图像数据增强Data Augmentation解析

    1.1 简介 深层神经网络一般都需要大量的训练数据才能获得比较理想的结果.在数据量有限的情况下,可以通过数据增强(Data Augmentation)来增加训练样本的多样性, 提高模型鲁棒性,避免过拟合. 在计算机视觉中,典型的数据增强方法有翻转(Flip),旋转(Rotat ),缩放(Scale),随机裁剪或补零(Random Crop or Pad),色彩抖动(Color jittering),加噪声(Noise) 笔者在跟进视频及图像中的人体姿态检测和关键点追踪(Human Pose Es

  • Python基于opencv的图像压缩算法实例分析

    本文实例讲述了Python基于opencv的图像压缩算法.分享给大家供大家参考,具体如下: 插值方法: CV_INTER_NN - 最近邻插值, CV_INTER_LINEAR - 双线性插值 (缺省使用) CV_INTER_AREA - 使用象素关系重采样.当图像缩小时候,该方法可以避免波纹出现.当图像放大时,类似于 CV_INTER_NN 方法.. CV_INTER_CUBIC - 立方插值. 函数 cvResize 将图像 src 改变尺寸得到与 dst 同样大小.若设定 ROI,函数将按

  • python 基于opencv 绘制图像轮廓

    图像轮廓概念 轮廓是一系列相连的点组成的曲线,代表了物体的基本外形. 谈起轮廓不免想到边缘,它们确实很像.简单的说,轮廓是连续的,边缘并不全都连续(下图).其实边缘主要是作为图像的特征使用,比如可以用边缘特征可以区分脸和手:而轮廓主要用来分析物体的形态,比如物体的周长和面积等,可以说边缘包括轮廓. 寻找轮廓的操作一般用于二值图像,所以通常会使用阈值分割或Canny边缘检测先得到二值图. 注意:寻找轮廓是针对白色物体的,一定要保证物体是白色,而背景是黑色,不然很多人在寻找轮廓时会找到图片最外面的一

  • python基于opencv 实现图像时钟

    解决方案详解 绘制表盘 表盘上只有60条分/秒刻线和12条小时刻线,当然还有表盘的外部轮廓圆,也就是重点在如何画72根线.先把简单的圆画出来: import cv2 as cv import math import datetime import numpy as np margin = 5 # 上下左右边距 radius = 220 # 圆的半径 center = (center_x, center_y) = (225, 225) # 圆心 # 1. 新建一个画板并填充成白色 img = np

随机推荐