python学习——pandas扩展:傅里叶变换

导包,np
从numpy.fft导入fft、ifft
导入图片库PIL中的Image

In [1]:
import numpy as np

#fft傅里叶转换,ifft傅里叶反转
from numpy.fft import fft,ifft #真实世界,时域 ndarray #规律,频域 高低, from PIL import Image 
 

第一步读取数据

In [2]:
cat = Image.open('cat.png') 
In [7]:
cat
Out[7]:
 

转换成int类型数据,int8 == 128

In [10]:
cat_data = np.fromstring(cat.tobytes(),dtype=np.int8) # 之所以有负数,是因为int8<128,颜色值0~255 cat_data 
 
C:\Users\BLX\AppData\Roaming\Python\Python37\site-packages\ipykernel_launcher.py:1: DeprecationWarning: The binary mode of fromstring is deprecated, as it behaves surprisingly on unicode inputs. Use frombuffer instead
  """Entry point for launching an IPython kernel.
Out[10]:
array([ -25,  -70, -125, ...,  -68,   95,   62], dtype=int8)
 

傅里叶转换,傅里叶转换的结果包含实数,和虚数

In [11]:
cat_data_fft = fft(cat_data) #真实数据,变换成了频率,频域 cat_data_fft 
Out[11]:
array([-1569123.        -9.16715531e-12j,
       -7005918.98362136+1.26047833e+07j,
       -2819481.22749805+8.87746379e+06j, ...,
         622731.56198532-2.77534574e+06j,
       -2819481.22749805-8.87746379e+06j,
       -7005918.98362136-1.26047833e+07j])
In [ ]:
# -7005918.98362136+12604783.28030717j 实数+虚数

# x^2 = 4 ---> -2 / 2
# x^2 = -4 --->虚数
 

将傅里叶的数据去除低频的波,设置为0
np.where(np.abs(fft_result)<1e5,0,fft_result)

In [14]:
#条件
cond = np.abs(cat_data_fft)<1e5 #根据条件获取索引 inds = np.where(cond) #修改,将低频数据,设置为0 cat_data_fft[inds] = 0 
 

使用傅里叶进行反转

In [15]:
cat_data_ifft = ifft(cat_data_fft) cat_data_ifft 
Out[15]:
array([-31.23561646+7.92027437e-15j,  39.44677252+2.01495746e-14j,
       -31.5575318 +3.27923467e-14j, ..., -17.97882673+3.30018319e-14j,
        56.94689652-2.02978024e-14j,  -4.95576222+1.21296142e-14j])
 

获取实数
np.real()

In [16]:
cat_data_real = np.real(cat_data_ifft) cat_data_real 
Out[16]:
array([-31.23561646,  39.44677252, -31.5575318 , ..., -17.97882673,
        56.94689652,  -4.95576222])
 

去除小数部分

In [17]:
cat_data_result = np.int8(cat_data_real) 
In [18]:
cat_data_result
Out[18]:
array([-31,  39, -31, ..., -17,  56,  -4], dtype=int8)
 

将一维的数组,通过Image进行转换,图片

In [19]:
cat_outline = Image.frombytes(mode = cat.mode,size=cat.size,data=cat_data_result) 
In [22]:
cat_outline
Out[22]:

你可能感兴趣的:(python学习——pandas扩展:傅里叶变换)