圖像奇異值分解SVD遇到的奇怪問題

一開始做圖像奇異值分解實驗,用的

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")
        
  

 

lena.jpg

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章