摘要:本文講解基于傅里葉變換的高通濾波和低通濾波,
本文分享自華為云社區《[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”圖,第二幅圖為低通濾波器模糊處理后的影像,
點擊關注,第一時間了解華為云新鮮技術~
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/509772.html
標籤:Python
