scipy詳解

登月圖片消噪

 

scipy.fftpack模塊用來計算快速傅里葉變換
速度比傳統傅里葉變換更快,是對以前算法的改進
圖片是二維數據,注意使用fftpack的二維轉變方法html

 
import numpy as np
import pandas as pd
from pandas import Series,DataFrame
import matplotlib.pyplot as plt
%matplotlib inline
 
# scipy的快速傅里葉變換函數
from scipy.fftpack import fft2,ifft2
data = plt.imread('moonlanding.png')
 
 
fft_data = fft2(data)
 
# 濾波 過濾高頻波
fft_data[np.where(np.abs(fft_data)>8e2)] = 0
 
# 轉換回時域
ifft_data = ifft2(fft_data)
# ifft_data
# 獲取實數部分
result = np.real(ifft_data)
 
plt.figure(figsize=(8,8))
plt.imshow(result,cmap='gray')
 
ifft_data.shape
 

數值積分,求解圓周率

求解圓周率python

integrate 對函數(1 - x^2)^0.5進行積分算法

 

使用scipy.integrate進行積分,調用quad()方法數組

 
import scipy.integrate as integrate
 
 
def func_xy(x):
# y = (1-x**2)**0.5
    return (1-x**2)**0.5
 
# 參數1: 是一個函數(指針),描述的是x和y之間的關係
# 參數2,3:是不規則圖形在x軸上的起點和終點
# quad函數求面積
area,err = integrate.quad(func_xy,-1,1)
pi = area*2
pi
 
 
Out[4]:
3.1415926535897967
 

Scipy文件輸入/輸出

 

隨機生成數組,使用scipy中的io.savemat()保存
文件格式是.mat,標準的二進制文件app

In [57]:
 
 
 
 
 
# i input
# o output
import scipy.io as io
 
 
In [58]:
 
 
 
 
 
data = np.random.random(size=(100,2))
data
 
. . .
In [59]:
 
 
 
 
 
io.savemat('mydata',{'data':data})
 
 
 

使用io.loadmat()讀取數據dom

 
ndata = io.loadmat('mydata.mat')['data']

讀寫圖片使用scipy中misc.imread()/imsave()ide

 
import scipy.misc as misc
plt.imshow(misc.face())
image = misc.face()
misc.imsave('mm.png',image)
plt.imshow(misc.imread('mm.png'))
# `imsave` is deprecated in SciPy 1.0.0, and will be removed in 1.2.0.
from imageio import imwrite,imread
 
imwrite('mmm.png',image)
 

其餘處理方式misc.imrotate\imresize\imfilter函數

# 處理圖片旋轉
rotate_image = misc.imrotate(image,angle=90)
 
d:\python3.6\lib\site-packages\ipykernel_launcher.py:1: DeprecationWarning: `imrotate` is deprecated!
`imrotate` is deprecated in SciPy 1.0.0, and will be removed in 1.2.0.
Use ``skimage.transform.rotate`` instead.
  """Entry point for launching an IPython kernel.
rotate_image
<matplotlib.image.AxesImage at 0x110b6630>
 
 
# 調整圖片大小
# 使用整數 百分比(0-100之間的數)
m1 = misc.imresize(image,size=50)
d:\python3.6\lib\site-packages\ipykernel_launcher.py:2: DeprecationWarning: `imresize` is deprecated!
`imresize` is deprecated in SciPy 1.0.0, and will be removed in 1.2.0.
Use ``skimage.transform.resize`` instead.
plt.imshow(m1)
# 0-1之間的小數,修改的是像素
m2 = misc.imresize(image,size=0.01)
plt.imshow(m2)
 
# 使用元組調整圖像大小(填充、壓縮的效果)
m3 = misc.imresize(image,size=(100,200))
plt.imshow(m3)
# 使用imfilter濾鏡,處理圖片效果
# 'blur', 'contour', 'detail', 'edge_enhance', 'edge_enhance_more','emboss', 'find_edges', 'smooth', 'smooth_more', 'sharpen'
m4 = misc.imfilter(image,ftype='edge_enhance')
plt.imshow(m4)
 

使用scipy.ndimage圖片處理

 

使用scipy.misc.face(gray=True)獲取圖片,使用ndimage移動座標、旋轉圖片、切割圖片、縮放圖片spa

 
import scipy.ndimage as ndimage
 

導包,讀取圖片顯示圖片3d

In [90]:
 
 
 
 
 
gray_image = misc.face(gray=True)
plt.imshow(gray_image,cmap='gray')
 
. . .
 

shift移動座標

In [94]:
 
 
 
 
 
# shift-->float類型,表示像素,不是比例
plt.imshow(ndimage.shift(gray_image,shift=200),cmap='gray')
 
. . .
In [96]:
 
 
 
 
 
plt.imshow(ndimage.shift(gray_image,shift=(100,200)),cmap='gray')
 
. . .
 

shift函數中mode參數的可選值:'constant', 'nearest', 'reflect', 'mirror' or 'wrap'

In [115]:
 
 
 
 
 
plt.imshow(ndimage.shift(gray_image,shift=(100,100),mode='constant'),cmap='gray')
 
 
Out[115]:
<matplotlib.image.AxesImage at 0x205bdef0>
 
 

rotate旋轉圖片

In [102]:
 
 
 
 
 
plt.imshow(ndimage.rotate(gray_image,angle=70),cmap='gray')
 
 
Out[102]:
<matplotlib.image.AxesImage at 0x1e669eb0>
 
 

zoom縮放圖片

In [105]:
 
 
 
 
 
# zoom使用float,是一個比例值
plt.imshow(ndimage.zoom(gray_image,zoom=0.5))
 
. . .
In [108]:
 
 
 
 
 
# zoom使用元組,也只接受小數,表示height、width的縮放比例
plt.imshow(ndimage.zoom(gray_image,zoom=(0.3,0.5)))
 
 
Out[108]:
<matplotlib.image.AxesImage at 0x1fe8dd50>
 
 

使用切片切割圖片

 

圖片進行過濾
添加噪聲,對噪聲圖片使用ndimage中的高斯濾波、中值濾波、signal中維納濾波進行處理
使圖片變清楚

In [118]:
 
 
 
 
 
moon = plt.imread('moonlanding.png')
plt.imshow(moon,cmap='gray')
 
 
Out[118]:
<matplotlib.image.AxesImage at 0x20911450>
 
 

加載圖片,使用灰色圖片misc.face()添加噪聲

In [141]:
 
 
 
 
 
face = misc.face(gray=True)
plt.imshow(face)
 
. . .
In [144]:
 
 
 
 
 
face1 = face[0:512,-512:]
plt.imshow(face1)
 
. . .
In [147]:
 
 
 
 
 
noise = face1.std() * np.random.random(face1.shape)
 
 
In [149]:
 
 
 
 
 
plt.imshow((face1 + noise),cmap='gray')
 
 
Out[149]:
<matplotlib.image.AxesImage at 0x213db7b0>
 
In [150]:
 
 
 
 
 
noise_face = face1 + noise
 
 
In [155]:
 
 
 
 
 
plt.imshow(ndimage.gaussian_filter(noise_face,sigma=1.5),cmap='gray')
 
. . .
In [156]:
 
 
 
 
 
plt.imshow(ndimage.median_filter(noise_face,size=3),cmap='gray')
 
. . .
 

gaussian高斯濾波參數sigma:高斯核的標準誤差

 

高斯分佈就是正太分佈

In [123]:
 
 
 
 
 
moon1 = ndimage.gaussian_filter(moon,sigma=3)
plt.imshow(moon1,cmap='gray')
 
 
Out[123]:
<matplotlib.image.AxesImage at 0x20d221f0>
 
 

median中值濾波參數size:給出在每一個元素上從輸入數組中取出的形狀位置,定義過濾器功能的輸入

In [126]:
 
 
 
 
 
moon2 = ndimage.median_filter(moon,size=15)
plt.imshow(moon2,cmap='gray')
 
. . .
 

signal維納濾波參數mysize:濾鏡尺寸的標量

In [127]:
 
 
 
 
 
import scipy.signal as signal
 
 
In [128]:
 
 
 
 
 
# 相似傅里葉變換的一種算法
moon3 = signal.wiener(moon,mysize=5)
plt.imshow(moon3)
 
 
Out[128]:
<matplotlib.image.AxesImage at 0x2236e230>
 
相關文章
相關標籤/搜索