OpenCV 4.11.0
开源计算机视觉库
加载中...
搜索中...
无匹配项
傅里叶变换

目标

  • 使用 OpenCV 查找图像的傅里叶变换
  • 傅里叶变换的一些应用
  • 我们将学习以下函数:cv.dft()

理论

傅里叶变换用于分析各种滤波器的频率特性。对于图像,使用二维离散傅里叶变换 (DFT) 来查找频域。一种称为快速傅里叶变换 (FFT) 的快速算法用于计算 DFT。有关这些内容的详细信息,可在任何图像处理或信号处理教科书中找到。

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

更直观地说,对于正弦信号,如果幅度在短时间内变化得很快,可以说它是高频信号。如果变化缓慢,则是低频信号。您可以将相同的概念扩展到图像。图像中幅度变化剧烈的地方在哪里?在边缘点或噪点处。因此,我们可以说,边缘和噪点是图像中的高频成分。如果幅度没有太大变化,则它是低频成分。

DFT 计算的性能对于某些数组大小更好。当数组大小为 2 的幂时,速度最快。大小为 2、3 和 5 的乘积的数组也能相当有效地进行处理。因此,如果您担心代码的性能,可以在查找 DFT 之前将数组的大小修改为任何最佳大小(通过填充零)。OpenCV 提供了一个函数cv.getOptimalDFTSize() 用于此目的。

现在我们将了解如何查找傅里叶变换。

OpenCV 中的傅里叶变换

DFT 计算的性能对于某些数组大小更好。当数组大小为 2 的幂时,速度最快。大小为 2、3 和 5 的乘积的数组也能相当有效地进行处理。因此,如果您担心代码的性能,您可以将数组的大小修改为任何最佳大小(通过填充零)。那么我们如何找到这个最佳大小呢?OpenCV 提供了一个函数,cv.getOptimalDFTSize() 用于此目的。

我们使用以下函数:cv.dft (src, dst, flags = 0, nonzeroRows = 0)

参数
src可以是实数或复数的输入数组。
dst输出数组,其大小和类型取决于标志。
flags变换标志,表示 cv.DftFlags 的组合
nonzeroRows当参数不为零时,函数假定输入数组(未设置 DFT_INVERSE)的前 nonzeroRows 行或输出数组(已设置 DFT_INVERSE)的前 nonzeroRows 行包含非零值,因此,函数可以更有效地处理其余行并节省一些时间;此技术对于使用 DFT 计算数组互相关或卷积非常有用。

cv.getOptimalDFTSize (vecsize)

参数
vecsize向量大小。

cv.copyMakeBorder (src, dst, top, bottom, left, right, borderType, value = new cv.Scalar())

参数
src可以是实数或复数的输入数组。
dst输出数组,其大小和类型取决于标志。
top参数,指定要从源图像矩形每个方向外推的顶部像素数。
bottom参数,指定要从源图像矩形每个方向外推的底部像素数。
left参数,指定要从源图像矩形每个方向外推的左侧像素数。
right参数,指定要从源图像矩形每个方向外推的右侧像素数。
borderType边界类型。
value如果 borderType == cv.BORDER_CONSTANT,则为边界值。

cv.magnitude (x, y, magnitude)

参数
x向量的 x 坐标的浮点数组。
y向量的 y 坐标的浮点数组;它必须与 x 大小相同。
magnitude与 x 大小和类型相同的输出数组。

cv.split (m, mv)

参数
m输入多通道数组。
mv输出数组向量;如有需要,数组本身将重新分配。

cv.merge (mv, dst)

参数
mv要合并的矩阵输入向量;mv 中的所有矩阵必须具有相同的大小和相同的深度。
dst与 mv[0] 大小和深度相同的输出数组;通道数将是矩阵数组中通道的总数。

试一试