购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

3.3 探索傅里叶变换

在OpenCV中,大部分应用于图像和视频的处理都在一定程度上涉及傅里叶变换的概念。约瑟夫·傅里叶(Joseph Fourier)是18世纪法国的一名数学家,他发现并推广了许多数学概念。他研究了热物理以及所有可以用波形函数表示的数学。特别是他注意到所有波形都是不同频率的简单正弦波的和。

或者说,你从周围观察到的所有波形都是其他波形的和。在进行图像处理时,这个概念非常有用,因为它让我们能识别图像中信号(如图像像素的值)变化大的区域,以及变化不是很显著的区域。然后,我们可以任意地将这些区域标记为噪声或者感兴趣区域、背景或者前景,等等。这些是组成原始图像的频率,我们有能力对它们进行分割,从而理解图像并推断出有趣的数据。

OpenCV实现了很多算法,使我们能够处理图像并理解图像中包含的数据,为了让我们的工作更方便,NumPy中也重新实现了这些算法。NumPy有一个包含fft2方法的快速傅里叶变换(Fast Fourier Transform,FFT)包。这个方法允许我们计算图像的离散傅里叶变换(Discrete Fourier Transform,DFT)。

我们用傅里叶变换来研究图像的幅度频谱(magnitude spectrum)的概念。图像的幅度频谱是提供表示原始图像变化的另一幅图像。将其想象成把所有最亮像素都拖到中间的一幅图像。接着,慢慢地把最暗的像素推到边界处。你立刻就能看到图像中包含了多少亮的像素、多少暗的像素,以及这些像素分布的百分比。

傅里叶变换是许多常用图像处理操作算法(如边缘检测或者线条和形状检测)的基础。

在详细研究这些内容之前,我们先来看两个概念——HPF和LPF,它们和傅里叶变换一起形成了上述处理操作的基础。

HPF和LPF

HPF是一种滤波器,可以检查图像的一个区域,并根据周围像素的强度差异增强某些像素的强度。

以下面的核为例:

一个核就是一组权值,这组权值应用于源图像中的某个区域可以生成目标图像中的单个像素。例如,如果我们调用拥有一个参数的OpenCV函数来指定一个核的大小为7或者ksize为7,这就表示在生成每个目标像素时需要考虑49(7×7)个源像素。我们可以把核看成是在源图像上移动的一块磨砂玻璃,让光源的光线扩散混合通过。

前面的核给出了中心像素与其所有直接水平邻域像素之间的平均强度差。如果某个像素从周围的像素中脱颖而出,那么结果值就会很高。这种类型的核表示了一个高增益滤波器,是一种HPF,在边缘检测中特别有效。

请注意,在边缘检测核中,通常值的总和为0。我们将在本章的3.6节中介绍这一内容。

我们来看一个将HPF应用于图像的例子:

在初始导入之后,我们定义了一个3×3的核和一个5×5的核,然后加载了一幅灰度图像。之后,我们想要将图像和每个核进行卷积。有几个库函数可用于这一目标。NumPy提供了convolve函数,但是,该函数只接受一维数组。尽管也可以用NumPy实现多维数组的卷积,但是会有点复杂。SciPy的ndimage模块也提供了一个convolve函数,并且支持多维数组。最后,OpenCV提供了一个filter2D函数(用于与二维数组卷积)以及一个sepFilter2D函数(用于可以分解为两个一维核的二维核的特例)。前面的代码示例展示了ndimage.convolve函数。我们将在3.6节的其他例子中使用cv2.filter2D函数。

通过应用2个HPF以及我们定义的2个卷积核,我们继续执行脚本。最后,通过应用一个LPF并计算原始图像之间的差值,我们还实现了获得HPF的另一种方法。我们来看一下每个滤波器的样子。首先以图3-1所示的图片作为输入,得到的输出如图3-2所示。

你会注意到微分HPF(如图3-2右下角的图片所示)产生最佳寻边结果。因为这个微分方法涉及一个低通滤波器,我们来详细介绍一下这种类型的滤波器。如果HPF增强了某个像素的强度,给定它与相邻像素的差异,如果与周围像素的差异低于某一阈值,那么LPF将会平滑像素。这适用于去噪和模糊。例如,其中一个最流行的模糊/平滑滤波器——高斯模糊,它就是一个低通滤波器,可以衰减高频信号的强度。高斯模糊的结果如图3-2的左下角图片所示。

既然我们已经在一个基本示例中尝试了这些滤波器,接下来考虑一下如何将它们集成到一个更大、更具交互性的应用程序中。

图3-1 输入图片

图3-2 输出结果 Td3NWT6AHAy0Ij2F+XoFeWJEXBbMrXk8100X+Zl/qExSzjELEzrBJZJnSpm37H+e

点击中间区域
呼出菜单
上一章
目录
下一章
×