跟我學Python影象處理丨傅立葉變換之高通濾波和低通濾波
本文分享自華為雲社群《[Python影象處理] 二十三.傅立葉變換之高通濾波和低通濾波》,作者:eastmount 。
一.高通濾波
傅立葉變換的目的並不是為了觀察影象的頻率分佈(至少不是最終目的),更多情況下是為了對頻率進行過濾,通過修改頻率以達到影象增強、影象去噪、邊緣檢測、特徵提取、壓縮加密等目的。
過濾的方法一般有三種:低通(Low-pass)、高通(High-pass)、帶通(Band-pass)。所謂低通就是保留影象中的低頻成分,過濾高頻成分,可以把過濾器想象成一張漁網,想要低通過濾器,就是將高頻區域的訊號全部拉黑,而低頻區域全部保留。例如,在一幅大草原的影象中,低頻對應著廣袤且顏色趨於一致的草原,表示影象變換緩慢的灰度分量;高頻對應著草原影象中的老虎等邊緣資訊,表示影象變換較快的灰度分量,由於灰度尖銳過度造成高通濾波器是指通過高頻的濾波器,衰減低頻而通過高頻,常用於增強尖銳的細節,但會導致影象的對比度會降低。該濾波器將檢測影象的某個區域,根據畫素與周圍畫素的差值來提升畫素的亮度。圖展示了“Lena”圖對應的頻譜影象,其中心區域為低頻部分。
接著通過高通濾波器覆蓋掉中心低頻部分,將255兩點變換為0,同時保留高頻部分,其處理過程如下圖所示。
rows, cols = img.shape
crow,ccol = int(rows/2), int(cols/2)
fshift[crow-30:crow+30, ccol-30:ccol+30] = 0
通過高通濾波器將提取影象的邊緣輪廓,生成如下圖所示影象。
# -*- coding: utf-8 -*-
import cv2 as cv
import numpy as np
from matplotlib import pyplot as plt
#讀取影象
img = cv.imread('Lena.png', 0)
#傅立葉變換
f = np.fft.fft2(img)
fshift = np.fft.fftshift(f)
#設定高通濾波器
rows, cols = img.shape
crow,ccol = int(rows/2), int(cols/2)
fshift[crow-30:crow+30, ccol-30:ccol+30] = 0
#傅立葉逆變換
ishift = np.fft.ifftshift(fshift)
iimg = np.fft.ifft2(ishift)
iimg = np.abs(iimg)
#顯示原始影象和高通濾波處理影象
plt.subplot(121), plt.imshow(img, 'gray'), plt.title('Original Image')
plt.axis('off')
plt.subplot(122), plt.imshow(iimg, 'gray'), plt.title('Result Image')
plt.axis('off')
plt.show()
輸出結果如下圖所示,第一幅圖為原始“Lena”圖,第二幅圖為高通濾波器提取的邊緣輪廓影象。它通過傅立葉變換轉換為頻譜影象,再將中心的低頻部分設定為0,再通過傅立葉逆變換轉換為最終輸出影象“Result Image”。
二.低通濾波
低通濾波器是指通過低頻的濾波器,衰減高頻而通過低頻,常用於模糊影象。低通濾波器與高通濾波器相反,當一個畫素與周圍畫素的插值小於一個特定值時,平滑該畫素的亮度,常用於去燥和模糊化處理。如PS軟體中的高斯模糊,就是常見的模糊濾波器之一,屬於削弱高頻訊號的低通濾波器。
下圖展示了“Lena”圖對應的頻譜影象,其中心區域為低頻部分。如果構造低通濾波器,則將頻譜影象中心低頻部分保留,其他部分替換為黑色0,其處理過程如圖所示,最終得到的效果圖為模糊影象。
那麼,如何構造該濾波影象呢?如下圖所示,濾波影象是通過低通濾波器和頻譜影象形成。其中低通濾波器中心區域為白色255,其他區域為黑色0。
低通濾波器主要通過矩陣設定構造,其核心程式碼如下:
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
通過低通濾波器將模糊影象的完整程式碼如下所示:
# -*- coding: utf-8 -*-
import cv2
import numpy as np
from matplotlib import pyplot as plt
#讀取影象
img = cv2.imread('lena.bmp', 0)
#傅立葉變換
dft = cv2.dft(np.float32(img), flags = cv2.DFT_COMPLEX_OUTPUT)
fshift = np.fft.fftshift(dft)
#設定低通濾波器
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
#掩膜影象和頻譜影象乘積
f = fshift * mask
print f.shape, fshift.shape, mask.shape
#傅立葉逆變換
ishift = np.fft.ifftshift(f)
iimg = cv2.idft(ishift)
res = cv2.magnitude(iimg[:,:,0], iimg[:,:,1])
#顯示原始影象和低通濾波處理影象
plt.subplot(121), plt.imshow(img, 'gray'), plt.title('Original Image')
plt.axis('off')
plt.subplot(122), plt.imshow(res, 'gray'), plt.title('Result Image')
plt.axis('off')
plt.show()
輸出結果如圖所示,第一幅圖為原始“Lena”圖,第二幅圖為低通濾波器模糊處理後的影象。
參考文獻:
- 《數字影象處理》(第3版),岡薩雷斯著,阮秋琦譯,電子工業出版社,2013年.
- 《數字影象處理學》(第3版),阮秋琦,電子工業出版社,2008年,北京.
- 《OpenCV3程式設計入門》,毛星雲,冷雪飛,電子工業出版社,2015,北京.
- 百度百科-傅立葉變換
- 網易雲課堂-高登教育 Python+OpenCV影象處理
- 一文講盡Thread類的原始碼精髓
- 手把手教大家寫書寫一個Mqtt閘道器
- 總結了6種卷積神經網路壓縮方法
- 雲小課|手把手教您在PyCharm中連線雲端資源進行程式碼除錯
- 程式碼例項解讀如何安全釋出物件
- 過年回去,終於給老人講清楚兩臺電腦是如何通訊的
- 震網(Stuxnet)病毒深度解析:首個攻擊真實世界基礎設施的病毒
- 跟我學Python影象處理丨帶你入門OpenGL
- 跨域:後端工程師最熟悉的陌生“人”
- 當你輸入網址,小手一點,然後發生了什麼?
- 【帶你讀論文】向量表徵經典之DeepWalk
- 為什麼網路I/O會被阻塞?
- 智慧流程機器人助你“聚划算”
- 可以一學的程式碼優化小技巧:減少if-else冗餘
- 聊聊Cookie、Session、Token 背後的故事
- 不懂任務排程系統,快來看這篇
- 基於隨機森林演算法進行硬碟故障預測
- 教你如何解決T 0的問題
- 高併發環境下構建快取服務,你需要注意這6點
- cookie、session,、token,還在傻傻分不清?