【数据分析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

【数据分析day05】快速傅里叶变换之“登月降噪”_第1张图片
设置图片宽高,展示图片

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位浮点型数据)
【数据分析day05】快速傅里叶变换之“登月降噪”_第2张图片
通过快速傅里叶变换后,转换成了64位的复数

fft2(moon)

【数据分析day05】快速傅里叶变换之“登月降噪”_第3张图片

也就是将一个问题从“时域”转换成了“频域”

  • 噪点的“频域”比较高,要去掉高频域的噪点
  • p.where() 对满足某些条件的数据赋值
  • 阈值:threshold (8e2 = 8*10^2)

先设定一个阈值为8e2(不同值效果不同), 通过条件判断后,返回的是一堆 True/False 的df数据
【数据分析day05】快速傅里叶变换之“登月降噪”_第4张图片
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)的数值
【数据分析day05】快速傅里叶变换之“登月降噪”_第5张图片
逆变换

moon_ifft = ifft2(moon_fft_result)
moon_ifft

去虚保实(将复数转变回小数)

#去噪后的数据
moon_cleaned = np.real(moon_ifft)
moon_cleaned

【数据分析day05】快速傅里叶变换之“登月降噪”_第6张图片
设置宽高,查看大小

plt.figure(figsize=(10,8))
plt.imshow(moon_cleaned, cmap='gray')

你可能感兴趣的:(数据分析)