【OpenCV-Python】:影像的傅立葉變換與逆傅立葉變換

米開朗琪羅~發表於2022-04-03

✨部落格主頁:米開朗琪羅~?
✨博主愛好:羽毛球?
✨年輕人要:Living for the moment(活在當下)!?
?推薦專欄:【影像處理】【千錘百煉Python】【深度學習】【排序演算法

?一、知識儲備

傅立葉變換就是將訊號時域轉化為頻域的過程,本文用程式實現對二維影像的傅立葉變換與逆變換!首先需要知道一維傅立葉變換!⬇️⬇️⬇️

?1.1 一維傅立葉變換

一維傅立葉變換的過程如下方動圖所示:
在這裡插入圖片描述
就像上面動圖所示一樣,一維的波可以用許多的正弦波疊加表示,這就是一維傅立葉變換的關鍵所在。

?1.2 二維傅立葉變換

這裡引用一張知乎博主的圖,十分通透!!!!!!

先貼上引用,尊重創作者!

https://zhuanlan.zhihu.com/p/99605178

在這裡插入圖片描述
如何表現???我們看!⬇️⬇️⬇️
在這裡插入圖片描述
右邊圖的每一個點都在描述一個平面波。

右圖中的每一個點:

  • 它到中點的距離描述的是頻率;
  • 中點到它的方向是平面波的方向;
  • 那點的灰度值是它的幅值。
    在這裡插入圖片描述
    通透!!!感謝這位博主的圖?

請新增圖片描述

?二、基於OpenCV的頻域變換

?2.1 傅立葉變換

?2.1.1 函式API

傅立葉變換:

函式式:out = cv2.dft(src, flag)

引數介紹:

  • 引數scr:輸入影像;
  • 引數flag:轉換標識,一般用cv2.DFT_COMPLEX_OUTPUT,即輸出一個複數陣列,更多請參考dft
  • 返回值out:複數陣列。

?2.1.2 程式設計

import cv2
import matplotlib.pyplot as plt
import numpy as np

original = cv2.imread(r'C:\Users\Lenovo\Desktop\lena1.jpg', 0)  # 轉為灰度圖

dft = cv2.dft(np.float32(original), flags=cv2.DFT_COMPLEX_OUTPUT)
dftShift = np.fft.fftshift(dft)     #  將影像中的低頻部分移動到影像的中心
result = 20 * np.log(cv2.magnitude(dftShift[:, :, 0], dftShift[:, :, 1]))   # 將實部和虛部轉換為實部,乘以20是為了使得結果更大

plt.subplot(121), plt.imshow(original, cmap='gray')
plt.title('original')
plt.axis('off')

plt.subplot(122), plt.imshow(result, cmap='gray')
plt.title('fft')
plt.axis('off')
plt.show()

?2.1.3 結果視覺化

在這裡插入圖片描述

?2.2 逆傅立葉變換

?2.2.1 程式設計

import cv2
import matplotlib.pyplot as plt
import numpy as np

original = cv2.imread(r'C:\Users\Lenovo\Desktop\lena1.jpg', 0)  # 轉為灰度圖

dft = cv2.dft(np.float32(original), flags=cv2.DFT_COMPLEX_OUTPUT)
dftShift = np.fft.fftshift(dft)     # 將影像中的低頻部分移動到影像的中心
result = 20 * np.log(cv2.magnitude(dftShift[:, :, 0], dftShift[:, :, 1]))   # 將實部和虛部轉換為實部,乘以20是為了使得結果更大

ishift = np.fft.ifftshift(dftShift)     # 低頻部分從影像中心移開
iImg = cv2.idft(ishift)                 # 傅立葉反變換
iImg = cv2.magnitude(iImg[:, :, 0], iImg[:, :, 1])      # 轉化為空間域

plt.subplot(131), plt.imshow(original, cmap='gray')
plt.title('original')
plt.axis('off')

plt.subplot(132), plt.imshow(result, cmap='gray')
plt.title('fft')
plt.axis('off')

plt.subplot(133), plt.imshow(iImg, cmap='gray')
plt.title('ifft')
plt.axis('off')
plt.show()

?2.2.2 結果視覺化

在這裡插入圖片描述

?三、基於NumPy的頻域變換

?3.1 傅立葉變換

?3.1.1 程式設計

import cv2
import matplotlib.pyplot as plt
import numpy as np

original = cv2.imread(r'C:\Users\Lenovo\Desktop\lena1.jpg', 0)  # 轉為灰度圖

dft = np.fft.fft2(original)
dftShift = np.fft.fftshift(dft)     # 將影像中的低頻部分移動到影像的中心
result = 20*np.log(np.abs(dftShift))

plt.subplot(121), plt.imshow(original, cmap='gray')
plt.title('original')
plt.axis('off')

plt.subplot(122), plt.imshow(result, cmap='gray')
plt.title('fft')
plt.axis('off')

plt.show()

?3.1.2 結果視覺化

在這裡插入圖片描述

?3.2 逆傅立葉變換

?3.2.1 程式設計

import cv2
import matplotlib.pyplot as plt
import numpy as np

original = cv2.imread(r'C:\Users\Lenovo\Desktop\lena1.jpg', 0)  # 轉為灰度圖

dft = np.fft.fft2(original)
dftShift = np.fft.fftshift(dft)     # 將影像中的低頻部分移動到影像的中心
result = 20*np.log(np.abs(dftShift))

ishift = np.fft.ifftshift(dftShift)     # 低頻部分從影像中心移開
iImg = np.fft.ifft2(ishift)                 # 傅立葉反變換
iImg = np.abs(iImg)

plt.subplot(131), plt.imshow(original, cmap='gray')
plt.title('original')
plt.axis('off')

plt.subplot(132), plt.imshow(result, cmap='gray')
plt.title('fft')
plt.axis('off')

plt.subplot(133), plt.imshow(iImg, cmap='gray')
plt.title('ifft')
plt.axis('off')
plt.show()

?3.2.2 結果視覺化

在這裡插入圖片描述

相關文章