Press "Enter" to skip to content

时序数据的傅里叶变换:关于图像卷积和SciPy

傅里叶变换卷积也适用于图像

本文是关于时序傅里叶变换的第二篇文章,查看第一篇文章请点击这里:

时序傅里叶变换:使用numpy解释快速卷积

使用傅里叶变换加速10000倍的卷积

towardsdatascience.com

之前文章的简要回顾

在之前的文章中,我解释了如何使用傅里叶变换对信号进行卷积非常高效。我展示了使用numpy中的傅里叶变换进行卷积比标准代数方法快几个数量级,而且对应于一种称为循环卷积的特定类型卷积。

在本文中,我希望强调循环卷积的含义以及如何将其应用于图像。图像也是将一维直觉扩展到二维的好方法。

所有图片都由作者制作。

使用scipy进行图像卷积

如果您曾经处理过图像处理,您很可能遇到过应用卷积的函数。图像卷积应用广泛 – 图像增强、去噪、分割、特征提取、压缩 – 并且是卷积神经网络的基础,卷积神经网络是处理视觉数据的深度学习模型的黄金标准。

在Python中,使用scipy及其ndimage子包可以非常简单地进行图像卷积。此时,我建议先快速查看一下`convolve`函数的文档,然后回到这里。

scipy.ndimage.convolve – SciPy v1.11.1 手册

多维卷积。数组与给定的卷积核进行卷积。参数:输入数组。数组…

docs.scipy.org

使用方法非常简单:您可以将两个图像传递给它们进行卷积。让我们看一个例子:

请注意,scipy提供了使用参数’mode’处理边界的几种方法:正如我们将在下面看到的那样,’wrap’模式对应于循环卷积,因此对应于使用傅里叶变换方法进行卷积。还存在其他方法,如’reflect’反射图像内外,或’constant’重复最外层的值。还要注意’wrap’的工作原理:它会重复整个信号,就像它是周期性的一样。

二维图像的卷积

让我们开始编码,看看不同卷积模式之间的差异。

首先,我们创建一个用于表示二维周期性图像的类:从之前的文章中可以记得,当使用傅里叶变换工具时,信号被认为是周期性的。这个类只是用来绘制这样的二维周期性数组的语法糖。

我们在[0,V,0,H]的矩形中展示“基础”图像,以及它周围的8个副本。如之前所述,信号被认为是周期性的,因此具有无限支持,但我们只需要和使用一个周期。

现在,让我们创建一个示例图像进行实验:它将包含随机噪声、正弦图案、斜坡图案和一些方形斑点。我们还创建该示例图像的周期性版本:它表示傅里叶变换在应用其操作符时所考虑的周期性图像:

我们将要进行卷积的输入图像,表示为一个周期性数组。“基础”图像位于中心,周围是它的副本。

现在,让我们创建一个用于卷积的卷积核:我们将使用一个简单的常数卷积核,也称为平均卷积核,因为使用该卷积核进行卷积只会给出输入图像的局部平均值。

然后我们开始使用scipy卷积函数以及其不同的模式来处理边界,并将结果包装为周期数组以便于绘图:请注意,无论使用哪种模式,卷积图像的中间部分始终相同,但边界会有所变化。

使用scipy卷积函数处理边界的4种不同模式的结果。每个结果图像都显示为周期数组。

现在我们可以使用傅里叶变换方法来计算卷积:如前一篇文章所示,我们只需要将信号(图像和内核)的傅里叶变换的乘积进行反傅里叶变换:

使用傅里叶变换方法计算两个信号的卷积的基本方程。
使用傅里叶变换方法计算的卷积结果,而不是使用scipy。

将结果与scipy的“wrap”模式进行比较,我们可以看到结果非常相似,只是稍微有些偏移:

scipy卷积模式为“wrap”和傅里叶变换方法之间的比较。它们几乎完全相同。使用周期数组表示,我们可以看到这只是一个偏移的问题。

这只是一个索引的问题,我们可以使用平移后的中心化内核获得完全相同的结果:

scipy卷积模式为“wrap”(左图),和两种傅里叶变换方法的比较:在两侧填充内核(中图)和中心化内核(右图)。左图和右图是相同的。

使用适当的居中方式,我们得到了scipy的卷积模式为“wrap”的结果与傅里叶变换方法的相同结果。

出于好奇,我们来看看哪种方法更快:

我们的两个图像之间使用scipy和傅里叶变换计算卷积的时间比较:傅里叶变换比scipy快大约15倍。

再次证明,傅里叶变换方法更快,而且在这种情况下比scipy函数更快,这很好。

总结

在本文中,我们看到了循环卷积如何应用于图像,并且它等同于使用scipy卷积函数的mode=‘wrap’模式。

在下一篇文章中,我们将深入研究在傅里叶变换的背景下使用窗口函数来减少频谱泄漏和改善频谱分析。

订阅以便直接在您的订阅源上获取关于傅里叶变换的未来文章!

此外,还请查看我的其他文章,如果您喜欢其中任何一篇,请订阅,这对我达到100位订阅者的目标非常有帮助:

时间序列的傅里叶变换:用numpy解释快速卷积

使用傅里叶变换进行10000倍加速的卷积

towardsdatascience.com

PCA/LDA/ICA:组件分析算法比较

回顾这些著名算法的概念和差异。

towardsdatascience.com

PCA白化与ZCA白化:一个numpy 2d可视化

白化数据的过程是一种变换,使得变换后的数据具有单位矩阵…

towardsdatascience.com

使用numpy进行有限差分法的分辨率提高300倍

有限差分法是一种解决复杂问题的强大技术,而numpy使其变得快速!

towardsdatascience.com

在Jupyter中进行交互式绘图的著名RC电路

ipywidgets和matplotlib的又一步

towardsdatascience.com

包装numpy数组

容器方法。

towardsdatascience.com

如果这些文章对您有兴趣,请记得关注我,新文章将会出现在您的订阅源上。

Leave a Reply

Your email address will not be published. Required fields are marked *