登月图片消噪及圆周率的求取(Python数据分析)

登月图片消噪

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
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值