当前位置: 代码迷 >> 综合 >> Scipy(科学计算工具包)
  详细解决方案

Scipy(科学计算工具包)

热度:87   发布时间:2023-11-19 13:22:14.0

文章目录

  • 使用傅里叶变换消除噪点
  • 使用matplotlib.pyplot绘制圆
  • Scipy文件输入/输出
    • 读写数组文件
    • 读写图片
    • [pillow](https://pillow.readthedocs.io/en/latest/)图片处理
    • 使用scipy的ndimage处理图片

使用傅里叶变换消除噪点

代码是基于jupyter notebook
图片链接

import numpy as np
import matplotlib.pyplot as plt
from scipy import fftpack
%matplotlib inline
# 这个一个具有很多噪点的图片
img = plt.imread('data/moolanding.png')
# 展示图片
plt.imshow(img)# 调用傅里叶变换消除噪点,时域(原图片)--->  频域(数据波动情况)——>将波动比较大的数据过滤掉,噪声过滤
img_fft = fftpack.fft2(img)# 将图片状态从时域,转化为频域 
# 将波动情况较大的数据过滤掉# 解释下np.where(condition, x, y) 满足condition的返回x,不满足,返回y
# 将大于800的数据都赋值为0,800需要自己寻找,找到一个能让图片最清晰显示的数值便可
img_filter = np.where(np.abs(img_fft)>8e2,0,img_fft)
# 傅里叶变换后的数据是实数,含有实部和虚部,需要去掉虚部
img_result = np.real(moon_filter)
# 创建画布
plt.figure(figsize=(12,9))
# 显示过滤后的图片
plt.imshow(img_result,cmap='gray')

使用matplotlib.pyplot绘制圆

import matplotlib.pyplot as plt
# 圆的一般方程:(x-a)**2+(y-b)**2 = R**2
# 下面画出一个半径为1,圆心为原点的圆
x = np.linspace(-1,1,1000) # 将-1到1分成1000份
y = (1-x**2)**0.5 # 求出y 
# 这样是画出了一个上圆
plt.plot(x,  y)
# 画出一个完整的圆plt.plot(x,y,x,-y)# 求出圆的面积
import scipy.integrate as integrate# 求出了上半圆的面积,deviation得到的是误差
# 可以使用其求出圆的圆周率
half_areas,deviation = integrate.quad(lambda x :(1-x**2)**0.5, -1, 1)
half_areas

Scipy文件输入/输出

读写数组文件

from scipy import io as spio
# 用到了上面的img_result
# 保存的文件格式是.mat,是标准的二进制文件
spio.savemat('moon.mat',{'moon':img_result})
# 使用io.loadmat()读取.mat文件
data = spio.loadmat('moon.mat')
data

读写图片

图片位置

import imageio
# 读取
cat = imageio.imread('data/cat.jpg')
#保存
imageio.imwrite('cat.jpg',cat)
# 旋转图片
import skimage.transform as st
# mode :{'constant', 'edge', 'symmetric', 'reflect', 'wrap'}
# 指定旋转角度
cat_rotate = st.rotate(cat, angle=90,mode='wrap')
plt.imshow(cat_rotate)
# skimage.transform还可以缩放图片和添加滤镜,但是在1.2.0版本后这些功能都会移除
# 推荐使用Pillow来进行图片处理

pillow图片处理

from PIL import Image,ImageFilter
cat = Image.open('data/cat.jpg')
# 直接显示图片
cat
# 给cat添加滤镜下面是添加了锐化效果  ,
# ImageFilter.  然后按tab会有滤镜提示
cat.filter(ImageFilter.SHARPEN)
# pillow是python最好的图片处理库,但是不是我们的重点,如果需要了解详情,点标题中的链接

使用scipy的ndimage处理图片

图片链接

from matplotlib import pyplot as plt
from scipy import ndimage
face = plt.imread('data/huanxiong.jpg')
plt.imshow(face)
# shift 移动图片坐标,图片移动之后会出现黑色的边框
# 这几种模式是针对黑色边框的 {'reflect', 'constant', 'nearest', 'mirror', 'wrap'}
face_shift = ndimage.shift(face, (200,300,0), mode="wrap")
plt.imshow(face_shift)# 图片旋转 rotate,180度
face_rotate = ndimage.rotate(face,angle=180,model='reflect')
# 图片缩放,zoom , 只能作用于灰度图片,
face_zoom = plt.imread('data/huanxiong.jpg',gray=True)
face_zoom = ndimage.zoom(face,zoom(0.3,0.6))
plt.imshow(face_zoom,cmap='gray)
# 还有一些滤波,给图片添加噪声 也是要灰度图片
face_noise = face.copy().astype(np.float64)
face_noise+=*face_noise.std()*np.random.randn(*face.shape)
plt.imshow(face_noise,cmap='gray')# 高斯滤波sigma:高斯核的标准偏差
face_gaussian = ndimage.gaussian_filter(face_noise, sigma=1)# 中值滤波参数size:给出在每个元素上从输入数组中取出的形状位置,定义过滤器功能的输入
face_median = ndimage.median_filter(face_noise, size=5)
# signal维纳滤波mysize:滤镜尺寸的标量import scipy.signal as signal
face_wiener = signal.wiener(face_noise, mysize=4)
  相关解决方案