1.SciPy是什么
SciPy是python的一个著名的开源科学库,SciPy一般都是操纵NumPy数组来进行科学计算,统计分析,可以说是基于NumPy之上。SciPy提供了许多科学计算的库函数,如线性代数,微分方程,信号处理,图像处理,系数矩阵计算等,
2.Scipy安装
官网:http://www.scipy.org/SciPy
安装:假定python安装目录在C:\Python27,则在C:\Python27\Scripts下打开cmd执行
执行命令:pip install scipy
3.应用例子
3.1 scipy的hello world
用io模块保存与读取mat文件
from scipy import io
import numpy as np
l1 = np.arange(1,10) # 创建等差数组 [1 2 3 4 5 6 7 8 9]
matrix1 = l1.reshape(3,3) # 创建矩阵
'''
[[1 2 3]
[4 5 6]
[7 8 9]]
'''
io.savemat('matrix1.mat',{'array':matrix1}) # 保存矩阵文件,第一个参数为要保存的文件名,第二个是要保存的数组
data = io.loadmat('matrix1.mat') # 读取矩阵文件
print(data['array']) # 输出矩阵文件
'''
[[1 2 3]
[4 5 6]
[7 8 9]]
'''
3.2 计算欧式距离,(应用于机器学习KNN算法实现一种)
import numpy as np
from scipy.spatial.distance import pdist,squareform,cdist
x1 = np.array([[1,1]])
x2 = np.array([[4,5]])
# 通过cdist函数,计算两个点之间的距离
distance = cdist(x1,x2, 'euclidean')
#scipy.spatial.distance.cdist(XA, XB, metric='euclidean', p=None, V=None, VI=None, w=None),该函数用于计算两个输入集合的距离,
# 通过metric参数指定计算距离的不同方式得到不同的距离度量值
# metric = "euclidean"表示计算欧式距离 https://blog.csdn.net/kancy110/article/details/75675574
print(distance) #[[ 5.]]
#创建一个数组,数组的每一行都是一个2维的数组,相当于三个点
x = np.array([[1,1],[4,5],[7,9]])
# 计算每个行的一个点与本身以及另外两个点的欧式距离
x_d = squareform(pdist(x,"euclidean")) # pdist用于计算 X 中各对行向量的相互距离,squareform对求得的值开平方
# 欧式距离计算公式:sqrt((x1-x2)^2+(y1-y2)^2)
print(x_d)
'''
[[ 0. 5. 10.]
[ 5. 0. 5.]
[ 10. 5. 0.]]
'''
3.3 图像基本处理
(1) 读取图像基本信息
from scipy.misc import imread,imsave,imresize
if __name__ == "__main__":
# 读取图片
img = imread("kobe.png")
# 获取图片的数据类型
img_type = img.dtype
print(img_type) # uint8
# 读取图片的大小
img_shape = img.shape # (383, 684, 4)
print(img_shape)
# 获取图片的高
img_height = img_shape[0]
print(img_height) # 383
# 获取图片的宽
img_width = img_shape[1]
print(img_width) # 684
# 获取图片的通道数
img_channel = img_shape[2]
# 通道数为1表示黑白图片,3表示彩色图片
# 4通道通常为RGBA
print(img_channel) # 4
注意这里通道为4,常见的道道为1,3,1表示灰度图,3表示彩色图。
4表示rgba,r表示红色,g表示绿色,b表示蓝色,a是Alpha,表示不透明度,如果一个像素的alpha通道数值为0%,则表示是完全透明看不见的。因此4实际上就是通道3+不透明度alpha
(2)修改图片尺寸,颜色,裁剪
用到scipy一个图像处理的包:misc
代码如下:
from scipy.misc import imread,imsave,imresize
if __name__ == "__main__":
# 读取图片
img = imread("kobe.png")
# 通过改变图片每一个通道的比例来改变图片的色彩
# 将图片R G B的比例设置为1,0.8,0.7,0.9
img_tint = img * [1,0.9,0.9,0.9]
# 保存图片,f发现图片变深了一些
imsave("kobe_color.png", img_tint)
# 改变图片大小
img_resize = imresize(img, (500,500)) # 图片大小设置为500*500
# 保存图片
imsave("kobe_resize.png", img_resize) # 图片被缩减了,因为不是等比例的缩放,图片有点变形
# 裁剪图片
img_incision = img[100:400, 200:500]
imsave("kobe_incision.png", img_incision)
结果如下:
变色 kobe_color.png
改变大小 kobe_resize.png
裁剪 kobe_resize.png
参考资料
https://blog.csdn.net/sinat_29957455/article/details/78636621
https://blog.csdn.net/wsp_1138886114/article/details/80444621