import numpy as np
import numpy.fft as nf
import matplotlib.pyplot as plt
from PIL import Image
#猫的图片(原图)
cat = Image.open('cat.jpeg')
cat.show()
print('cat.jpeg图片的原始数据')
#cat.tobytes()字节,8位 ----->对应最大的数字:-127 - 127
cat_data = np.fromstring(cat.tobytes(),dtype=np.int8)
display(cat_data.shape,cat_data)
#导入傅立叶变换需要的包(fft模块,c实数或复数序列的离散傅里叶变换)
from scipy.fftpack import fft
cat_data_fft = fft(cat_data)
print('经过傅里叶转换,傅里叶转换的结果包含实数,和虚数')
#真实数据,变换成了频率,频域
display(cat_data_fft)
# -7005918.98362136+12604783.28030717j 实数+虚数
# x^2 = 4 ---> -2 / 2
# x^2 = -4 --->虚数
#低频,意味着变化不大;高频,意味着陡变
print('将傅里叶的数据去除低频的波,设置为0')
#条件,有正数、负数,通过abs取绝对值
cond = np.abs(cat_data_fft)<1e5
#根据条件获取索引
inds = np.where(cond)
#修改,将低频数据,设置为0
cat_data_fft[inds] = 0
display(cat_data_ifft)
print('使用傅里叶进行反转')
#使用傅里叶进行反转
from scipy.fftpack import ifft
cat_data_ifft = ifft(cat_data_fft)
display(cat_data_ifft)
print('通过条件转换与傅里叶反转之后,获取实数部分')
#获取实数
cat_data_real = np.real(cat_data_ifft)
display(cat_data_real)
print('对实数,去除小数部分,转换为整数')
#去除小数部分
cat_data_result = np.int8(cat_data_real)
display(cat_data_result)
print('将一维的数组,通过Image进行转换,图片')
#将一维的数组,通过Image进行转换,图片
cat_outline = Image.frombytes(mode = cat.mode,size=cat.size,data=cat_data_result)
cat_outline
输出显示:
cat.jpeg图片的原始数据
/usr/local/lib/python3.7/dist-packages/ipykernel_launcher.py:11: DeprecationWarning: The binary mode of fromstring is deprecated, as it behaves surprisingly on unicode inputs. Use frombuffer instead
# This is added back by InteractiveShellApp.init_path()
(1132677,)
array([113, 72, 80, ..., -7, -2, -1], dtype=int8)
经过傅里叶转换,傅里叶转换的结果包含实数,和虚数
array([-22140653. -0.j ,
12232785.72976409-6150913.99594079j,
1434362.76169597-2058206.78574201j, ...,
1320812.63407745+5081032.3553913j ,
1434362.76169597+2058206.78574201j,
12232785.72976409+6150913.99594079j])
将傅里叶的数据去除低频的波,设置为0
array([ 3.35487594+2.62086253e-15j, 9.28812257-1.50506885e-14j,
22.17280658-8.79402157e-15j, ..., -7.98816347+3.00866447e-15j,
4.75353257-2.64462905e-14j, 10.82160959-8.07933903e-15j])
使用傅里叶进行反转
array([ 3.35487594+2.62086253e-15j, 9.28812257-1.50506885e-14j,
22.17280658-8.79402157e-15j, ..., -7.98816347+3.00866447e-15j,
4.75353257-2.64462905e-14j, 10.82160959-8.07933903e-15j])
通过条件转换与傅里叶反转之后,获取实数部分
array([ 3.35487594, 9.28812257, 22.17280658, ..., -7.98816347,
4.75353257, 10.82160959])
对实数,去除小数部分,转换为整数
array([ 3, 9, 22, ..., -7, 4, 10], dtype=int8)
将一维的数组,通过Image进行转换,图片
Out[11]:
仅供参考学习,严禁转载!