先分享一篇文章,講解傅里葉相關知識點
https://www.cnblogs.com/h2zZhou/p/8405717.html
- scipy.fftpack模塊用來計算快速傅里葉變換
- 速度比傳統傅里葉變換更快,是對之前算法的改進
- 圖片是二維數據
- 注意使用fftpack的二維轉變方法
登月圖片降噪
import numpy as np
import pandas as pd
from pandas import Series,DataFrame
import matplotlib.pyplot as plt
%matplotlib inline
讀取圖片文件
moon = plt.imread('../data/moonlanding.png')
moon
設置圖片寬高,展示圖片
plt.figure(figsize=(10,8))
plt.imshow(moon, cmap='gray')
操作步驟:
1. 先快速傅里葉變換. (fft2)
2. 把頻率比較大的點賦值爲0. 我們認爲噪點的頻率比較大.
3. 還原, 逆傅里葉變換. (ifft2)
4. 去虛保實. (np.real)
5. 顯示圖片 (plt.imshow)
from scipy.fftpack import fft2
from scipy.fftpack import ifft2
原圖moon中的數據是0~1之間的小數(32位浮點型數據)
通過快速傅里葉變換後,轉換成了64位的複數
fft2(moon)
也就是將一個問題從“時域”轉換成了“頻域”
- 噪點的“頻域”比較高,要去掉高頻域的噪點
- p.where() 對滿足某些條件的數據賦值
- 閾值:threshold (8e2 = 8*10^2)
先設定一個閾值爲8e2(不同值效果不同), 通過條件判斷後,返回的是一堆 True/False 的df數據
np.where() : 把moon_fft的數據,對滿足 “(np.abs(moon_fft) > threshold” 條件的數據賦值爲0(即降噪)
# 頻率大於閾值的點賦值爲0 .
# moon_fft_result = np.where(np.abs(moon_fft) > threshold, 0, moon_fft)
查看結果,剩下的數據都是絕對值小於800(8e2)的數值
逆變換
moon_ifft = ifft2(moon_fft_result)
moon_ifft
去虛保實(將複數轉變回小數)
#去噪後的數據
moon_cleaned = np.real(moon_ifft)
moon_cleaned
設置寬高,查看大小
plt.figure(figsize=(10,8))
plt.imshow(moon_cleaned, cmap='gray')