1. 程式人生 > >圖片SVD-python code

圖片SVD-python code

#svd
from PIL import Image
import numpy as np
def rebuild_img(u, sigma, v, p): #p表示奇異值的百分比
    m = len(u)
    n = len(v)
    A=np.zeros((m,n))
    for i in range(int(len(sigma)*p)):
        #print(i)
        A[i,i]=sigma[i]
        #print(A)
    a=np.dot(np.dot(u,A),v)
    
    a[a < 0] = 0
    a[a > 255] = 255
    #按照最近距離取整數,並設定引數型別為uint8
    return np.rint(a).astype("uint8")

if __name__ == '__main__':
    img = Image.open('C:/Users/van/Pictures/Saved Pictures/1.jpg', 'r')
    a = np.array(img)
    u, sigma, v = np.linalg.svd(a[:, :, 0])
    print(np.array(sigma).shape)
    print(np.array(u).shape)
    print(np.array(v).shape)
    for p in np.arange(0.01, 0.1, 0.01):
        u, sigma, v = np.linalg.svd(a[:, :, 0])
        R = rebuild_img(u, sigma, v, p)

        u, sigma, v = np.linalg.svd(a[:, :, 1])
        G = rebuild_img(u, sigma, v, p)

        u, sigma, v = np.linalg.svd(a[:, :, 2])
        B = rebuild_img(u, sigma, v, p)

        I = np.stack((R, G, B), 2)
        #儲存圖片在img資料夾下
        Image.fromarray(I).save("C:/Users/van/Pictures/Saved Pictures/svd_" + str(p * 100) + ".jpg")

 

 

reference:https://blog.csdn.net/xuelabizp/article/details/52318708