對進行頻域上的處理
opencv中主要就是cv2.dft()
和cv2.idft()
,輸入影象需要先轉換成np.float32
格式。
得到的結果中頻率為0的部分會在左上角,通常要轉換到中心位置,可以通過shift
變換來實現。
cv2.dft()
返回的結果是雙通道的(實部,虛部),通常還需要轉換成影象格式才能展示(0,255)。
#將頻率為0的移到中心
# 因為傅利葉變換返回的是實部和虛部,故要轉換為矩陣的形式用影象展示出來
#magnitude函式的作用是計算二維向量的幅值,這裡就是計算虛數的幅值
magnitude_spectrum =
20*np.log(cv2.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(
)左圖為原圖,右圖為原圖在頻域上頻率分布的情況,中間的低頻,隨著向四周擴散頻率逐漸公升高
#以上的**都和前面相同
rows, cols = img.shape
crow, ccol =
int(rows/2)
,int
(cols/2)
#取中心位置,製作掩膜,將高頻的區域置0覆蓋掉,保留低頻訊號
# 低通濾波,通過建立掩膜來提取低頻訊號
mask = np.zeros(
(rows, cols,2)
, np.uint8)
mask[crow-
30:crow+
30, ccol-
30:ccol+30]
=1# idft 傅利葉逆變換
fshift = dft_shift*mask #相當於與操作
f_ishift = np.fft.ifftshift(fshift)
#前面將頻率為0移到了中心,現在要先移回左上角再做逆變換
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(
)效果如下
同理,高通濾波也一樣,只是掩膜不同
# 中心位置
# 高通濾波
mask = np.ones(
(rows, cols,2)
, np.uint8)
mask[crow-
30:crow+
30, ccol-
30:ccol+30]
=0#這裡將中間低頻的部分置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(
)效果如下
教程來自:
傅利葉變化
1.尤拉公式 2.傅利葉級數 任何週期函式都可以轉化成正弦函式和 2.1 三角函式表現形式 2.2 指數表現形式 f t 是傅利葉的指數展開式子,fn 正弦波的實質是在圓周運動在一條直線上的投影 下圖中乙個復合信合可以有很多正弦函式疊加而成,並且從不同的方向看這些疊加函式,可以得到時域和頻域函式。3...
FFT快速傅利葉變化原始碼
fft1.cpp 此檔案包含 main 函式。程式執行將在此處開始並結束。include pch.h include include include define n 64 64點 define log2n 6 log2n 6 複數型別 typedef struct complex complex ...
傅利葉 灰度
假設你原來的圖象為 i n,n 傅利葉變換後的矩陣為 f n,n 顯示傅利葉變換後的圖象其實就是顯示矩陣 f n,n 啊,因為變換後的係數是複數,所以取幅值。同時為了顯示方便,有時候會進行 normalize,把 f n,n 的範圍變換到0 255區間,有時候為了突出黑 白對比,還會進行對數運算 l...