导包,np
从numpy.fft导入fft、ifft
导入图片库PIL中的Image
import numpy as np
#导入傅里叶函数,fft,ifft你操作
from numpy.fft import fft,ifft
#真实世界,时域 ndarray
#规律,频域 高低,
from PIL import Image
第一步读取数据
cat = Image.open('cat.png')
cat
转换成int类型数据,int8 == 128
cat.tobytes()
#cat.tobytes()字节,8位 ----->对应最大的数字:-127 - 127
cat_data = np.fromstring(cat.tobytes(),dtype=np.int8)
display(cat_data.shape,cat_data)
(998640,)
array([ -25, -70, -125, ..., -68, 95, 62], dtype=int8)
傅里叶转换,傅里叶转换的结果包含实数,和虚数
cat_data_fft = fft(cat_data)
#真实数据,变换成了频率,频域
cat_data_fft
array([-1569123.00000000 +0.j , -7005918.98362136+12604783.28030717j, -2819481.22749804 +8877463.78907501j, ..., 622731.56198530 -2775345.73593521j, -2819481.22749811 -8877463.789075j , -7005918.98362145-12604783.28030712j])
# -7005918.98362136+12604783.28030717j 实数+虚数
# x^2 = 4 ---> -2 / 2
# x^2 = -4 --->虚数
将傅里叶的数据去除低频的波,设置为0
np.where(np.abs(fft_result)<1e5,0,fft_result)
#条件
cond = np.abs(cat_data_fft)<1e5
#根据条件获取索引
inds = np.where(cond)
#修改,将低频数据,设置为0
cat_data_fft[inds] = 0
使用傅里叶进行反转
cat_data_ifft = ifft(cat_data_fft)
cat_data_ifft
array([-31.23561646 +8.45787086e-13j, 39.44677252 -4.60382931e-13j, -31.55753180 -3.59976481e-13j, ..., -17.97882673 +8.77398889e-13j, 56.94689652 -3.10200458e-13j, -4.95576222 -8.60253380e-13j])
获取实数
np.real()
cat_data_real = np.real(cat_data_ifft)
cat_data_real
array([-31.23561646, 39.44677252, -31.5575318 , ..., -17.97882673, 56.94689652, -4.95576222])
去除小数部分
cat_data_result = np.int8(cat_data_real)
将一维的数组,通过Image进行转换,图片
cat_data_result.shape
(998640,)
cat_data_result
array([-31, 39, -31, ..., -17, 56, -4], dtype=int8)
cat_outline = Image.frombytes(mode = cat.mode,size=cat.size,data=cat_data_result)
cat_outline
cat
显示图片