一开始做图像奇异值分解实验,用的
u, sigma, v = np.linalg.svd()
出来的全是乱码图像
怎么调整都不行,简直要抓狂了 ` 0 ` !!!
后来在别人电脑上跑了一下,竟然有效果!
找问题!!调整numpy的版本,
pip install numpy==1.16.5
果然解决了!!!
应该是numpy版本问题,或者文件损坏了,么得办法!
把numpy升级到最新版的命令如下,但可能会如系统中的tensorflow版本不兼容:
pip install -U numpy
pip install --upgrade numpy
from PIL import Image
import numpy as np
def rebuild_img(u, sigma, v, p): #p表示奇异值的百分比
print (p)
m = len(u)
n = len(v)
a = np.zeros((m, n))
count = (int)(sum(sigma))
curSum = 0
k = 0
while curSum <= count * p:
uk = u[:, k].reshape(m, 1)
vk = v[k].reshape(1, n)
a += sigma[k] * np.dot(uk, vk)
curSum += sigma[k]
k += 1
print ('k:',k)
a[a < 0] = 0
a[a > 255] = 255
#按照最近距离取整数,并设置参数类型为uint8
return np.rint(a).astype("uint8")
if __name__ == '__main__':
img = Image.open('lena.jpg', 'r')
a = np.array(img)
print("a.shape: ",a.shape)
for p in np.arange(0.1, 1, 0.1):
u, sigma, v = np.linalg.svd(a[:, :, 0])
print("R:sigma.shape :",sigma.shape)
R = rebuild_img(u, sigma, v, p)
u, sigma, v = np.linalg.svd(a[:, :, 1])
print("G:sigma.shape :",sigma.shape)
G = rebuild_img(u, sigma, v, p)
u, sigma, v = np.linalg.svd(a[:, :, 2])
print("B:sigma.shape :",sigma.shape)
B = rebuild_img(u, sigma, v, p)
I = np.stack((R, G, B), 2)
#保存图片在img文件夹下
print(I.shape)
Image.fromarray(I).save("lena_" + str(p * 100) + ".jpg")