OpenCV 4.10.0
开源计算机视觉
|
傅里叶变换用于分析各种滤波器的频率特性。对于图像,2D 离散傅里叶变换 (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 之前将数组的大小修改为任何最佳大小(通过填充 0)。OpenCV 提供了一个函数 cv.getOptimalDFTSize(),用于此目的。
现在我们将看到如何找到傅里叶变换。
DFT 计算的性能因数组大小的不同而异。当数组大小为 2 的幂时,速度最快。大小为 2、3 和 5 的乘积的数组也可以相当高效地处理。因此,如果你担心代码的性能,则可以将数组的大小修改为任何最佳大小(通过填充零)。那么,我们如何找到这个最佳大小?OpenCV 提供了一个函数,cv.getOptimalDFTSize() 用于此目的。
我们使用以下函数:cv.dft (src, dst, flags = 0, nonzeroRows = 0)
src | 输入数组,可以是实数或复数。 |
dst | 输出数组,其大小和类型取决于标志。 |
flags | 表示 cv.DftFlags 组合的转换标志 |
nonzeroRows | 当该参数不为零时,该函数假定输入数组(未设置 DFT_INVERSE)或输出数组(已设置 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 具有相同大小。 |
幅度 | 大小和类型与 x 相同的输出数组。 |
cv.split (m, mv)
m | 输入多通道数组。 |
mv | 数组输出向量;如果需要,将重新分配数组本身。 |
cv.merge (mv, dst)
mv | 要合并的矩阵输入向量;mv 中的所有矩阵都必须具有相同大小和相同深度。 |
dst | 大小和深度与 mv[0] 相同的输出数组;通道数将是矩阵数组中通道的总数。 |