图片SVD-python code

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/wxf2012301351/article/details/84334676
#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

猜你喜欢

转载自blog.csdn.net/wxf2012301351/article/details/84334676