python_数据_scipy_快速傅里叶变换

快速傅里叶变换fftpack(图片去噪)

start

import numpy as np
import matplotlib.pyplot as plt
from scipy import fftpack
moon = plt.imread('./moonlanding.png')

python_数据_scipy_快速傅里叶变换_第1张图片

# 将数据使用傅里叶变换转换为频域      波动大的地方---> 不够平滑 ---->过滤掉 ----> 去除噪声
# 实现
moon_fft = fftpack.fft2(moon)
moon_fft  # 复数 = 实数 + 虚数
  • array([[126598.45 +0.j , -4608.5796 -1892.4688j ,
    -322.093 -20.27744j , …, -906.1585 +1539.3081j ,
    -322.093 +20.27744j , -4608.5796 +1892.4688j ],
    [ -9421.1 +5242.1133j , 5224.016 -3171.7434j ,
    1607.9927 +1269.4243j , …, -677.34503 -936.16174j ,
    354.6247 -1003.8348j , 1965.366 -2188.0593j ],
    [ -2928.3513 +7280.916j , -1116.4065 +1338.3179j ,
    -474.20056 +385.40216j , …, 239.7723 -977.2129j ,
    1582.9283 -261.95346j , 2641.927 -292.09366j ],
    …,
    [ 1850.5718 -2451.1787j , -781.0807 +13.744501j ,
    377.90707 +12.6699295j, …, -1526.7869 +1271.2621j ,
    -2705.5718 -3488.529j , 1897.404 -2281.9092j ],
    [ -2928.3513 -7280.916j , 2641.927 +292.09366j ,
    1582.9283 +261.95346j , …, -2208.4302 +81.807434j ,
    -474.20056 -385.40216j , -1116.4065 -1338.3179j ],
    [ -9421.1 -5242.1133j , 1965.366 +2188.0593j ,
    354.6247 +1003.8348j , …, 1190.5856 -1431.9937j ,
    1607.9927 -1269.4243j , 5224.016 +3171.7434j ]],
    dtype=complex64)
moon_fft.shape, moon.shape
  • out:((474, 630), (474, 630))
  • 可见:傅里叶变换并不会改变数据的结构
np.abs(moon_fft).mean()    # 所有波的平均波动情况
  • out:45.850685
# 过滤到大于10倍的平均值的值,这里用平均值替换
cond = np.abs(moon_fft) > 458
moon_fft[cond] = np.abs(moon_fft).mean() 
# 将频域的数据转换到时域
moon_res = fftpack.ifft2(moon_fft)
# 转换为时域后,为复数,需要转为实数
res = np.real(moon_res)   # 取实部
plt.figure(figsize=(12,9))
plt.imshow(res,cmap='gray')

你可能感兴趣的:(scipy,fftpack,fftpack)