numpy之特征值、奇异值分解及其在图片处理中的应用

一、特征值与特征向量基本概念及小示例

  

'''
    特征值与特征向量---针对矩阵而言的,主要记载矩阵信息
        对于n阶方阵A,如果存在数a和非零n维列向量x,使得Ax = ax,则称a是矩阵A的一个特征值,x是矩阵A数据特征值a的特征向量
        ---已知方阵A,求特征值和特征向量的numpy实现:eigvals,eigvecs = np.linalg.eig(A)
        ---已知特征值和特征向量,求方正A的numpy实现:A = eigvecs * np.diag(eigvals) * eigvecs.I
                ----是由Ax = ax推导出来的
'''
import numpy as np

A = np.mat('4 8 9;3 5 8;1 9 3')
print(A)

# 提取特征信息
eigvals, eigvecs = np.linalg.eig(A)
print(eigvals, type(eigvals))
print(eigvecs, type(eigvecs))
# 对eigvals进行对角化处理,数据类型为数组
print(np.diag(eigvals))
# 逆向推导方阵
A2 = eigvecs * np.diag(eigvals) * eigvecs.I
print(A2)

# 如果只保留一部分特征值,则:
# 应用:图片处理保留主要特征
eigvals[2:] = -4
A3 = eigvecs * np.diag(eigvals) * eigvecs.I
print(A3)



输出结果:
[[4 8 9]
 [3 5 8]
 [1 9 3]]
[15.5686571   0.58730164 -4.15595874] <class 'numpy.ndarray'>
[[-0.71687407 -0.93836182 -0.2784087 ]
 [-0.53860537  0.01165284 -0.57860785]
 [-0.44271415  0.34545812  0.76661696]] <class 'numpy.matrix'>
[[15.5686571   0.          0.        ]
 [ 0.          0.58730164  0.        ]
 [ 0.          0.         -4.15595874]]
[[4. 8. 9.]
 [3. 5. 8.]
 [1. 9. 3.]]
[[3.98919756 8.03959409 8.96932196]
 [2.97754964 5.08228713 7.93624281]
 [1.02974524 8.89097501 3.08447404]]

二、提取图片特征值:----仅限于图片像素矩阵为方阵

  

'''
    提取图像特征值,保留部分特征,生成新图片
'''
import numpy as np
import scipy.misc as sm  # 提供读取图片的方法
import matplotlib.pyplot as mp
import imageio

image1 = sm.imread('./da_data/lily.jpg', True)  # 第二个参数为布尔值,表示是否对图片进行亮度处理,若true则起到降维作用
print(image1, image1.shape, type(image1))

# 提取image特征
eigvals, eigvecs = np.linalg.eig(image1)
print(eigvals, type(eigvals), eigvals.size)
print(eigvecs, type(eigvecs), eigvals.size)
# 逆向生成图片
# 只保留50个特征值
eigvals[50:] = 0
image2 = np.mat(eigvecs) * np.diag(eigvals) * np.matrix(eigvecs).I

mp.figure('EIG Image', facecolor='lightgray')
mp.subplot(121, title='IMAGE1')
mp.imshow(image1, cmap='rainbow')
mp.xticks([])
mp.yticks([])
mp.subplot(122, title='IMAGE2')
mp.imshow(image2.real, cmap='rainbow')
mp.xticks([])
mp.yticks([])
mp.show()

  

三、奇异值分解基本概念及小示例

  

'''
    奇异值分解----不仅可以处理方阵,还可以处理非方阵
    概念:有一个矩阵M,可以分解为3个矩阵U、S、V,是的U*S*V=M,U与V都是正交矩阵(乘以自身的转置矩阵的结果为单位矩阵),那么S矩阵
        主对角线上的值称为M的奇异值,其他元素都是0

    numpy中实现奇异值求解:
            U,sv,V = np.linalg.svd(M)   ---sv为分解所得的奇异值数组,U,V为正交矩阵
    numpy中通过U,sv,V求解M:M = U * np.diag(sv) * V
'''
import numpy as np

A = np.mat('4 8 9;3 5 8')
print(A)

# 提取奇异值
U, sv, V = np.linalg.svd(A, full_matrices=False)  # full_matrices可以保证逆向生成原方阵,针对的是V
print(sv)
print(U * np.diag(sv) * V)

输出结果:
[[4 8 9]
 [3 5 8]]
[16.04488896  1.24961523]
[[4. 8. 9.]
 [3. 5. 8.]]

四、奇异值在图片处理中的应用---提取图片中的奇异值

  -----奇异值在图片处理中优于特征值在图片处理中的应用,主要有两点:

    1.特征值只能处理方阵,即像素阵必须为方阵,而奇异值可以使非方阵

    2.对奇异值数组和特征值数组抹去同样个数的值,再去生成新的图片时,奇异值所生成的图片效果要好于特征值

  

'''
    奇异值分解----不仅可以处理方阵,还可以处理非方阵
    概念:有一个矩阵M,可以分解为3个矩阵U、S、V,是的U*S*V=M,U与V都是正交矩阵(乘以自身的转置矩阵的结果为单位矩阵),那么S矩阵
        主对角线上的值称为M的奇异值,其他元素都是0

    numpy中实现奇异值求解:
            U,sv,V = np.linalg.svd(M)   ---sv为分解所得的奇异值数组,U,V为正交矩阵
    numpy中通过U,sv,V求解M:M = U * np.diag(sv) * V
'''
import numpy as np
import scipy.misc as sm  # 提供读取图片的方法
import matplotlib.pyplot as mp
import imageio

image1 = sm.imread('./da_data/lily.jpg', True)  # 第二个参数为布尔值,表示是否对图片进行亮度处理,若true则起到降维作用
print(image1, image1.shape, type(image1))
image = sm.imread('./da_data/1.jpg', True)

# 提取image特征值
eigvals, eigvecs = np.linalg.eig(image1)
print(eigvals, type(eigvals), eigvals.size)
print(eigvecs, type(eigvecs), eigvals.size)
# 逆向生成图片
# 只保留50个特征值
eigvals[50:] = 0
image2 = np.mat(eigvecs) * np.diag(eigvals) * np.matrix(eigvecs).I

# 奇异值分解--方阵情况
U, sv, V = np.linalg.svd(image1)
# 抹掉部分奇异值,生成新图片---只保留50个奇异值
sv[50:] = 0
image3 = np.mat(U) * np.mat(np.diag(sv)) * np.mat(V)

# 奇异值分解--非方阵情况,在处理非方阵是full_matrices主要针对V(因为V为方正,其维度无法与U*sv的结果相乘)
U, sv, V = np.linalg.svd(image, full_matrices=False)
# 抹去部分奇异值
sv[50:] = 0
image4 = np.mat(U) * np.mat(np.diag(sv)) * np.mat(V)

mp.figure('EIG Image', facecolor='lightgray')
mp.subplot(321, title='IMAGE1')
mp.imshow(image1, cmap='gray')
mp.xticks([])
mp.yticks([])
mp.subplot(322, title='IMAGE2')
mp.imshow(image2.real, cmap='gray')
mp.xticks([])
mp.yticks([])
mp.subplot(323, title='IMAGE3')
mp.imshow(image3.real, cmap='gray')
mp.xticks([])
mp.yticks([])
mp.subplot(324, title='IMAGE')
mp.imshow(image.real, cmap='gray')
mp.xticks([])
mp.yticks([])
mp.subplot(325, title='IMAGE4')
mp.imshow(image4.real, cmap='gray')
mp.xticks([])
mp.yticks([])
mp.show()

  

原文地址:https://www.cnblogs.com/yuxiangyang/p/11170169.html