Scipy
Scipy 以 Numpy 的高效能陣列及其基本計算工具為基礎,提供了大量用來操作 Numpy 陣列的函式。
影像處理-Image operations
SciPy 提供了些處理影像的基本功能
#對影像進行著色及調整大小
from scipy.misc import imread, imsave, imresize
# 將影像從磁碟讀取到Numpy陣列中
img = imread('./assets/Galactic.jpg')
print(img.dtype, img.shape) # Prints "uint8 (966, 1280, 3)"
# 可透過將每個顏色通道縮放不同的標量常數來對影像進行著色。
# 對於該影像的shape是(966, 1280, 3),
# 我們用shape是(3,)的陣列 [1, 0.95, 0.9] 來乘與該陣列
# 由於Numpy的廣播機制,
# 紅色通道的等級將保持不變
# 綠色通道的標量常數將乘以0.55
# 藍色通道的標量常數將乘以0.5
img_tinted = img * [1, 0.55, 0.5]
# 將著色影像的畫素調整為300×300大小
img_tinted = imresize(img_tinted, (300, 300))
# 將做色後的影像寫回到磁碟裡
imsave('./assets/Galactic_tinted.jpg', img_tinted)
效果圖對比:
原始影像
著色和調整大小後的影像:
兩點間距離-Distance between points
SciPy 提供了些用於計算點點之間的距離的函式
#計算給定集合中所有點之間的距離
import numpy as np
from scipy.spatial.distance import pdist, squareform
# 建立以下陣列,其中每一行都是二維空間中的一個點:
# [[0 1]
# [1 0]
# [2 0]]
x = np.array([[0, 1], [1, 0], [2, 0]])
print(x)
# 計算陣列 x 所有行(點)之間的歐式距離.
# d[i, j] 表示的是 x[i, :] 與 x[j, :] 之間的歐式距離
# 陣列d是即為下列陣列:
# [[ 0. 1.41421356 2.23606798]
# [ 1.41421356 0. 1. ]
# [ 2.23606798 1. 0. ]]
d = squareform(pdist(x, 'euclidean'))
print(d)
Matplotlib
Matplotlib 是一個 python 的 2D 繪相簿。
簡要介紹 matplotlib.pyplot 模組
最重要的函式就是 plot ,可以畫 2D 資料。
#僅僅在一個圖中繪畫一個函式影像
import numpy as np
import matplotlib.pyplot as plt
# 計算正弦曲線上的(x,y)座標。
x = np.arange(0, 3 * np.pi, 0.1)
y = np.sin(x)
# 使用matplotlib來進行繪畫
plt.plot(x, y)
plt.show() # 必須使用show()函式來使影像出現
繪畫的影像:
#在一個圖中繪畫多個函式,
#並給函式新增軸標籤、標題及圖例
import numpy as np
import matplotlib.pyplot as plt
# 計算正弦曲線和餘弦曲線上的(x,y)座標
x = np.arange(0, 3 * np.pi, 0.1)
y_sin = np.sin(x)
y_cos = np.cos(x)
# 使用matplotlib來進行繪畫
plt.plot(x, y_sin)
plt.plot(x, y_cos)
plt.xlabel('x axis label')
plt.ylabel('y axis label')
plt.title('Sine and Cosine')
plt.legend(['Sine', 'Cosine'])
plt.show()
繪畫的影像:
繪製子圖-Subplots
使用 subplot() 來繪製子圖,即對同一個圖進行分割,以繪畫不同的函式。
#在一個圖裡畫兩個不同的函式
import numpy as np
import matplotlib.pyplot as plt
# 計算正弦曲線和餘弦曲線上的(x,y)座標
x = np.arange(0, 3 * np.pi, 0.1)
y_sin = np.sin(x)
y_cos = np.cos(x)
# 建立一個高度為2,寬度為1的子圖網格
# 並將第一個子圖設為活躍狀態
# subplot(a,b,c), 引數a表示分割後圖的高度
# b表示分割後圖的寬度,c表示將哪一個設為活躍
plt.subplot(2, 1, 1)
# 畫出第一個影像
plt.plot(x, y_sin)
plt.title('Sine')
# 將第而個子圖設為活躍狀態並畫第二個曲線
plt.subplot(2, 1, 2)
plt.plot(x, y_cos)
plt.title('Cosine')
# 顯示影像
plt.show()
python 分割後的子圖:
影像-Images
透過 imshow() 函式來顯示影像在圖中。
#在圖中顯示照片
import numpy as np
from scipy.misc import imread, imresize
import matplotlib.pyplot as plt
img = imread('assets/Galactic.jpg')
img_tinted = img * [.3, .75, 1.1]
# 顯示原始照片
plt.subplot(1, 2, 1)
plt.imshow(img)
# 顯示著色照片
plt.subplot(1, 2, 2)
# 對於imshow()函式存在一個問題,
# 若使用的資料型別不是uint8,可能會出現奇怪的問題,所以必須進行顯示的強制轉換。
plt.imshow(np.uint8(img_tinted))
plt.show()
python 分割後的著色前後對比圖:
本作品採用《CC 協議》,轉載必須註明作者和本文連結