#压缩图片
from PIL import Image
import numpy as np
def get_approx_SVD1(data, percent):
U, s, VT = np.linalg.svd(data)
Sigma = np.zeros(np.shape(data))
Sigma[:len(s), :len(s)] = np.diag(s)
count = int(sum(s) * percent)
k = -1
curSum = 0
while curSum <= count:
k += 1
curSum += s[k]
D = U[:, :k].dot(Sigma[:k, :k].dot(VT[:k, :]))
D[D < 0] = 0
D[D > 255] = 255
return np.rint(D).astype("uint8")
def get_approx_SVD2(data, percent):
U, s, VT = np.linalg.svd(data)
Sigma = np.zeros(np.shape(data))
Sigma[:len(s), :len(s)] = np.diag(s)
k = int(len(s) * percent)
D = U[:, :k].dot(Sigma[:k, :k].dot(VT[:k, :]))
D[D < 0] = 0
D[D > 255] = 255
return np.rint(D).astype("uint8")
def rebuild_img(filename, p, get_approx_SVD):
img = Image.open(filename, 'r')
a = np.array(img)
R0 = a[:, :, 0]
G0 = a[:, :, 1]
B0 = a[:, :, 2]
R = get_approx_SVD(R0, p)
G = get_approx_SVD(G0, p)
B = get_approx_SVD(B0, p)
I = np.stack((R, G, B), 2)
Image.fromarray(I).save(str(p * 100) + ".jpg")
img = Image.open(str(p * 100) + ".jpg", "r")
img.show()
filename = "lena.png"
for p in np.arange(0.2, 1.2, 0.2):
rebuild_img(filename, p, get_approx_SVD1)
for p in np.arange(0.2, 1.2, 0.2):
rebuild_img(filename, p, get_approx_SVD2)