版权声明:本文为博主原创文章,未经博主允许不得转载。 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