- 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()
輸出
廣告