我們生活在時間的世界中,早上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.這是乙個很奇妙的特性,特別驗證一下。給定的是對稱區間,因此,如果被積函式是奇函式,則...