Scipy 直观操作
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 协议》,转载必须注明作者和本文链接