天天看點

跟我學Python圖像處理丨傅裡葉變換之高通濾波和低通濾波

摘要:本文講解基于傅裡葉變換的高通濾波和低通濾波。

本文分享自華為雲社群《​​[Python圖像處理] 二十三.傅裡葉變換之高通濾波和低通濾波​​》,作者:eastmount 。

一.高通濾波

傅裡葉變換的目的并不是為了觀察圖像的頻率分布(至少不是最終目的),更多情況下是為了對頻率進行過濾,通過修改頻率以達到圖像增強、圖像去噪、邊緣檢測、特征提取、壓縮加密等目的。

過濾的方法一般有三種:低通(Low-pass)、高通(High-pass)、帶通(Band-pass)。所謂低通就是保留圖像中的低頻成分,過濾高頻成分,可以把過濾器想象成一張漁網,想要低通過濾器,就是将高頻區域的信号全部拉黑,而低頻區域全部保留。例如,在一幅大草原的圖像中,低頻對應着廣袤且顔色趨于一緻的草原,表示圖像變換緩慢的灰階分量;高頻對應着草原圖像中的老虎等邊緣資訊,表示圖像變換較快的灰階分量,由于灰階尖銳過度造成

高通濾波器是指通過高頻的濾波器,衰減低頻而通過高頻,常用于增強尖銳的細節,但會導緻圖像的對比度會降低。該濾波器将檢測圖像的某個區域,根據像素與周圍像素的內插補點來提升像素的亮度。圖展示了“Lena”圖對應的頻譜圖像,其中心區域為低頻部分。

跟我學Python圖像處理丨傅裡葉變換之高通濾波和低通濾波

接着通過高通濾波器覆寫掉中心低頻部分,将255兩點變換為0,同時保留高頻部分,其處理過程如下圖所示。

跟我學Python圖像處理丨傅裡葉變換之高通濾波和低通濾波
rows, cols = img.shape
crow,ccol = int(rows/2), int(cols/2)
fshift[crow-30:crow+30, ccol-30:ccol+30] = 0      

通過高通濾波器将提取圖像的邊緣輪廓,生成如下圖所示圖像。

跟我學Python圖像處理丨傅裡葉變換之高通濾波和低通濾波
# -*- 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”。

跟我學Python圖像處理丨傅裡葉變換之高通濾波和低通濾波

二.低通濾波

低通濾波器是指通過低頻的濾波器,衰減高頻而通過低頻,常用于模糊圖像。低通濾波器與高通濾波器相反,當一個像素與周圍像素的插值小于一個特定值時,平滑該像素的亮度,常用于去燥和模糊化處理。如PS軟體中的高斯模糊,就是常見的模糊濾波器之一,屬于削弱高頻信号的低通濾波器。

下圖展示了“Lena”圖對應的頻譜圖像,其中心區域為低頻部分。如果構造低通濾波器,則将頻譜圖像中心低頻部分保留,其他部分替換為黑色0,其處理過程如圖所示,最終得到的效果圖為模糊圖像。

跟我學Python圖像處理丨傅裡葉變換之高通濾波和低通濾波

那麼,如何構造該濾波圖像呢?如下圖所示,濾波圖像是通過低通濾波器和頻譜圖像形成。其中低通濾波器中心區域為白色255,其他區域為黑色0。

跟我學Python圖像處理丨傅裡葉變換之高通濾波和低通濾波

低通濾波器主要通過矩陣設定構造,其核心代碼如下:

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”圖,第二幅圖為低通濾波器模糊處理後的圖像。