首頁 > 軟體

python opencv影象的高通濾波和低通濾波的範例程式碼

2022-06-23 14:00:21

前言

上一章我們說明了如何將影象機娘傅立葉變換,將影象由時域變換成頻域,並將低頻移動至影象中心。那麼將低頻移動中心後,就可以將影象的低頻和高頻分開,從而進行低通濾波和高通濾波的處理。

完整程式碼

低通濾波

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

# cv2.imread()在讀取影象的時候,預設的是讀取成RGB影象,cv2.IMREAD_GRAYSCALE將以灰度圖的形式讀取
img = cv2.imread('./moon.jpg', flags = cv2.IMREAD_GRAYSCALE)  
# 將影象除以255是為了將影象向數位準換成fioat32資料
img1 = img/255 
# 進行傅立葉變換,時域——>頻域
dtf = cv2.dft(img1, flags = cv2.DFT_COMPLEX_OUTPUT)  
# 移動低頻波到中心位置
dft_shift = np.fft.fftshift(dtf)  

# 低通濾波
h,w = img.shape
# 影象中心點即低頻波所在位置
h2, w2 = h//2, w//2  
mask = np.zeros((h,w,2), dtype=np.uint8)
# 選取長寬為100的區域的低頻部分為1,其餘部分為0
mask[h2-50:h2+50,w2-50:w2+50] = 1  

# 低頻部分保留,其餘部分*0被濾掉
dft_shift*=mask  
# 傅立葉逆變換,頻域——>時域
ifft_shift2 = np.fft.ifftshift(dft_shift)  
result = cv2.idft(ifft_shift2)

# 建立顯示視窗,顯示原圖
plt.figure(figsize=(12,9))
plt.subplot(121)
plt.imshow(img, cmap = 'gray')

# 建立顯示視窗,顯示低通濾波後的影象
plt.subplot(122)
plt.imshow(result[:,:,0], cmap='gray')
plt.show()

高通濾波

高通濾波和低通濾波的主要區別在於,低通濾波是保留中心的低頻波去除高頻波,高通濾波是去除中心的低頻波保留高頻波。

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

# cv2.imread()在讀取影象的時候,預設的是讀取成RGB影象,cv2.IMREAD_GRAYSCALE將以灰度圖的形式讀取
img = cv2.imread('./moon.jpg', flags = cv2.IMREAD_GRAYSCALE)  
# 將影象除以255是為了將影象向數位準換成fioat32資料
img1 = img/255 
# 進行傅立葉變換,時域——>頻域
dtf = cv2.dft(img1, flags = cv2.DFT_COMPLEX_OUTPUT)  
# 移動低頻波到中心位置
dft_shift = np.fft.fftshift(dtf)

# 高通濾波
h,w = img.shape
# 影象中心點即低頻波所在位置
h2, w2 = h//2, w//2  # 中心點
# 選取長寬為100的區域的低頻部分為0,其餘高頻部分為1
dft_shift[h2-5:h2+5,w2-5:w2+5] = 0
# 傅立葉逆變換,頻域——>時域
ifft_shift2 = np.fft.ifftshift(dft_shift)  
result = cv2.idft(ifft_shift2)

# 建立顯示視窗,顯示原圖
plt.figure(figsize=(12,9))
plt.subplot(121)
plt.imshow(img, cmap = 'gray')

# 建立顯示視窗,顯示低通濾波後的影象
plt.subplot(122)
plt.imshow(result[:,:,0], cmap='gray')
plt.show()

結果展示

改變濾波區域的大小可以改變濾波的程度,可以修改如圖所示的程式碼中的相關部分:

低通濾波

高通濾波

到此這篇關於python opencv影象的高通濾波和低通濾波的文章就介紹到這了,更多相關python opencv影象內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com