機器學習進階-直方圖與傅里葉變換-傅里葉變換(高低通濾波) 1.cv2.dft(進行傅里葉變化) 2.np.fft.fftshift(將低頻移動到圖像的中心) 3.cv2.magnitude(計算矩陣的加和平方根) 4.np.fft.ifftshift(將低頻和高頻移動到原來位置) 5.cv2.idft(傅里葉逆變換)


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()

從上圖可以看出保留了圖像的邊緣部分,而其他的信息被去除了


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM