Scipy线性代数计算
Scipy有ATLAS LAPACK和BLAS库构建的线性代数计算包,
可以高效的进行线性代数的计算。
线性代数包里的函数,操作对象都是二维数组。
SciPy.linalg 与 NumPy.linalg
与NumPy.linalg相比,scipy.linalg除了包含numpy.linalg中的所有函数,还具有numpy.linalg中没有的高级功能。
一方面scipy.linalg 包含 numpy.linalg 中的所有函数,同时还包含了很多 numpy.linalg 中没有的函数。
另一方面,scipy.linalg 能够保证这些函数使用 BLAS/LAPACK 加速,而 numpy.linalg 中这些加速是可选的。
因此,在使用时,我们一般使用 scipy.linalg 而不是 numpy.linalg。
print "number of items in numpy.linalg:", len(dir(numpy.linalg))
print "number of items in scipy.linalg:", len(dir(scipy.linalg))#scipy有更多模块和功能
number of items in numpy.linalg: 36
number of items in scipy.linalg: 115
linalg.inv求逆
A = np.array([[1,2],[3,4]])
print linalg.inv(A)
print A.dot(scipy.linalg.inv(A))
[[-2. 1. ]
[ 1.5 -0.5]]
[[ 1.00000000e+00 0.00000000e+00]
[ 8.88178420e-16 1.00000000e+00]]
scipy.linalg.solve 函数求解方程组
from scipy import linalg
import numpy as np
# 声明numpy数组
a = np.array([[1, 3, 5], [2, 5, 1], [2, 3, 8]])
b = np.array([10, 8, 3])
# 求解
x = linalg.solve(a, b)
# 输出解值
print (x)
#即x*
[-9.28 5.16 0.76]
np.dot(a,x)#a和x的向量积等于b
array([10., 8., 3.])
det()函数计算行列式
,接受一个矩阵作为输入,返回一个标量值,即该矩阵的行列式值。
# 导入scipy和numpy包
from scipy import linalg
import numpy as np
# 声明numpy数组
A = np.array([[3,4],[7,8]])
# 计算行列式
x = linalg.det(A)
# 输出结果
print (x)
-4.0
求特征值、特征向量与numpy一样
# 导入scipy和numpy包
from scipy import linalg
import numpy as np
# 声明numpy数组
A = np.array([[3,4],[7,8]])
# 求解
l, v = linalg.eig(A)
# 打印特征值
print('特征值')
print (l)
# 打印特征向量
print('特征向量')
print (v)
特征值
[-0.35234996+0.j 11.35234996+0.j]
特征向量
[[-0.76642628 -0.43192981]
[ 0.64233228 -0.90190722]]
SVD奇异值分解
SVD奇异值分解
奇异值分解(SVD)是现在比较常见的算法之一,也是数据挖掘工程师、算法工程师必备的技能之一。
假设A是一个M×N的矩阵,那么通过矩阵分解将会得到U,Σ,V^T(V的转置)三个矩阵,
其中U是一个M×M的方阵,被称为左奇异向量,方阵里面的向量是正交的;Σ是一个M×NM×N的对角矩阵,
除了对角线的元素其他都是0,对角线上的值称为奇异值;V^T(V的转置)是一个N×N的矩阵,被称为右奇异向量,
方阵里面的向量也都是正交的。
Am×n =U m×mΣm×nV^Tn×n
from scipy import linalg
import numpy as np
# 声明numpy数组
a = np.random.randn(3, 2) + 1.j*np.random.randn(3, 2)
# 输出原矩阵
print('原矩阵')
print(a)
# 求解
U, s, Vh = linalg.svd(a)
# 输出结果
print('奇异值分解')
print(U, "#U")
print(Vh, "#Vh")
print(s, "#s")
原矩阵
[[ 0.42275774+0.73802214j 0.41651187+0.66146259j]
[ 0.02012535-1.32728786j -0.20853533-0.19105063j]
[-1.56596245-1.03140167j -1.63630986-0.68901821j]]
奇异值分解
[[-0.16245683-0.33832927j 0.07140101-0.17802993j 0.89144441+0.16635861j]
[ 0.02755556+0.38901502j 0.19858676-0.89361557j -0.05695594+0.08172226j]
[ 0.69592807+0.47194619j 0.25633568+0.24395443j 0.36776386-0.18021907j]] #U
[[-0.7887214 +0.j -0.60051218+0.13154343j]
[ 0.61475081+0.j -0.77045333+0.16876939j]] #Vh
[3.05648871 0.70898642] #s
scipy.ndimage包提供了许多通用的图像处理和分析功能,这些功能支持操作任意维度的数组。
scipy.ndimage中提供了图像矩阵变换、图像滤波、图像卷积等功能。
加载、处理图片
from scipy import ndimage
import matplotlib.image as mp
import matplotlib.pyplot as plt
# 加载图片
cat = mp.imread('./cat.png')
# 显示图片
plt.imshow(cat)
# 保存要显示的图片
plt.show()
旋转图片ndimage包中的rotate()函数
cat = ndimage.rotate(cat, 90)#参数选择图片名和旋转角度
plt.imshow(cat)
# plt.savefig('./img3-1.png') # 保存要显示的图片
plt.show()
缩放图片ndimage包中的zoom()函数
# 加载图片
cat = mp.imread('./cat.png')
cat = ndimage.zoom(cat,[2, 2, 1])#图片三个维度选择放大倍数
# 显示图片
plt.imshow(cat)
# 保存要显示的图片
plt.show()
Clipping input data to the valid range for imshow with RGB data ([0..1] for floats or [0..255] for integers).
图像滤波
图像滤波是一种修改/增强图像的技术。
例如,可以图像滤波突出图像的某些特性,弱化或删除图像的另一些特性。
滤波有很多种,例如:平滑、锐化、边缘增强等等。可以理解为滤镜。
高斯滤波。高斯滤波是一种模糊滤波,广泛用于滤除图像噪声。
一、图像噪声的成因
图像在生成和传输过程中常常因受到各种噪声的干扰和影响而是图像降质,这对后续图像的处理和图像视觉效应将产生不利影响。噪声种类很多,比如:电噪声,机械噪声,信道噪声和其他噪声。因此,为了抑制噪声,改善图像质量,便于更高层次的处理,必须对图像进行去噪预处理。
噪声是干扰和妨碍人类认知和理解信息的重要因素,而图像噪声则是图像中干扰和妨碍人类认识和理解图像信息的重要因素。由于噪声本身具有不可预测性,可以将它当做一种随机误差(这种误差只有通过概率统计的方法来识别)。因此,图像噪声可以视为一种多维随机过程,可以选择随机过程的概率分布函数和概率密度函数来作为对图像噪声进行描述的方法。
图像平滑的目的有两个,消除噪声和图像平滑。
高斯噪声
高斯噪声是指它的概率密度函数服从高斯分布(即正态分布)的一类噪声。如果一个噪声,它的幅度分布服从高斯分布,而它的功率谱密度又是均匀分布的,则称它为高斯白噪声。高斯白噪声的二阶矩不相关,一阶矩为常数,是指先后信号在时间上的相关性。
产生原因:
1)图像传感器在拍摄时市场不够明亮、亮度不够均匀;
2)电路各元器件自身噪声和相互影响;
3)图像传感器长期工作,温度过高。
对图像进行高斯滤波,gaussian_filter()函数
高斯滤波是一种模糊滤波,广泛用于滤除图像噪声。
cat = mpimg.imread('./cat.png')
plt.imshow(cat)
plt.show()
、
# 处理图片
cat = ndimage.gaussian_filter(cat, sigma=3)#sigma=3表示模糊程度为3,我们可以通过调整sigma值,来比较图像质量的变化。
# 显示图片
plt.imshow(cat)
plt.show()
边缘检测
边缘检测是一种寻找图像中物体边界的图像处理技术。
它的原理是通过检测图像中的亮度突变,来识别物体边缘。
边缘检测在图像处理、计算机视觉、机器视觉等领域中广泛应用。
常用边缘检测算法包括:
Sobel
Canny
Prewitt
Roberts
Fuzzy Logic methods
生成一幅示例图片
import scipy.ndimage as nd
import numpy as np
im = np.zeros((256, 256))
im[64:-64, 64:-64] = 1
im[90:-90,90:-90] = 2
im = nd.gaussian_filter(im, 8)
import matplotlib.pyplot as plt
plt.imshow(im)
# plt.savefig('./img5-1.png') # 保存要显示的图片
plt.show()
图像看起来像一个正方形的色块,我们将检测这些彩色块的边缘。
这里使用ndimage的Sobel函数来检测图像边缘,该函数会对图像数组的每个轴分开操作,
产生两个矩阵,然后我们使用NumPy中的Hypot函数将这两个矩阵合并为一个矩阵,得到最后结果。
import scipy.ndimage as nd
import numpy as np
import matplotlib.pyplot as plt
im = np.zeros((256, 256))
im[64:-64, 64:-64] = 1
im[90:-90,90:-90] = 2
im = nd.gaussian_filter(im, 8)
sx = nd.sobel(im, axis = 0, mode = 'constant')
sy = nd.sobel(im, axis = 1, mode = 'constant')
sob = np.hypot(sx, sy)
plt.imshow(sob)
# plt.savefig('./img6-1.png') # 保存要显示的图片
plt.show()