07-1SciPy繪圖工具的使用 scipy 積分求解與繪圖工具matplotlib.pyplot及scipy.misc 使用、檔案輸入輸出

luqin_發表於2019-03-24

scipy 積分求解與繪圖工具matplotlib.pyplot及scipy.misc 使用

import numpy as np
import pandas as pd
from pandas import Series,DataFrame

# scipy求解積分
from scipy.integrate import quad

# 繪圖專用的工具
import matplotlib.pyplot as plt

# 表示把matplotlib生成的影像繪製到當前notebook當中
%matplotlib inline

求積分

確認不規則圖形的函式曲線

f = lambda x:(1-x**2)**0.5

確認不規則圖形x軸的界限(-1,1)

b = 1
a = -1

定義想x,y的函式

x = np.linspace(-1,1,100)
y = f(x)

繪製線性圖

plt.plot(x,y)
plt.plot(x,-y)

調整座標軸刻度的比例一致

plt.axis('equal')

確認結果是否正確,結果為pi,即為正確

half_area,error = quad(f,a,b)
2*half_area/1
結果為:
3.1415926535897967

在這裡插入圖片描述

繪製正弦曲線

x1 = np.linspace(0,2*np.pi,100)
y1 = np.sin(x1)
plt.plot(x1,y1)

在這裡插入圖片描述

檔案輸入輸出

處理文字輸入

import scipy.io as io

處理圖片輸入輸出

import scipy.misc as misc

把資料儲存為2進位制格式的資料

io.savemat()

讀取二進位制的資料檔案

io.loadmat()

資料寫入,支援陣列物件

xiaoming = np.random.randint(0,100,size=3)
index = np.array(['語文','數學','英語'])

mdic = {
    'xiaomingkey':xiaoming,
    'indexkey':index
}
# 不需要制定檔案字尾,只儲存為mat格式
io.savemat('xiaomingpath',mdict=mdic)   

讀取二進位制檔案

xiaoming = io.loadmat(‘xiaomingpath.mat’)

display(xiaoming['xiaomingkey'],xiaoming['indexkey'])
結果為:
array([[76, 98, 90]])
array(['語文', '數學', '英語'], dtype='<U2')

【注意】 misc所有的功能都已經被其他類庫替代

圖片讀取:misc.imread()

圖片儲存:misc.imsave()

新增濾鏡效果:misc.imfilter()

調整圖片大小:misc.imresize()

調整圖片旋轉角度:misc.imrotate()

圖片展示:misc.imshow()

plt.imshow(misc.imread('./123.jpg'))

使用imageio.imread替代misc.imread()

from imageio import imread
plt.imshow(imread('./123.jpg'))

在這裡插入圖片描述

meixi = plt.imread('./123.jpg')
meixi.shape
結果為:
(1086, 2010, 3)

將圖片黑白化

plt.imshow(meixi.max(axis=2),cmap='gray')

在這裡插入圖片描述

將黑白圖片儲存

from imageio import imwrite
gray_meixi = meixi.max(axis=2)
imwrite('gray_meixi2.jpg',gray_meixi)

濾鏡效果

# imfiter引數選項:'blur', 'contour', 'detail', 'edge_enhance', 'edge_enhance_more', 'emboss', 'find_edges', 'smooth', 'smooth_more', 'sharpen'
plt.imshow(misc.imfilter(meixi,'contour'))

在這裡插入圖片描述

使用0-100之間的數,設定原始影像的百分比

plt.imshow(misc.imresize(meixi,50))

使用0-1之間的小數,設定原始影像的比例

plt.imshow(misc.imresize(meixi,0.5))

分別制定(heigth,width)的尺寸來修該原始圖片大小

plt.imshow(misc.imresize(meixi,(200,300)))

使用skimage處理圖片的大小

from skimage.transform import resize
plt.imshow(resize(meixi,output_shape=(300,400),mode='reflect'))

使用misc.imrotate不會改變原始圖片的形狀

plt.imshow(misc.imrotate(meixi,90,interp='bilinear'))

使用skimage.transform.rotate處理圖片

from skimage.transform import rotate
# mode 是設定空白處的填充方式 'constant', 'edge', 'symmetric', 'reflect', 'wrap'
plt.imshow(rotate(meixi,angle=90,mode='reflect'))

SciPy 中ndimage的使用

import numpy as np
import pandas as pd
from pandas import Series,DataFrame
from scipy import ndimage
# 訊號處理--- 維納濾波器
from scipy.signal import wiener
from scipy import misc

import matplotlib.pyplot as plt
%matplotlib inline

旋轉圖片:ndimage.rotate()

圖片縮放:ndimage.zoom()

圖片移動:ndimage.shift()

高斯濾波器:ndimage.gaussian_filter()
中止濾波器:ndimage.median_filter()
維納濾波器:wiener()

可選的cmap字串

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, Vega10, Vega10_r, Vega20, Vega20_r, Vega20b, Vega20b_r, Vega20c, Vega20c_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, 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, spectral, spectral_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

載入一張misc提供的現有圖片

cmap 制定圖片的色調

0-255 黑—白 灰度值越大,越趨向於白,越小,越趨向於色調的主色

plt.imshow(misc.face(gray=True),cmap='summer')

在這裡插入圖片描述

jpg uint8 0-255;png float32 0.-1.; 255 白;0 黑

color_test = np.full(shape=(100,100,3),fill_value=255,dtype=np.uint8)
plt.imshow(color_test)

在這裡插入圖片描述

face = misc.face(gray=True)
face.shape
結果為:
(768, 1024)
plt.imshow(misc.imrotate(face,90))

ndimage的旋轉會修改圖片的形狀,旋轉產生的黑邊就是填充的0值

plt.imshow(ndimage.rotate(face,60))

在這裡插入圖片描述

zoom 設定為 float 圖片放大的倍數,支援0.3–1;zoom 設定為列表,圖片在不同軸以不同比例拉伸、壓縮

plt.imshow(ndimage.zoom(face,zoom=[2,3]))

shift 設定的是畫素大小,mode 設定黑白的填充模式:‘constant’, ‘nearest’, ‘reflect’, ‘mirror’ or ‘wrap’

plt.imshow(ndimage.shift(face,shift=100,mode='nearest'),cmap='gray')

濾波處理

moon_landing = plt.imread('moonlanding.png')
plt.imshow(moon_landing,cmap='gray')
moon_landing.shape

在這裡插入圖片描述

plt.imshow(ndimage.gaussian_filter(moon_landing,sigma=1),cmap='gray')

在這裡插入圖片描述

空值、異常值的填充一般使用如下三個指標

  1. 平均值
  2. 中位數
  3. 眾數

如果哪一種都不合適,那就drop

plt.imshow(ndimage.median_filter(moon_landing,size=9),cmap='gray')
plt.imshow(wiener(moon_landing,mysize=7),cmap='gray')

相關文章