第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機(jī)立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Python SVD 修復(fù)重建圖像的特征值數(shù)量?

Python SVD 修復(fù)重建圖像的特征值數(shù)量?

慕仙森 2023-03-01 16:10:58
我正在嘗試重建我之前使用 SVD 分解的圖像。圖片是這樣的:我用這段代碼成功分解了圖像:from PIL import Imageimport numpy as npimport matplotlib.pyplot as pltimg = Image.open('steve.jpg')img = np.mean(img, 2)U,s,V = np.linalg.svd(img)s圖像奇異值的數(shù)組。我取的奇異值越多,重建圖像與原始圖像就越相似。例如,如果我取 20 個奇異值:n = 20S = np.zeros(np.shape(img))for i in range(0, n):    S[i, i] = s[i]recon_img = U@S@Vplt.imshow(recon_img)plt.axis('off')plt.show()我想固定奇異值的最小數(shù)量以獲得良好的pretty結(jié)果:與原始圖像相似的圖像。此外,我想看看當(dāng)我采用更多的奇異值時結(jié)果會發(fā)生多少變化。我嘗試了一個動畫但沒有成功:from PIL import Imageimport numpy as npimport matplotlib.pyplot as pltfrom matplotlib.animation import FuncAnimationimg = Image.open('steve.jpg')img = np.mean(img, 2)U,s,V = np.linalg.svd(img)fig = plt.figure()def update(i):    S = np.zeros(np.shape(img))    n = 20    for i in range(0, n):        S[i, i] = s[i]    recon_img = U@S@V    plt.imshow(recon_img)    plt.axis('off')ani = FuncAnimation(fig = fig, func = update, frames = 20, interval = 10)plt.show()
查看完整描述

1 回答

?
慕碼人2483693

TA貢獻(xiàn)1860條經(jīng)驗(yàn) 獲得超9個贊

如果您繪制s奇異值,您可以看到一條非常陡峭的下降曲線,如果您對 y 軸使用對數(shù)刻度則更好:

plt.semilogy(s, 'k-')

http://img1.sycdn.imooc.com//63ff08d10001ce5405790440.jpg

如您所見,前 50 個奇異值是最重要的:幾乎每個奇異值都超過 1000。從 ~50 到 ~250 的值低一個數(shù)量級,并且它們的值緩慢下降:包含曲線的斜率(記住對數(shù) y 標(biāo)度)。那個蜜蜂說我會用前 50 個元素來重塑你的形象。


關(guān)于動畫:當(dāng)動畫逐幀更新時,計(jì)數(shù)器i增加 1。在您的代碼中,您錯誤地使用了i切片s和定義S;你應(yīng)該重命名柜臺。
此外,隨著動畫的進(jìn)行,您需要采用越來越多的奇異值,這是n逐幀保持不變的設(shè)置。您需要n在每個循環(huán)中更新,因此您可以將其用作計(jì)數(shù)器。
此外,您需要擦除之前繪制的圖像,因此您需要plt.gca().cla()在函數(shù)的開頭添加一個update。
檢查下面的代碼以供參考:

from PIL import Image

import numpy as np

import matplotlib.pyplot as plt

from matplotlib.animation import FuncAnimation


img = Image.open('steve.jpg')

img = np.mean(img, 2)


U,s,V = np.linalg.svd(img)


fig, ax = plt.subplots(1, 2, figsize = (4, 4))


ax[0].imshow(img)

ax[0].axis('off')

ax[0].set_title('Original')


def init():

    ax[1].cla()

    ax[1].imshow(np.zeros(np.shape(img)))

    ax[1].axis('off')

    ax[1].set_title('Reconstructed\nn = 00')



def update(n):

    ax[1].cla()

    S = np.zeros(np.shape(img))

    for i in range(0, n):

        S[i, i] = s[i]


    recon_img = U@S@V


    ax[1].imshow(recon_img)

    ax[1].axis('off')

    ax[1].set_title(f'Reconstructed\nn = {n:02}')


ani = FuncAnimation(fig = fig, func = update, frames = 50, init_func = init, interval = 10)

ani.save('ani.gif', writer = 'imagemagick')


plt.show()

這給了這個動畫:

https://i.stack.imgur.com/6loY5.gif

如您所見,前 50 個元素足以很好地重建圖像。其余元素增加了一些噪音并稍微改變了背景。



查看完整回答
反對 回復(fù) 2023-03-01
  • 1 回答
  • 0 關(guān)注
  • 102 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號