OpenCV--傅里葉變換

我們生活在時間的世界中,早上7:00起來吃早飯,8:00去擠地鐵,9:00開始上班。。。以時間為參照就是時域分析。
但是在頻域中一切都是靜止的!

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

  • 傅里葉變換的作用

    • 高頻:變化劇烈的灰度分量,例如邊界
    • 低頻:變化緩慢的灰度分量,例如一片大海

    在原圖中做低頻/高頻的變換較難,因此轉(zhuǎn)換到頻域中處理較方便

  • 濾波

    • 低通濾波器:只保留低頻,會使得圖像模糊
    • 高通濾波器:只保留高頻,會使得圖像細(xì)節(jié)增強(qiáng)

opencv中主要就是 cv2.dft() 和 cv2.idft(),輸入圖像需要先轉(zhuǎn)換成np.float32 格式。
得到的結(jié)果中頻率為0的部分會在左上角,通常要轉(zhuǎn)換到中心位置,可以通過shift變換來實現(xiàn)。
cv2.dft()返回的結(jié)果是雙通道的(實部,虛部),通常還需要轉(zhuǎn)換成圖像格式才能展示(0,255), 用逆變換cv2.idft()。

img = cv2.imread('lena.jpg',0)
# 1.轉(zhuǎn)換成np.float32 格式
img_float32 = np.float32(img)
# 2.傅里葉變換 dft
dft = cv2.dft(img_float32, flags = cv2.DFT_COMPLEX_OUTPUT)
# 3.np的fftshift得到低頻在中心位置的頻譜圖
dft_shift = np.fft.fftshift(dft)
# 4.轉(zhuǎn)換一下 得到灰度圖能表示的形式
magnitude_spectrum = 20*np.log(cv2.magnitude(dft_shift[:,:,0],dft_shift[:,:,1]))    # 0 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()

低通濾波

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

img = cv2.imread('lena.jpg',0)
# 1.轉(zhuǎn)換成np.float32 格式
img_float32 = np.float32(img)
# 2.傅里葉變換 dft
dft = cv2.dft(img_float32, flags = cv2.DFT_COMPLEX_OUTPUT)
# 3.np的fftshift得到低頻在中心位置的頻譜圖
dft_shift = np.fft.fftshift(dft)

rows, cols = img.shape
crow, ccol = int(rows/2) , int(cols/2)     # 中心位置

# 4.低通濾波
mask = np.zeros((rows, cols, 2), np.uint8)
mask[crow-30:crow+30, ccol-30:ccol+30] = 1  # 所以計算圖像長寬是為制作mask,中心(30+30)x(30x30)區(qū)域為1

# 5.IDFT
fshift = dft_shift*mask                 # 僅保留了中心區(qū)域
f_ishift = np.fft.ifftshift(fshift)     # 把中心位置的東西放回原位  ifftshift
img_back = cv2.idft(f_ishift)           # 從頻譜圖轉(zhuǎn)換回來 idft
img_back = cv2.magnitude(img_back[:,:,0],img_back[:,:,1])   # 轉(zhuǎn)換一下 得到灰度圖能表示的形式

plt.subplot(121),plt.imshow(img, cmap = 'gray')
plt.title('Input Image'), plt.xticks([]), plt.yticks([])
plt.subplot(122),plt.imshow(img_back, cmap = 'gray')
plt.title('Result'), plt.xticks([]), plt.yticks([])

plt.show() 

高通濾波
同理,則代碼不詳細(xì)備注
僅mask[crow-30:crow+30, ccol-30:ccol+30] = 0與上面不同
因為保留高頻

img = cv2.imread('lena.jpg',0)
img_float32 = np.float32(img)

dft = cv2.dft(img_float32, flags = cv2.DFT_COMPLEX_OUTPUT)
dft_shift = np.fft.fftshift(dft)

rows, cols = img.shape
crow, ccol = int(rows/2) , int(cols/2)     # 中心位置

# 高通濾波
mask = np.ones((rows, cols, 2), np.uint8)
mask[crow-30:crow+30, ccol-30:ccol+30] = 0

# IDFT
fshift = dft_shift*mask
f_ishift = np.fft.ifftshift(fshift)
img_back = cv2.idft(f_ishift)
img_back = cv2.magnitude(img_back[:,:,0],img_back[:,:,1])

plt.subplot(121),plt.imshow(img, cmap = 'gray')
plt.title('Input Image'), plt.xticks([]), plt.yticks([])
plt.subplot(122),plt.imshow(img_back, cmap = 'gray')
plt.title('Result'), plt.xticks([]), plt.yticks([])
plt.show()

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容