scipy.fftpack模块用来计算快速傅里叶变换
速度比传统傅里叶变换更快,是对之前算法的改进
黑白图片是二维数据,注意使用fftpack的二维转变方法
import numpy as np
# 这是scipy中的傅里叶变换
from scipy.fftpack import fft2, ifft2
import matplotlib.pyplot as plt
# PIL也是处理图片的
from PIL import Image
# png 最大范围 0 - 1
moon = plt.imread('./moonlanding.png')
moon
# 结果如下:
plt.imshow(moon,cmap='gray')
# 结果如下:
# 进行傅里叶变换
# 傅里叶变化是把时域变为频域
moon_fft2 = fft2(moon)
moon_fft2
# 先求一个绝对值, 为什么, 因为有白圆环和黑圆环, 谁正谁负并不清楚
# 1e3 代表1000
cond = np.abs(moon_fft2) > 1e3
moon_fft2[cond] = 0
# 再把频域转变为时域
# ifft2
moon_ifft2 = ifft2(moon_fft2)
moon_ifft2
# 去除复数
res = np.real(moon_ifft2)
# 显示图片
plt.figure(figsize=(12,9))
plt.imshow(res,cmap='gray')
scipy是基于numpy的
import numpy as np
import matplotlib.pyplot as plt
# MCM
# 祖率: 3.1415926 - 927
# 计算机通过积分的方式来画圆
# x^2 + y^2 = r^2
# f(x) = (r^2 - x^2)^0.5
# 假设圆的半径我们知道, r = 1
X = np.linspace(-1,1,1000)
f = (1 - X**2)**0.5
# 计算三角形, 以0点计算, 计算对边
# 我们画圆形需要x和y
plt.figure(figsize=(4,4))
# 有了三角形, 圆形的斜边顶点就找到了, 把这2000个顶点给连接起来就使用一个圆形
plt.plot(X, f)
plt.plot(X, -f)
使用scipy.integrate进行积分,调用quad()方法,求圆周率
# integrate 在数学上用作积分运算
import scipy.integrate as integrate
import scipy
f = lambda x : (1-x**2)**0.5
# quad中第一个参数是一个func, y轴的解,a和b代表x轴的范围, 分别填入-1,1
pi, error = integrate.quad(f,-1,1)
# (1.5707963267948986, 1.0002356720661965e-09)
# 第一个数是圆周率, 第二个数是误差
print('通过积分求解的圆周率:%s, 误差为:%s' % (pi*2, error*2))
# 结果是:
# 通过积分求解的圆周率:3.141592653589797, 误差为:2.000471344132393e-09
# io
import scipy.io as io
from scipy.fftpack import fft2, ifft2
moon = plt.imread('./moonlanding.png')
moon_fft2 = fft2(moon)
cond = np.abs(moon_fft2) > 1e3
moon_fft2[cond] = 0
moon_ifft2 = ifft2(moon_fft2)
res = np.real(moon_ifft2)
plt.figure(figsize=(12,9))
plt.imshow(res,cmap='gray')
#.mat 这是一种数据格式
# math matrix
# matlib 通用字典
# 文件存储都是以二进制
io.savemat('./moon_clear.mat',{'moon':res})
# load
io.loadmat('./moon_clear.mat')['moon']
# 结果是:
array([[-0.2826645 , 0.08010893, -0.21303105, ..., -0.03895291,
-0.18217105, -0.17954478],
[-0.00702763, 0.06715892, -0.09148968, ..., -0.1856927 ,
-0.19348538, -0.15636131],
[-0.03724453, -0.12469123, -0.10263439, ..., -0.18584874,
-0.19098356, 0.08034539],
...,
[ 0.07167082, -0.04644684, -0.07860907, ..., 0.09754767,
0.02351329, 0.18534262],
[ 0.00943622, -0.06645724, -0.02696014, ..., 0.05524265,
-0.00268553, 0.19484597],
[-0.0551862 , 0.03641299, -0.06190041, ..., 0.03356535,
0.02719305, -0.02497441]], dtype=float32)
读写图片使用scipy中misc.imread()/imsave()
# misc 表示是一个库非常的杂乱无章
import scipy.misc as misc
# 利用这个库读出来以后做了一个变换把PNG转变昵称了JPG
moon = misc.imread('./moonlanding.png')
plt.figure(figsize=(12,9))
plt.imshow(moon, cmap='gray')
# 结果如下:
imrotate、imresize、imfilter 旋转, 改变大小, 滤波
# 旋转
plt.imshow(misc.imrotate(moon, 60),cmap='gray')
# 结果是:
# imresize int 0.5 = 50%缩小
plt.imshow(misc.imresize(moon,0.5),cmap='gray')
# tuple(100, 200) 是压缩成Y为100, X为200的图片
plt.imshow(misc.imresize(moon,(100, 200)),cmap='gray')
The filter that has to be applied , Legal values are:
‘blur’, ‘contour’, ‘detail’, ‘edge_enhance’, ‘edge_enhance_more’,
‘emboss’, ‘find_edges’, ‘smooth’, ‘smooth_more’, ‘sharpen’.
必须应用的筛选器, 法律价值是:
‘模糊’, ‘轮廓’, ‘细节’, ‘EdgEl增强’, ‘EdgEI增强’
‘浮雕’,’发现边缘’,’平滑’,’平滑多’, ‘锐化’
# 这是一张模糊的图片
cat = plt.imread('./cat.jpg')
plt.imshow(misc.imfilter(cat, 'blur'))
# 轮廓图
plt.imshow(misc.imfilter(cat, 'contour'))
# sharpen
plt.figure(figsize=(12,9))
plt.imshow(misc.imfilter(cat, 'sharpen'))
使用scipy.misc.face(gray=True)获取图片,
使用ndimage移动坐标、旋转图片、切割图片、缩放图片导包,读取图片显示图片
import scipy.ndimage as ndimage
# 在ndimage中, scipy给我们提供了一张图片, misc.face()
face = misc.face(gray = True)
plt.imshow(face, cmap='gray')
# input 代表将要被处理的图片
# 第二个参数代表你要移动多少
plt.imshow(ndimage.shift(face, [-100, 200], mode=), cmap='gray')
# mode : 'constant', 'nearest', 'reflect', 'mirror' or 'wrap
plt.imshow(ndimage.shift(face, [-100, 200], mode='mirror'), cmap='gray')
# resize imresize
plt.imshow(ndimage.zoom(face, 0.5), cmap='gray')
# sequence 序列中的值只能是浮点型, 分别代表对y轴和x轴进行缩放
plt.imshow(ndimage.zoom(face, [0.3,0.8]), cmap='gray')
plt.imshow(face, cmap='gray')
plt.imshow(face[:500,400:950],cmap='gray')
face1 = misc.face()
face1.shape
plt.imshow(face1)
#plt.imshow(ndimage.shift(face1, [100, 200]), 彩色图片是三维的, 少写一维会报错
plt.imshow(ndimage.shift(face1, [100, 200, -2]))
# rgb -> rrg
#(100,200,300) -> (100,100,200) -> (100,100,100) ->(300,100,100)
plt.imshow(ndimage.shift(face1, [100, 200, 1], mode='mirror'))
# 注意的是颜色的滚动
plt.imshow(ndimage.shift(face1, [100, 200, 4], mode='mirror'))
# zoom 进行压缩
plt.imshow(ndimage.zoom(face1,[0.5,0.5, 1]), cmap='gray')
添加噪声,对噪声图片使用ndimage中的高斯滤波、中值滤波、signal中维纳滤波进行处理,使图片变清楚
使用了misc.face()的灰色照片添加噪声
face_blur = face + np.random.randn(face_blur.shape[0], face_blur.shape[1])*face.std()
plt.imshow(face_blur, cmap='gray')
# sigma频率
# 频率怎么取值
# plt.subplot(1, 3, 1) subplot中的值代表 1行 显示3张图片 当前是编号1
plt.figure(figsize=(12,9))
axes = plt.subplot(1, 3, 1)
axes.imshow(ndimage.gaussian_filter(face_blur, sigma=2), cmap='gray')
axes1 = plt.subplot(132)
axes1.imshow(ndimage.gaussian_filter(face_blur, sigma=0), cmap='gray')
axes2 = plt.subplot(133)
axes2.imshow(ndimage.gaussian_filter(face, sigma=0), cmap='gray')
# 可以用来还原照片
moon = plt.imread('./moonlanding.png')
plt.imshow(ndimage.gaussian_filter(moon,sigma=2), cmap='gray')
中值滤波参数size:给出在每个元素上从输入数组中取出的形状位置,定义过滤器功能的输入
plt.figure(figsize=(12,9))
axes = plt.subplot(1, 3, 1)
axes.imshow(ndimage.median_filter(face_blur, size=6), cmap='gray')
axes1 = plt.subplot(132)
axes1.imshow(face_blur, cmap='gray')
axes2 = plt.subplot(133)
axes2.imshow(face, cmap='gray')
import scipy.signal as signal
plt.figure(figsize=(12,9))
axes = plt.subplot(1, 3, 1)
axes.imshow(signal.wiener(face_blur, mysize=10), cmap='gray')
axes1 = plt.subplot(132)
axes1.imshow(face_blur, cmap='gray')
axes2 = plt.subplot(133)
axes2.imshow(face, cmap='gray')