- OpenCV Python 教程
- OpenCV Python - 首页
- OpenCV Python - 概述
- OpenCV Python - 环境配置
- OpenCV Python - 读取图像
- OpenCV Python - 写入图像
- OpenCV Python - 使用Matplotlib
- OpenCV Python - 图像属性
- OpenCV Python - 位运算
- OpenCV Python - 形状和文本
- OpenCV Python - 鼠标事件
- OpenCV Python - 添加轨迹条
- OpenCV Python - 缩放和旋转
- OpenCV Python - 图像阈值化
- OpenCV Python - 图像滤波
- OpenCV Python - 边缘检测
- OpenCV Python - 直方图
- OpenCV Python - 颜色空间
- OpenCV Python - 图像变换
- OpenCV Python - 图像轮廓
- OpenCV Python - 模板匹配
- OpenCV Python - 图像金字塔
- OpenCV Python - 图像加法
- OpenCV Python - 图像融合
- OpenCV Python - 傅里叶变换
- OpenCV Python - 捕捉视频
- OpenCV Python - 播放视频
- OpenCV Python - 从视频提取图像
- OpenCV Python - 从图像生成视频
- OpenCV Python - 人脸检测
- OpenCV Python - 均值漂移/CamShift
- OpenCV Python - 特征检测
- OpenCV Python - 特征匹配
- OpenCV Python - 数字识别
- OpenCV Python 资源
- OpenCV Python - 快速指南
- OpenCV Python - 资源
- OpenCV Python - 讨论
OpenCV Python - 傅里叶变换
傅里叶变换用于将图像从空间域转换到频域,方法是将其分解为正弦和余弦分量。
对于数字图像,基本的灰度图像值通常在0到255之间。因此,傅里叶变换也需要是**离散傅里叶变换 (DFT)**。它用于查找频域。
数学上,二维图像的傅里叶变换表示如下:
$$\mathrm{F(k,l)=\displaystyle\sum\limits_{i=0}^{N-1}\: \displaystyle\sum\limits_{j=0}^{N-1} f(i,j)\:e^{-i2\pi (\frac{ki}{N},\frac{lj}{N})}}$$
如果幅度在短时间内变化很快,可以说它是高频信号。如果变化缓慢,则为低频信号。
对于图像,幅度在边缘点或噪点处剧烈变化。因此,边缘和噪点是图像中的高频成分。如果幅度变化不大,则为低频成分。
OpenCV 提供了**cv.dft()** 和 **cv.idft()** 函数来实现此目的。
cv.dft() 执行一维或二维浮点数组的离散傅里叶变换。其命令如下:
cv.dft(src, dst, flags)
这里:
- src - 可以是实数或复数的输入数组。
- dst - 输出数组,其大小和类型取决于标志。
- flags - 变换标志,表示 DftFlags 的组合。
cv.idft() 计算一维或二维数组的逆离散傅里叶变换。其命令如下:
cv.idft(src, dst, flags)
为了获得离散傅里叶变换,输入图像被转换为 np.float32 数据类型。然后使用获得的变换将零频率分量移到频谱的中心,从中计算幅度谱。
示例
以下是使用 Matplotlib 的程序,我们绘制原始图像和幅度谱:
import numpy as np import cv2 as cv from matplotlib import pyplot as plt img = cv.imread('lena.jpg',0) dft = cv.dft(np.float32(img),flags = cv.DFT_COMPLEX_OUTPUT) dft_shift = np.fft.fftshift(dft) magnitude_spectrum = 20*np.log(cv.magnitude(dft_shift[:,:,0],dft_shift[:,:,1])) plt.subplot(121),plt.imshow(img, cmap = 'gray') plt.title('Input Image'), plt.xticks([]), plt.yticks([]) plt.subplot(122),plt.imshow(magnitude_spectrum, cmap = 'gray') plt.title('Magnitude Spectrum'), plt.xticks([]), plt.yticks([]) plt.show()
输出
广告