1. cv2.dft(img, cv2.DFT_COMPLEX_OUTPUT) 進行傅里葉變化
參數說明: img表示輸入的圖片, cv2.DFT_COMPLEX_OUTPUT表示進行傅里葉變化的方法
2. np.fft.fftshift(img) 將圖像中的低頻部分移動到圖像的中心
參數說明:img表示輸入的圖片
3. cv2.magnitude(x, y) 將sqrt(x^2 + y^2) 計算矩陣維度的平方根
參數說明:需要進行x和y平方的數
4.np.fft.ifftshift(img) # 進圖像的低頻和高頻部分移動到圖像原來的位置
參數說明:img表示輸入的圖片
5.cv2.idft(img) # 進行傅里葉的逆變化
參數說明:img表示經過傅里葉變化后的圖片
傅里葉變化:將圖像從空間域轉換為頻率域, 下面是傅里葉變化的公式
對應於頻率的方向,我們可以看出紅色那條線的頻率最小,藍色線的頻率最大, 高頻指變化劇烈的灰度分量,即圖像邊界的地方, 低頻指變換緩慢的灰度分量
構建出的傅里葉變化的圖片,將低頻移到中間位置, 通常呈現中間亮,周圍暗,是因為對於低頻而言,波動較大,比如紅色那條線,因此呈現亮,對於高頻而言,波動較小,比如藍色那條線,因此呈現暗
代碼:
第一步:載入圖片
第二步:使用np.float32進行格式轉換
第三步:使用cv2.dft進行傅里葉變化
第四步:使用np.fft.shiftfft將低頻轉移到中間位置
第五步:使用cv2.magnitude將實部和虛部投影到空間域
第六步:進行作圖操作
import cv2 import numpy as np import matplotlib.pyplot as plt # 第一步讀取圖片 img = cv2.imread('lena.jpg', 0) # 第二步:進行float32形式轉換 float32_img = np.float32(img) # 第三步: 使用cv2.dft進行傅里葉變化 dft_img = cv2.dft(float32_img, flags=cv2.DFT_COMPLEX_OUTPUT) # 第四步:使用np.fft.shiftfft()將變化后的圖像的低頻轉移到中心位置 dft_img_ce = np.fft.fftshift(dft_img) # 第五步:使用cv2.magnitude將實部和虛部轉換為實部,乘以20是為了使得結果更大 img_dft = 20 * np.log(cv2.magnitude(dft_img_ce[:, :, 0], dft_img_ce[:, :, 1])) # 第六步:進行畫圖操作 plt.subplot(121) plt.imshow(img, cmap='gray') plt.subplot(122) plt.imshow(img_dft, cmap='gray') plt.show()
2.只保留低頻,即進行低通濾波,因為高頻表示是一些細節,即圖像的輪廓和邊緣,失去了高頻部分,圖像就容易變得模糊
代碼:
第一步:讀取圖片
第二步:np.float32進行類型轉換
第三步:使用cv2.dft進行傅里葉變化
第四步:使用np.fft.fftshift 將低頻部分轉換到圖像的中心
第五步:構造掩模,使得掩模的中心位置為1,邊緣位置為0
第六步:將掩模與傅里葉變換后的圖像結合,只保留中心部分的低頻位置
第七步:使用np.fft.ifftshift將低頻部分轉移回圖像的原先位置
第八步:使用cv2.idft進行傅里葉的反轉換
第九步:使用cv2.magnitude將圖像的實部和虛部轉換為空間域內
第十步:進行作圖操作
# 使用掩模只保留低通 # 第一步讀入圖片 img = cv2.imread('lena.jpg', 0) # 第二步:進行數據類型轉換 img_float = np.float32(img) # 第三步:使用cv2.dft進行傅里葉變化 dft = cv2.dft(img_float, flags=cv2.DFT_COMPLEX_OUTPUT) # 第四步:使用np.fft.fftshift將低頻轉移到圖像中心 dft_center = np.fft.fftshift(dft) # 第五步:定義掩模:生成的掩模中間為1周圍為0 crow, ccol = int(img.shape[0] / 2), int(img.shape[1] / 2) # 求得圖像的中心點位置 mask = np.zeros((img.shape[0], img.shape[1], 2), np.uint8) mask[crow-30:crow+30, ccol-30:ccol+30] = 1 # 第六步:將掩模與傅里葉變化后圖像相乘,保留中間部分 mask_img = dft_center * mask # 第七步:使用np.fft.ifftshift(將低頻移動到原來的位置 img_idf = np.fft.ifftshift(mask_img) # 第八步:使用cv2.idft進行傅里葉的反變化 img_idf = cv2.idft(img_idf) # 第九步:使用cv2.magnitude轉化為空間域內 img_idf = cv2.magnitude(img_idf[:, :, 0], img_idf[:, :, 1]) # 第十步:進行繪圖操作 plt.subplot(121) plt.imshow(img, cmap='gray') plt.subplot(122) plt.imshow(img_idf, cmap='gray') plt.show()
3.只保留圖像的高頻部分
流程與上面一樣,只是構造的掩模是中間為0,邊緣為1,然后與傅里葉變化后的圖像結合, 保留高頻部分,去除低頻部分
代碼:
# 只保留高頻部分 # 使用掩模只保留低通 # 第一步讀入圖片 img = cv2.imread('lena.jpg', 0) # 第二步:進行數據類型轉換 img_float = np.float32(img) # 第三步:使用cv2.dft進行傅里葉變化 dft = cv2.dft(img_float, flags=cv2.DFT_COMPLEX_OUTPUT) # 第四步:使用np.fft.fftshift將低頻轉移到圖像中心 dft_center = np.fft.fftshift(dft) # 第五步:定義掩模:生成的掩模中間為0周圍為1 crow, ccol = int(img.shape[0] / 2), int(img.shape[1] / 2) # 求得圖像的中心點位置 mask = np.ones((img.shape[0], img.shape[1], 2), np.uint8) mask[crow-30:crow+30, ccol-30:ccol+30] = 0 # 第六步:將掩模與傅里葉變化后圖像相乘,保留中間部分 mask_img = dft_center * mask # 第七步:使用np.fft.ifftshift(將低頻移動到原來的位置 img_idf = np.fft.ifftshift(mask_img) # 第八步:使用cv2.idft進行傅里葉的反變化 img_idf = cv2.idft(img_idf) # 第九步:使用cv2.magnitude轉化為空間域內 img_idf = cv2.magnitude(img_idf[:, :, 0], img_idf[:, :, 1]) # 第十步:進行繪圖操作 plt.subplot(121) plt.imshow(img, cmap='gray') plt.subplot(122) plt.imshow(img_idf, cmap='gray') plt.show()
從上圖可以看出保留了圖像的邊緣部分,而其他的信息被去除了