OpenCV python 傅利葉變換

2021-10-06 15:17:16 字數 2524 閱讀 2415

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

所以一般情況下,由於影象中的高頻分量與低頻分量都存在,我們可以用傅利葉變換進行濾波。

當然,需要先注意以下幾點:

- opencv中主要就是cv2.dft()和cv2.idft(),輸入影象需要先轉換成np.float32 格式。

- 得到的結果中頻率為0的部分會在左上角,通常要轉換到中心位置,可以通過shift變換來實現。

- cv2.dft()返回的結果是雙通道的(實部,虛部),通常還需要轉換成影象格式才能展示(0,255)。

那麼用傅利葉變換進行濾波的優點在哪兒呢,它可以把影象由時域轉換成頻域,由於頻域中的資訊更為簡單,所以濾波起來更為方便,濾波之後再轉換到時域,那麼就相當於乙個濾波了。

# 得到灰度圖能表示的形式

可以看到,中心部分比較亮,越靠近中間位置低頻資訊越多,而高頻資訊則都在邊界部分。

接下來要想對其進行濾波,應該怎麼辦呢?

顯而易見,既然我們要去除低頻分量,那就定乙個範圍,比如30*30的正方形範圍,以影象中心為正方形中心點。

當然了,想去除高頻分量,只需要相反就行了,**:

rows, cols = img.shape

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

# 低通濾波

mask = np.zeros((rows, cols, 2), np.uint8)

mask[crow-30:crow+30, ccol-30:ccol+30] = 1

# 高通濾波器

# 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()

低通結果:

高通結果:

傅利葉 灰度

假設你原來的圖象為 i n,n 傅利葉變換後的矩陣為 f n,n 顯示傅利葉變換後的圖象其實就是顯示矩陣 f n,n 啊,因為變換後的係數是複數,所以取幅值。同時為了顯示方便,有時候會進行 normalize,把 f n,n 的範圍變換到0 255區間,有時候為了突出黑 白對比,還會進行對數運算 l...

傅利葉分析

傅利葉分析究竟是幹什麼用的?這段相對比較枯燥,已經知道了的同學可以直接跳到下乙個分割線。先說乙個最直接的用途。無論聽廣播還是看電視,我們一定對乙個詞不陌生 頻道。頻道頻道,就是頻率的通道,不同的頻道就是將不同的頻率作為乙個通道來進行資訊傳輸。下面大家嘗試一件事 先在紙上畫乙個sin x 不一定標準,...

傅利葉級數

微積分 總結自課本基礎知識 三角函式與正交性 特別注意三角函式系1,cosx sin x,co s2x,sin2 x,cos nx,s innx 在區間 上正交,指的是該函式系中任何兩個不用的函式積在 上的積分為0.這是乙個很奇妙的特性,特別驗證一下。給定的是對稱區間,因此,如果被積函式是奇函式,則...