登月图片消噪
scipy.fftpack模块用来计算快速傅里叶变换
速度比传统傅里叶变换更快,是对之前算法的改进
图片是二维数据,注意使用fftpack的二维转变方法
# 所有的函数都可以使用正弦波表示,所有函数都可以表示成多个正弦波叠加(多项式)
# 傅里叶变换可以将复杂的数据转换成单一的数据
# 时域----------->频域
导入相关包
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
显示原始图片
#引入图片
moon = plt.imread('./moonlanding.png')
#设置图片显示的大小
plt.figure(figsize = (12,9))
#此处由于是黑白照片,加上cmap = 'gray'避免色调失衡
plt.imshow(moon.cmap = 'gray')
# 以下为颜色可匹配数据
'''
Accent, Accent_r, Blues, Blues_r, BrBG, BrBG_r, BuGn, BuGn_r, BuPu, BuPu_r, CMRmap, CMRmap_r,
Dark2, Dark2_r, GnBu, GnBu_r, Greens, Greens_r, Greys, Greys_r, OrRd, OrRd_r, Oranges, Oranges_r,
PRGn, PRGn_r, Paired, Paired_r, Pastel1, Pastel1_r, Pastel2, Pastel2_r, PiYG, PiYG_r, PuBu, PuBuGn,
PuBuGn_r, PuBu_r, PuOr, PuOr_r, PuRd, PuRd_r, Purples, Purples_r, RdBu, RdBu_r, RdGy, RdGy_r, RdPu,
RdPu_r, RdYlBu, RdYlBu_r, RdYlGn, RdYlGn_r, Reds, Reds_r, Set1, Set1_r, Set2, Set2_r, Set3, Set3_r,
Spectral, Spectral_r, Wistia, Wistia_r, YlGn, YlGnBu, YlGnBu_r, YlGn_r, YlOrBr, YlOrBr_r, YlOrRd,
YlOrRd_r, afmhot, afmhot_r, autumn, autumn_r, binary, binary_r, bone, bone_r, brg, brg_r, bwr, bwr_r,
cividis, cividis_r, cool, cool_r, coolwarm, coolwarm_r, copper, copper_r, cubehelix, cubehelix_r,
flag, flag_r, gist_earth, gist_earth_r, gist_gray, gist_gray_r, gist_heat, gist_heat_r, gist_ncar,
gist_ncar_r, gist_rainbow, gist_rainbow_r, gist_stern, gist_stern_r, gist_yarg, gist_yarg_r, gnuplot,
gnuplot2, gnuplot2_r, gnuplot_r, gray, gray_r, hot, hot_r, hsv, hsv_r, inferno, inferno_r, jet, jet_r,
magma, magma_r, nipy_spectral, nipy_spectral_r, ocean, ocean_r, pink, pink_r, plasma, plasma_r, prism,
prism_r, rainbow, rainbow_r, seismic, seismic_r, spring, spring_r, summer, summer_r, tab10, tab10_r,
tab20, tab20_r, tab20b, tab20b_r, tab20c, tab20c_r, terrain, terrain_r, viridis, viridis_r, winter, winter_r
'''
结果如下
由图片显示可知:
# 图片中存在噪声点,白色的圆环
# 圆环上的数据和圆环里面和外面不同,所以可以显示出肉眼可识别的图片
# 波动
# 存在噪声的地方,波动比较大
# 傅里叶变换可以将数据转换,数据------->频域(数据波动情况)
# 将波动比较大的数据过滤掉,噪声过滤
导入scipy,并显示图片的相关数据
import scipy.fftpack as fftpack
# 1、将时域(真实数据)------>频域
moon_fft = fftpack.fft2(moon)
moon_fft
显示如下:
查看图片二维数据的平均值:
np.abs(moon_fft).mean()
结果为:51.193375
通过傅里叶变换将二维数据转换
# 2、将波动比较大的数据设置为0
# 设置临界值500 ,大于500的波动情况比较大,过滤掉
cond = np.abs(moon_fft) > 500
moon_fft[cond] = 0
moon_fft
#3、 再将频域------->时域(数据)
moon_result = fftpack.ifft2(moon_fft)
moon_result
# 去除复数
moon_result = np.real(moon_result)
moon_result
运行结果为:(以上过程可分步进行,查看每次操作的数据变换过程,加深理解,此处不赘述)
显示傅里叶变换后的结果:
plt.figure(figsize = (12,9))
plt.imshow(moon_result,cmap = 'gray')
最终效果:
此处我再将使用高斯滤波及中值滤波的方法附上,得到的效果与傅里叶变换类似
导包:
from scipy import ndimage
import scipy.misc as misc
高斯滤波:
# sigma 高斯核,表示离散程度
# 正态分布又叫高斯分布
moon2 = ndimage.gaussian_filter(moon,sigma=2)
plt.figure(figsize=(12,9))
plt.imshow(moon2,cmap='gray')
结果如图:
中值滤波:
# 中值滤波方法
moon3 = ndimage.median_filter(moon,size=9)
plt.figure(figsize=(12,9))
plt.imshow(moon3,cmap='gray')
中值滤波结果如下图:
结论:虽然3种方式均实现了对于图片数据的消噪操作,但就实际使用来说,更推荐使用傅里叶变换及高斯滤波,得到的结果会更稳定,视觉效果更好。如果采用中值滤波,虽然在一些图片修改中感觉差别不大,但对于照片中存在较复杂的情境下,可能会影响到图片操作后的清晰度。
数值积分,求解圆周率
intergrate 对函数(1-x**2)**0.5进行积分
x = np.linspace(-1,1,200)
y = (1-x**2)**0.5
display(x,y)
显示一个r=1的园的数据(此处结果较长,就不贴图了)
通过plot绘制出图形
# plot绘制
plt.figure(figsize = (4,4))
plt.plot(x,y)
plt.plot(x,-y)
由于我们设置圆的半径为1,所以根据面积公式可知求取圆的面积即为圆周率的值
使用scipy.integrate进行积分,调用quad()方法
import scipy.integrate as integrate
ret,err = integrate.quad(f,-1,1)
print('使用积分求解的圆周率:%s;误差是:%s'%(str(ret*2),str(err)))
输出的结果为:
使用积分求解的圆周率:3.141592653589797;误差是:1.0002356720661965e-09