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()

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM