OpenCV 4.12.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参数指定从源图像矩形在每个方向上外推的底部像素的数量。
参数指定从源图像矩形在每个方向上外推的左侧像素的数量。
参数指定从源图像矩形在每个方向上外推的右侧像素的数量。
borderType边框类型。
如果 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] 大小和深度相同的输出数组; 通道数将是矩阵数组中通道的总数。

尝试一下