傅里叶变换原理---OpenCV-Python开发指南(31)

简介: 傅里叶变换原理---OpenCV-Python开发指南(31)

前言


要理解傅里叶变换,我们首先需要了解图像处理。在图像处理的过程中,一般分为空间域处理和频率域处理。


空间域处理是直接对图像内的像素进行处理。空间域处理主要划分为灰度变换和空间滤波两种形式。灰度变换是对图像内的单个像素进行处理,比如调节对比度和处理阈值等。控制滤波处理涉及图像质量的改变,例如前面的图像平滑处理。空间域处理的优点:计算简单方便,运算速度更快


频率域处理时先将图像变换到频率域,然后在频率域对图像进行处理,最后在通过反变换将图像从频率域变换到空间域。傅里叶变换是应用最广泛的一种频率域变换,它能够将图像从空间域变换到频率域,而逆傅里叶变换能够将频率域信息变换到空间域内。


傅里叶变化


法国数学家傅里叶指出,任何周期函数都可以表示为不同频率的正弦函数和的形式。


在图像的处理中,傅里叶变换就是将图像分解为正弦分量和余弦分量两部分,即将图像从空间域转换到频率域。数字图像经过傅里叶变化后,得到的频率域的值是复数。因此显示傅里叶变换的结果需要使用实数图像加虚数图像,或者幅度图像加相位图像的形式。


因为幅度图像包含了原图像中我们所需要的大部分信息,所以在图像的处理过程中,通常仅使用幅度图像。当然,如果希望先在频率域内对图像进行处理,再通过傅里叶变换得到修改后的空间域图像,就必须同时保留幅度图像和相位图像。


对图像进行傅里叶变换后,我们会得到图像中的低频与高频信息。低频信息对应图像内变化缓慢的灰度分量。高频信息对应图像内变换越来越快的灰度分量,是由灰度的尖锐过度造成的。例如,在一副大草原的图像中有一头狮子,低频信息就对应着广袤的草原,而高频信息对应着狮子的轮廓等各种边界及噪声信息。


傅里叶变换的作用,就是为了将图像从空域转换到频域,并在频率域内实现对图像内特定对象的处理,然后再对经过处理的频率域图像进行逆傅里叶变换得到空间域图像。其主要用处包括:图像增强,图像去噪,边缘检测,特征提取,图像压缩,图像加密等。


实现傅里叶变化


在Numpy包中,它给我们提供了numpy.fft.fft2()函数实现傅里叶变换。其完整定义如下:

def fft2(原始图像):

需要注意的是,原始图像必须是灰度图像,其返回值是ndarray类型。


下面,我们来实现傅里叶变换,并观察得到的频谱图像:

import cv2
import numpy as np
import matplotlib.pyplot as plt
img = cv2.imread("4.jpg", 0)#1
f = np.fft.fft2(img)#2
fshift = np.fft.fftshift(f)#3
spectrum = 20 * np.log(np.abs(fshift))#4
#5
plt.subplot(121)
plt.imshow(img)
plt.axis('off')
#6
plt.subplot(122)
plt.imshow(spectrum)
plt.axis('off')
#7
plt.show()


上面代码以此代表的意思如下:


1.使用OpenCV以灰度图像的形式读取


2.实现傅里叶变换


3.经过2傅里叶变换函数处理之后。此时,图像频谱中的零频率分量位于频谱图像的左上角,为了便于观察,这里通过函数np.fft.fftshift将零频谱成分移动到频域图像的中心位置。


4.对图像进行傅里叶变换之后,得到的是一个复数数组。为了显示为图像,需要将它们的值调整到[0,255]的灰度空间内,通过20 * np.log(np.abs(fshift))实现。


5.以灰度图像的形式绘制原图


6.以灰度图像的形式绘制频域图


7.显示2个图


运行之后,效果如下:



实现逆傅里叶变化


既然我们在实现傅里叶变换之时,将零频谱移动到了图像中间。那么,在逆变换的时候,我我们就需要将其移回去,该移回去的逆函数是np.fft.ifftshift()。而移回去之后,才可以进行逆傅里叶变换。


逆傅里叶变换函数为np.fft.ifft2()。它返回空域信息是一个复数数组,同样需要我们将信息调整到[0,255]之间。使用公式为:np.abs(逆傅里叶变换结果)。


下面,我们实现傅里叶变换以及逆傅里叶变换。代码如下所示:

import cv2
import numpy as np
import matplotlib.pyplot as plt
img = cv2.imread("4.jpg", 0)
#傅里叶变换
f = np.fft.fft2(img)
fshift = np.fft.fftshift(f)
ishift=np.fft.ifftshift(fshift)
iimg=np.fft.ifft2(ishift)
iimg=np.abs(iimg)
print(iimg)
print(img)
plt.subplot(121)
plt.imshow(img,cmap="gray")
plt.axis('off')
plt.subplot(122)
plt.imshow(iimg,cmap="gray")
plt.axis('off')
plt.show()


高通滤波与低通滤波


经过前文的介绍,我们知道在一副图像内,同时存在着高频信号和低频信号。而滤波器你可以把它想象成平时生活中的漏斗,它能够允许一定频率的分量通过或者拒绝其通过。


我们通过滤波器的作用方式,将其分为低通滤波器与高通滤波器。(题外话,此高通非彼高通,皮一下)


低通滤波器:允许低频信号通过。低通滤波器使高频信号衰减而对低频信号放行,会使图像变得模糊


高通滤波器:允许高频信号通过。高通滤波器使低频信号衰减而让高频信号通过,将增强图像中尖锐的细节,但是会导致图像的对比度降低。


频域处理就是对图像的高频或低频信号进行处理后,再进行逆傅里叶变换返回空间域。


下面,我们来通过傅里叶的正逆操作,实现高通滤波。代码如下:

import cv2
import numpy as np
import matplotlib.pyplot as plt
img = cv2.imread("4.jpg", 0)
# 傅里叶变换
f = np.fft.fft2(img)
fshift = np.fft.fftshift(f)
#屏蔽低频信号
rows, cols = img.shape
row_half, col_half = int(rows / 2), int(cols / 2)
fshift[row_half-20:row_half+20,col_half-20:col_half+20]=0
#逆傅里叶变换
ishift=np.fft.ifftshift(fshift)
iimg=np.fft.ifft2(ishift)
iimg=np.abs(iimg)
plt.subplot(121)
plt.imshow(img, cmap="gray")
plt.axis('off')
plt.subplot(122)
plt.imshow(iimg, cmap="gray")
plt.axis('off')
plt.show()


上面的代码中,主要通过3行代码屏蔽低频信号,代码如下:

rows, cols = img.shape
row_half, col_half = int(rows / 2), int(cols / 2)
fshift[row_half-20:row_half+20,col_half-20:col_half+20]=0


我们通过前文知道,np.fft.fftshift会将零频率分量移动到图像的中心区域,那么从中心区域向外扩散就是从低到高。所以,我们只要将中心周围部分的低频信号屏蔽,就保留的高频信号,也就是实现了高通滤波。


这里我们选择从中心向外扩散30半径,将其内部的所有低频信号全部赋值为0即可。运行之后,我们会得到高通滤波的图像,同时该图像的边缘信息得以保留。

相关文章
|
5月前
|
安全 API 数据安全/隐私保护
深入浅出python代码混淆:原理与实践
代码混淆就像是给你的代码穿上了一件隐形衣。它可以让你的代码变得难以理解,但并不能完全保证代码的安全。在实际应用中,我们应该将代码混淆作为整个安全策略中的一环,而不是唯一的防线。
|
2月前
|
机器学习/深度学习 Python
堆叠集成策略的原理、实现方法及Python应用。堆叠通过多层模型组合,先用不同基础模型生成预测,再用元学习器整合这些预测,提升模型性能
本文深入探讨了堆叠集成策略的原理、实现方法及Python应用。堆叠通过多层模型组合,先用不同基础模型生成预测,再用元学习器整合这些预测,提升模型性能。文章详细介绍了堆叠的实现步骤,包括数据准备、基础模型训练、新训练集构建及元学习器训练,并讨论了其优缺点。
110 3
|
2月前
|
机器学习/深度学习 算法 数据挖掘
线性回归模型的原理、实现及应用,特别是在 Python 中的实践
本文深入探讨了线性回归模型的原理、实现及应用,特别是在 Python 中的实践。线性回归假设因变量与自变量间存在线性关系,通过建立线性方程预测未知数据。文章介绍了模型的基本原理、实现步骤、Python 常用库(如 Scikit-learn 和 Statsmodels)、参数解释、优缺点及扩展应用,强调了其在数据分析中的重要性和局限性。
96 3
|
26天前
|
算法 数据处理 Python
高精度保形滤波器Savitzky-Golay的数学原理、Python实现与工程应用
Savitzky-Golay滤波器是一种基于局部多项式回归的数字滤波器,广泛应用于信号处理领域。它通过线性最小二乘法拟合低阶多项式到滑动窗口中的数据点,在降噪的同时保持信号的关键特征,如峰值和谷值。本文介绍了该滤波器的原理、实现及应用,展示了其在Python中的具体实现,并分析了不同参数对滤波效果的影响。适合需要保持信号特征的应用场景。
107 11
高精度保形滤波器Savitzky-Golay的数学原理、Python实现与工程应用
|
5月前
|
机器学习/深度学习 存储 算法
回声状态网络(Echo State Networks,ESN)详细原理讲解及Python代码实现
本文详细介绍了回声状态网络(Echo State Networks, ESN)的基本概念、优点、缺点、储层计算范式,并提供了ESN的Python代码实现,包括不考虑和考虑超参数的两种ESN实现方式,以及使用ESN进行时间序列预测的示例。
284 4
回声状态网络(Echo State Networks,ESN)详细原理讲解及Python代码实现
|
15天前
|
安全 数据挖掘 编译器
【01】优雅草央央逆向技术篇之逆向接口协议篇-如何用python逆向接口协议?python逆向接口协议的原理和步骤-优雅草央千澈
【01】优雅草央央逆向技术篇之逆向接口协议篇-如何用python逆向接口协议?python逆向接口协议的原理和步骤-优雅草央千澈
|
1月前
|
缓存 数据安全/隐私保护 Python
python装饰器底层原理
Python装饰器是一个强大的工具,可以在不修改原始函数代码的情况下,动态地增加功能。理解装饰器的底层原理,包括函数是对象、闭包和高阶函数,可以帮助我们更好地使用和编写装饰器。无论是用于日志记录、权限验证还是缓存,装饰器都可以显著提高代码的可维护性和复用性。
38 5
|
1月前
|
缓存 开发者 Python
深入探索Python中的装饰器:原理、应用与最佳实践####
本文作为技术性深度解析文章,旨在揭开Python装饰器背后的神秘面纱,通过剖析其工作原理、多样化的应用场景及实践中的最佳策略,为中高级Python开发者提供一份详尽的指南。不同于常规摘要的概括性介绍,本文摘要将直接以一段精炼的代码示例开篇,随后简要阐述文章的核心价值与读者预期收获,引领读者快速进入装饰器的世界。 ```python # 示例:一个简单的日志记录装饰器 def log_decorator(func): def wrapper(*args, **kwargs): print(f"Calling {func.__name__} with args: {a
48 2
|
2月前
|
机器学习/深度学习 人工智能 算法
强化学习在游戏AI中的应用,从基本原理、优势、应用场景到具体实现方法,以及Python在其中的作用
本文探讨了强化学习在游戏AI中的应用,从基本原理、优势、应用场景到具体实现方法,以及Python在其中的作用,通过案例分析展示了其潜力,并讨论了面临的挑战及未来发展趋势。强化学习正为游戏AI带来新的可能性。
152 4
|
2月前
|
搜索推荐 Python
快速排序的 Python 实践:从原理到优化,打造你的排序利器!
本文介绍了 Python 中的快速排序算法,从基本原理、实现代码到优化方法进行了详细探讨。快速排序采用分治策略,通过选择基准元素将数组分为两部分,递归排序。文章还对比了快速排序与冒泡排序的性能,展示了优化前后快速排序的差异。通过这些分析,帮助读者理解快速排序的优势及优化的重要性,从而在实际应用中选择合适的排序算法和优化策略,提升程序性能。
60 1

热门文章

最新文章