【數據分析day05】快速傅里葉變換之“登月降噪”

先分享一篇文章,講解傅里葉相關知識點

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

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章