OpenCV基于Python傅里叶变换及高通/低通滤波

Python下opencv使用笔记(十)(图像频域滤波与傅里叶变换) 前面曾经介绍过空间域滤波,空间域滤波就是用各种模板直接与图像进行卷积运算,实现对图像的处理,这种方法直接对图像空间操作,操作简单,所以也是空间域滤波。频域滤波说到底最终可能是和空间域滤波实现相同的功能,比如实现图像的轮廓提取,在空间域滤波中我们使用一个拉普拉斯模板就可以提取,而在频域内,我们使用一个高通滤波模板(因为轮廓在频域内属于高频信号),可以实现轮廓的提取,后面也会把拉普拉斯模板频域化,会发现 阅读详情

目标

通过本篇文章的学习,你将学习到以下内容:

  • 使用OpenCV查找图像的傅立叶变换
  • 利用Numpy中可用的FFT函数
  • 傅立叶变换的某些应用
  • 学习到函数:cv.dft(),cv.idft()

前言

傅立叶变换用于分析各种滤波器的频率特性。对于图像,使用2D离散傅里叶变换(DFT)查找频域。一种称为快速傅立叶变换(FFT)的快速算法用于DFT的计算。

对于正弦信号 x ( t ) = A sin ⁡ ( 2 π f t ) x(t) = A \sin(2 \pi ft) x(t)=Asin(2πft),我们可以说 f f f是信号的频率,如果采用其频域,则可以看到 f f f的尖峰。如果对信号进行采样以形成离散信号,我们将获相同的频域,但是在[-π,π]或[0,2π]范围内(对于N点DFT为[0,N])是周期性的,你可以将图像视为在两个方向上采样的信号。因此,在X 和Y方向都进行傅立叶变换,可以得到图像的频率表示。

更直观地说,对于正弦信号,如果幅度在短时间内变化如此之快,则可以说它是高频信号。如果变化缓慢,则为低频信号。你可以将相同的方式扩展到图像。图像中的振幅在哪里急剧变化?在边缘点或噪声。因此,可以说边缘和噪声是图像中的高频内容。如果幅度没有太大变化,则它是低频分量。(一些链接已添加到“其他资源”,其中通过示例直观地说明了频率变换)。

接下来,我们将学习如何找到傅立叶变换。

1. Numpy中的傅里叶变换

首先,我们将看到如何使用Numpy查找傅立叶变换。Numpy具有FFT软件包来执行此操作。np.fft.fft2()为我们提供了频率转换,它将是一个复杂的数组。它的第一个参数是输入图像,即灰度图像。第二个参数是可选的,它决定输出数组的大小。如果它大于输入图像的大小,则在计算FFT之前用零填充输入图像。如果小于输入图像,将裁切输入图像。如果未传递任何参数,则输出数组的大小将与输入的大小相同。

现在,一旦获得结果,零频率分量(DC分量)将位于左上角。如果要使其居中,则需要在两个方向上将结果都移动 N 2 \frac{N}{2} 2N​。只需通过函数np.fft.fftshift()即可完成。(它更容易分析)。找到频率变换后,就可以找到幅度谱。

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

img = cv.imread('./data/messi5.jpg', 0)
f = np.fft.fft2(img)
fshift = np.fft.fftshift(f)
magnitude_spectrum = 20*np.log(np.abs(fshift))

plt.subplot(121), plt.imshow(img, 'gray'), plt.title('Input image')
plt.xticks([]), plt.yticks([])
plt.subplot(122), plt.imshow(magnitude_spectrum, 'gray'), plt.title('Magnitude spectrum')
plt.xticks([]), plt.yticks([])
plt.show()

Numpy中的傅里叶变换
从图中你可以在中心处看到更多白色区域,这表明低频内容更多。

实现了频率变换后,你可以在频域中进行一些操作,例如高通滤波和重建图像,即找到逆DFT。为此,你只需用尺寸为60x60的矩形窗口遮罩即可消除低频。然后,使用np.fft.ifftshift()应用反向移位,以使DC分量再次出现在左上角。然后使用np.fft.ifft2()函数找到逆FFT。同样,结果将是一个复数。你可以采用其绝对值。

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

img = cv.imread('./data/messi5.jpg', 0)
f = np.fft.fft2(img)
fshift = np.fft.fftshift(f)

rows, cols = img.shape
crow, ccol = rows//2, cols//2
fshift[crow-30:crow+31, ccol-30:ccol+31] = 0
f_ishift = np.fft.ifftshift(fshift)
img_back = np.fft.ifft2(f_ishift)
img_back = np.real(img_back)

plt.subplot(131), plt.imshow(img, 'gray')
plt.title('Input image'), plt.xticks([]), plt.yticks([])
plt.subplot(132), plt.imshow(img_back, 'gray')
plt.title('Image after HPF'), plt.xticks([]), plt.yticks([])
plt.subplot(133), plt.imshow(img_back)
plt.title('Result in JET'), plt.xticks([]), plt.yticks([])
plt.show()

高通滤波

结果表明高通滤波是边缘检测操作。这就是我们在“图像渐变”一章中看到的。这也表明大多数图像数据都存在于频谱的低频区域。无论如何,我们已经看到了如何在Numpy中找到DFT,IDFT等。现在,让我们看看如何在OpenCV中进行操作。 如果您仔细观察结果,尤其是最后一张JET颜色的图像,您会看到一些伪像(我用红色箭头标记的一个实例)。它在那里显示出一些波纹状结构,称为振铃效应。这是由我们用于遮罩的矩形窗口引起的。此掩码转换为正弦形状,从而导致此问题。因此,矩形窗口不用于过滤。更好的选择是高斯窗口。

2. OpenCV中的傅里叶变换

OpenCV为此提供了cv.dft()和cv.idft()函数。它返回与前一个相同的结果,但是有两个通道。第一个通道是结果的实部,第二个通道是结果的虚部。输入图像首先应转换为np.float32 。我们来看看怎么做。

import numpy as np
import cv2 as cv
from matplotlib import pyplot as plt
img = cv.imread('./data/messi5.jpg',0)
dft = cv.dft(np.float32(img),flags = cv.DFT_COMPLEX_OUTPUT)
dft_shift = np.fft.fftshift(dft)
magnitude_spectrum = 20*np.log(cv.magnitude(dft_shift[:,:,0],dft_shift[:,:,1]))

plt.subplot(121),plt.imshow(img, cmap = 'gray')
plt.title('Input Image'), plt.xticks([]), plt.yticks([])
plt.subplot(122),plt.imshow(magnitude_spectrum, cmap = 'gray')
plt.title('Magnitude Spectrum'), plt.xticks([]), plt.yticks([])
plt.show()

OpenCV中的傅里叶变换

注意: 您还可以使用cv.cartToPolar(),它在单个镜头中同时返回幅值和相位

现在我们要做DFT的逆变换。在上一节中,我们创建了一个HPF,这次我们将看到如何删除图像中的高频内容,即我们将LPF应用到图像中。它实际上模糊了图像。为此,我们首先创建一个高值1在低频部分,即我们过滤低频内容,0在高频区。

import numpy as np
import cv2 as cv
from matplotlib import pyplot as plt
img = cv.imread('./data/messi5.jpg',0)
dft = cv.dft(np.float32(img),flags = cv.DFT_COMPLEX_OUTPUT)
dft_shift = np.fft.fftshift(dft)

rows, cols = img.shape
crow,ccol = rows//2 , cols//2
# 首先创建一个掩码,中心正方形为1,其余全为零
mask = np.zeros((rows,cols,2),np.uint8)
mask[crow-30:crow+30, ccol-30:ccol+30] = 1
# 应用掩码和逆DFT
fshift = dft_shift*mask
f_ishift = np.fft.ifftshift(fshift)
img_back = cv.idft(f_ishift)
img_back = cv.magnitude(img_back[:,:,0],img_back[:,:,1])
plt.subplot(121),plt.imshow(img, cmap = 'gray')
plt.title('Input Image'), plt.xticks([]), plt.yticks([])
plt.subplot(122),plt.imshow(img_back, cmap = 'gray')
plt.title('Magnitude Spectrum'), plt.xticks([]), plt.yticks([])
plt.show()

低通滤波

注意: 通常,OpenCV函数cv.dft()和cv.idft()比Numpy函数更快。但是Numpy函数更容易使用。

3. 为什么拉普拉斯算子是高通滤波器?

在一个论坛上也有人提出了类似的问题。问题是,为什么拉普拉斯变换是高通滤波器?为什么Sobel是HPF?等。第一个答案是关于傅里叶变换的。对于更大的FFT只需要拉普拉斯变换。分析下面的代码:

import cv2 as cv
import numpy as np
from matplotlib import pyplot as plt
# 没有缩放参数的简单均值滤波器
mean_filter = np.ones((3,3))
# 创建高斯滤波器
x = cv.getGaussianKernel(5,10)
gaussian = x*x.T
# 不同的边缘检测滤波器
# x方向上的scharr
scharr = np.array([[-3, 0, 3],
 [-10,0,10],
 [-3, 0, 3]])
# x方向上的sobel
sobel_x= np.array([[-1, 0, 1],
 [-2, 0, 2],
 [-1, 0, 1]])
# y方向上的sobel
sobel_y= np.array([[-1,-2,-1],
 [0, 0, 0],
 [1, 2, 1]])
# 拉普拉斯变换
laplacian=np.array([[0, 1, 0],
 [1,-4, 1],
 [0, 1, 0]])
filters = [mean_filter, gaussian, laplacian, sobel_x, sobel_y, scharr]
filter_name = ['mean_filter', 'gaussian','laplacian', 'sobel_x', \
'sobel_y', 'scharr_x']
fft_filters = [np.fft.fft2(x) for x in filters]
fft_shift = [np.fft.fftshift(y) for y in fft_filters]
mag_spectrum = [np.log(np.abs(z)+1) for z in fft_shift]
for i in range(6):
    plt.subplot(2, 3, i + 1), plt.imshow(mag_spectrum[i], cmap='gray')
    plt.title(filter_name[i]), plt.xticks([]), plt.yticks([])
plt.show()

filter_HPF/LPF
从图像中,你可以看到每种内核阻止的频率区域以及它允许经过的区域。从这些信息中,我们可以说出为什么每个内核都是HPF或LPF。

4. 总结

本篇文章介绍了图像处理中的傅里叶变换,主要介绍了Numpy中的傅里叶变换及其逆变换,OpenCV中的傅里叶变换及其逆变换,还解释了为什么拉普拉斯算子是高通滤波器的原因。

附加资源

  1. 傅里叶变换的直观解释:http://cns-alumni.bu.edu/~slehar/fourier/fourier.html by Steven Lehar
  2. 傅里叶变换:添加链接描述 at HIPR
  3. 图像中的频率域指什么?http://dsp.stackexchange.com/q/1637/818

如果文章对你有帮助,欢迎一键三连哦~~, 谢谢~~

Python+OpenCV图像处理:均值滤波、中值滤波、高斯滤波以及图像堆叠显示 import cv2 #图像平滑处理 img = cv2.imread('lenaNoise.png') #图像的显示 cv2.imshow('image',img) #等待时间,毫秒,0表示任意键终止 cv2.waitKey(0) cv2.destroyAllWindows() 运行结果:图中白点为噪声 均值滤波: #均值滤波 #简单的平均卷积操作 blur = cv2.blur(img, (3, 3))#取3*3的矩阵 一般取奇数矩阵 cv2.imshow('blur',blur... 阅读详情

相关推荐

opencv 傅里叶变换(python)

图像处理一般分为空间域处理和频率域处理。空间域处理是直接对图像内的像素进行处理。空间域处理主要划分为灰度变换和空间滤波两种形式。频率域处理是先将图像变换到频率域,然后在频率域对图像进行处理,最后再通过反变换将图像从频率域变换到空间域。时间差,在傅里叶变换里就是相位。相位表述的是与时间差相关的信息。在图像处理过程中,傅里叶变换就是将图像分解为正弦分量和余弦分量两部分,即将图像从空间域转换到频域。数字图像经过傅里叶变换后,得到的频域值是复数。因此,显示傅里叶变换的结果需要使用实数图像(real image)加虚

wkk的博客 1万+

dft转换与反转

这次介绍下opencv中DFT的使用,对应的例程是(EXAMPLE) dft。在图像处理领域,通过DFT可以将图像转换到频域,实现高通和低通滤波;还可以利用矩阵的卷积运算等同于其在频域的乘法运算从而优化算法降低运算量, 即先将图像转换到频域,然后做完乘法运算后,再转换到图像域,opencv中的模板匹配就利用了这一特性降低运算量。 下面是dft例程的源码 [cpp] vi

Yuippe的专栏 4556

基于OpenCv的图像傅里叶变换

傅里叶变换将原来难以处理的时域信号转换成了易于分析的频域信号,可以利用一些工具对这些频域信号进行处理、加工。最后还可以利用傅里叶反变换将这些频域信号转换成时域信号。 图像经过傅里叶变换后,大部分能力都分布于低频谱段,这对以后图像的压缩、传输都比较有利。

需要远程指导仿真实验、代码有问题的,请后台私信或者关注公众号 1290

opencv-python图像高通滤波与低通滤波

本文介绍了高通滤波低通滤波在图像处理方面原理以及应用实例

weixin_52564375的博客 8111

[Python图像处理] 二十三.傅里叶变换之高通滤波和低通滤波

前面一篇文章我讲解了傅里叶变换,它将时间域上的信号转变为频率域上的信号,用来进行图像除噪、图像增强等处理。本文将继续补充基于傅里叶变换的高通滤波和低通滤波。基础性文章,希望对你有所帮助。同时,该部分知识均为杨秀璋查阅资料撰写,转载请署名优快云+杨秀璋及原地址出处,谢谢!! 1.高通滤波 2.低通滤波 3.本章小结

杨秀璋的专栏 3万+

Unity游戏开发客户端Unity基础

Unity游戏开发客户端面经 之 Unity 篇

Sea3752的博客 2万+

python实现图像的频域滤波_OpenCV Python 从图像的频域中应用滤波器

By 凌顺2019年9月24日本示例使用的OpenCV版本是:OpenCV 4.1.1运行Python的编辑器:Jupyter notebook 6.0.0实现目的本教程,主要学会如何在图像的频域中应用滤波器实现代码1,加载需要的库,灰度加载图片和显示图像import cv2import numpy as npimport matplotlib.pyplot as pltimg = cv2.imr...

weixin_39637545的博客 797

三维荧光光谱(EEM)散射干扰实战:从识别到精准切除的完整流程

本文详细解析三维荧光光谱(EEM)中散射干扰的识别与精准切除流程,涵盖瑞利散射和拉曼散射的实战处理技巧。通过drEEM工具箱的应用示例和高级场景解决方案,帮助研究者有效消除散射干扰,提升数据准确性,特别适用于环境样品和生物活体样本分析。

weixin_42554042的博客 327

opencv-python实现 图像增强_傅立叶变换(利用频率域滤波方法去掉图像“house”中的竖条纹)

利用频率域滤波方法去掉图像“house”中的竖条纹 import cv2 import numpy as np from matplotlib import pyplot as plt # 将gif图片转换成可识别图像 gif = cv2.VideoCapture('house.gif') ret, frame = gif.read() if ret: print('change success!') img = cv2.cvtColor(frame, cv2.COLOR_RGB2GRAY

Code->Y的博客 4213

ADC INL&DNL测试方法和实例

本文介绍了一种可操作的ADC INL和DNL的测试方法--直方图法(也称码密度法)。并实际使用该方法测试了两款芯片的ADC INL和DNL

APTCHIP的博客 1万+

ISCE+Mintpy进行SBASInSAR处理(持续更新)

通过调用pairs_misregistration方法,利用safe_dict中的数据信息,对每对SLC数据进行配准误差的计算和分析,以确定数据之间的精确差异,为后续的时间序列处理提供基础。给定同一地区的两景SAR影像,经过配准之后,对应像元进行共轭相乘得到相位差,并形成干涉图,但是从干涉图中得到的相位差实际上是主值,即在(-π,π)呈周期性变化,为了还原其真实的相位差,必须在主值的基础上加或减整数倍的相位周期2π,把被卷叠的相位展开,才能顺利地反演出地面目标的高程和形变。

Cyy2511250589的博客 3735

Python+OpenCV实战:5分钟搞定图像频域滤波(附完整代码)

本文通过Python+OpenCV实战演示了图像频域滤波的四种核心方法:低通、高通、带阻和带通滤波。附完整代码和参数调整建议,帮助开发者在5分钟内快速实现图像降噪、边缘增强等实用功能,提升图像处理效率。

weixin_29051193的博客 167

【GameFramework框架内置模块】1、全局配置(Config)

这是GameFramework框架内置模块的第一篇,全局配置Config,讲解这些模块的时候会尽量的涉及介绍、为什么使用、如何使用、代码分析这几块,让大家可以知其然,也知其所以然。全局配置表,存储了一些游戏中使用的全局的参数配置,比如玩家的初始速度、游戏初始音量等。全局配置表的结构跟DataTable结构类似,也是列行+键值对,只是没有ID这一列,因为全局配置也不需要用ID去查询, 是直接使用key值进行查询。

优快云博客专家,Unity3D高级软件工程师,《Unity 3D从入门到实战》作者。 5885

《OpenCv视觉之眼》Python图像处理七 :Opencv图像处理之高通滤波和低通滤波原理及构造

本专栏主要介绍如果通过OpenCv-Python进行图像处理,通过原理理解OpenCv-Python的函数处理原型,在具体情况中,针对不同的图像进行不同等级的、不同方法的处理,以达到对图像进行去噪、锐化等一系列的操作。同时,希望观看本专栏的小伙伴可以理解到OpenCv进行图像处理的强大哦,如有转载,请注明出处(原文链接和作者署名),感谢各位小伙伴啦! 前文参考: 《OpenCv视觉之眼》Python图像处理一 :Opencv-python的简介及Python环境搭建 《OpenCv视觉之眼》Python图像

qq_42451251的博客 6973

PCL 将对象模板与点云对齐【2025最新版】

PCL模版匹配算法的使用案例,博客长期更新,本文最近更新时间为:2025年1月18日。

点云侠的博客 5378

Linux7 挂载 nfs 远程目录

每天一个 DBA 小知识,助你更进一步!

LuciferLiu_DBA 1万+

OpenCV-python 实现低通滤波、高通滤波、带通滤波

import cv2 import numpy as np import matplotlib.pyplot as plt import math plt.rcParams['font.sans-serif'] = ['SimHei'] # 用来正常显示中文标签 plt.rcParams['axes.unicode_minus'] = False # 用来正常显示负号 def sal...

luoluo3664的博客 6243

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

python-opencv图像的高通滤波和低通滤波

上一章我们说明了如何将图像机娘傅里叶变换,将图像由时域变换成频域,并将低频移动至图像中心。那么将低频移动中心后,就可以将图像的低频和高频分开,从而进行低通滤波和高通滤波的处理。 ......

白羊by的博客 3768

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Python-Opencv学习总结(九):傅里叶变换、高通滤波、低通滤波

1、理论基础 时域角度:从时间节点告诉我们时间发生了什么。 频域角度:频率角度,多久发生一次。 相位:时间差的表述, 相位:不是同时开始的一组余弦函数,在叠加时要体现开始的时间。 2、numpy实现傅里叶变换 函数: numpy.fft.fft2:实现傅里叶变换,返回一个复数数组(complex ndarray) numpy.fft.fftshift:将零频率分量移到频谱中心。 20*np.log(np.abs(fshift)):设置频谱的范围[0,255];先取绝对值,再取log,再乘20 im

qq_45802081的博客 2351

opencv 傅里叶变换(低通滤波 + 高通滤波)

因此,当您计算两个数组的卷积或执行数组的频谱分析时,通常有必要在输入数据中填充零,以获得比原始数组转换速度快得多的更大的数组。)的数组处理速度最快。但是,数组的大小是2、3和5的乘积(例如,300 = 55322)的处理效率也很高。2、从频域角度分析:不在是以时间为参照物了,而是这个事情的频率,1分钟放1块冰糖,2分钟放3粒红豆,3分钟放2粒绿豆,4分钟放4块西红柿,5分钟放1杯水。1、从时域分析:就是六点零一放了1块冰糖,3颗红豆,2颗绿豆,4块西红柿,1杯纯净水,六点零二放了1块冰糖。

weixin_45715405的博客 1779

【OpenCV-Python】:图像高通滤波、低通滤波、带通滤波实现

目录😺一、高通滤波🐶1.1 原理🐶1.2 程序设计🐶1.3 结果可视化😺二、低通滤波🐶2.1 原理🐶2.2 程序设计🐶2.3 结果可视化😺三、带通滤波🐶3.1 原理🐶3.2 程序设计🐶3.3 结果可视化 😺一、高通滤波 🐶1.1 原理 顾名思义,高通滤波就是允许高频信息通过,低频信息截断的滤波方式。 🐶1.2 .

王乐予的博客 7802

Python OpenCV 图像处理之傅里叶变换,取经之旅第 52 篇

Python OpenCV 傅里叶变换,Python 高通滤波,低通滤波等相关知识

梦想橡皮擦,专栏100例写作模式先行者,现象级专栏 《Python 爬虫 100 例》作者、《滚雪球学 Python 专栏》原创者 2万+

python+OpenCV笔记(三十九):离散傅里叶变换(DFT)

python+OpenCV笔记(三十九):离散傅里叶变换(DFT)

ReadyGo!!!的博客 7319

OpenCV(12): 傅里叶变换以及高通低通滤波器代码复现

上一篇博客简单介绍了一下傅里叶变换是什么,这篇博客主要讲傅里叶变换在图像处理中的具体应用,同时也会附上例子和代码实战。

m0_50317149的博客 1293

计算机视觉-图像的傅里叶变换

法国数学家吉恩·巴普提斯特·约瑟夫·傅里叶被世人铭记的最大的贡献是:他指出任何周期函数都可以表示为不同频率的正弦和/或余弦之和的形式,每个正弦项和/或余弦项乘以不同的系数(现在称该和为傅里叶级数)。无论函数多么复杂,只要它是周期的,并且满足某些适度的数学条件,都可以用这样的和来表示。即一个复杂的函数可以表示为简单的正弦和余弦之和。甚至非周期函数(单该曲线下的面积是有限的)也可以用正弦和/或许·余弦乘以加权函数的积分来表示。............

m0_37623374的博客 2万+
上一篇: OpenCV基于Python二维直方图
下一篇: OpenCV基于Python图像模板匹配
@DWC_DIP
博客等级 码龄7年 2673粉丝 60原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值