python——矩陣的奇異值分解,對圖像進行SVD


矩陣SVD

  奇異值分解(Singular Value Decomposition)是一種重要的矩陣分解方法,可以看做是對方陣在任意矩陣上的推廣。Singular的意思是突出的,奇特的,非凡的,按照這樣的翻譯似乎也可以叫做矩陣的優值分解。

  假設矩陣A是一個m*n階的實矩陣,則存在一個分解使得:

其中,是一個對角陣,只有對角線上面有元素,對角先上面的元素稱為矩陣A的奇異值,通常將其進行從大到小排列,在numpy中的api返回的是一個奇異值的向量,我們可以將其轉換為對角陣。U和V都是單位正交陣,U和V的第i列是關於對應第i個特征值的奇異左右奇異向量。

  下面給出一個實際的例子,對矩陣A進行奇異值分解:

  矩陣奇異值分解的運用非常的廣泛,PCA,推薦系統,數據壓縮,矩陣分解,這里就不介紹它的推導過程和原理了,想了解的同學可以查閱相關的資料,下面我們使用SVD來對圖像進行分解,使用不同數量的奇異值來對圖像進行壓縮。我們的圖像是500*980大小,總得奇異值有500個,當我們使用30個奇異值的時候,發現圖像已經有點清晰了,確實很強大。

import numpy as np
import matplotlib.image as mping
import matplotlib.pyplot as plt
import matplotlib as mpl


def image_svd(n, pic):
    a, b, c = np.linalg.svd(pic)
    svd = np.zeros((a.shape[0],c.shape[1]))
    for i in range(0, n):
        svd[i, i] = b[i]
    img = np.matmul(a, svd)
    img = np.matmul(img, c)
    img[ img >= 255] = 255
    img[  0 >= img ] = 0
    img = img.astype(np.uint8)
    return img


if __name__ == '__main__':
    mpl.rcParams['font.sans-serif'] = ['SimHei']
    mpl.rcParams['axes.unicode_minus'] = False

    path = './simplepython/ImgSVD/a.jpg'
    img = mping.imread(path)
    print(img.shape)
    
    r = img[:, :, 0]
    g = img[:, :, 1]
    b = img[:, :, 2]
    plt.figure(figsize=(50, 100))
    for i in range(1, 31):
        r_img = image_svd(i, r)
        g_img = image_svd(i, g)
        b_img = image_svd(i, b)
        pic = np.stack([r_img, g_img, b_img], axis=2)
        print(i)
        plt.subplot(5, 6, i)
        plt.title("圖像的SVD分解,使用前 %d 個特征值" %(i))
        plt.axis('off')
        plt.imshow(pic)
    plt.suptitle("圖像的SVD分解")
    plt.subplots_adjust()
    plt.show()

原圖片:嘉文四世

 


免責聲明!

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



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