2016-04-25 92 views
0

Screenshot of the reading如何計算截斷和近似值?

我要拍攝一張圖像,使用imread()將其轉換爲一組3個矩陣,然後使用N=1,2,3,4,8,16,32,64,128項計算每個矩陣的截斷和近似值。我有矩陣,但我不確定最後一部分,讀數有點含糊。它們通過截斷和近似來表示什麼?基於給定答案


更新:

我試過如下:

A = double(imread("image.jpg"))/255; 

    [U1, S1, V1] = svd(A(:,:,1)); 
    [U2, S2, V2] = svd(A(:,:,2)); 
    [U3, S3, V3] = svd(A(:,:,3)); 

N = 128;  
trunc_image = (U1(1:763,1:N)*S1(1:N,1:N)*V1(1:N,1:691))*255; 

imwrite(trunc_image, "truncimg.jpg", "jpg"); 

...但由此產生的圖像看起來是這樣的:

screenshot of resulting image

+0

代替使用從['svd']所有的奇異值(的http://www.mathworks.com/help/ matlab/ref/svd.html),你只能使用最大(我認爲是絕對值),從*最大到(根據你的列表)128個最大值。 – TroyHaskin

+0

@TroyHaskin你是什麼意思?我使用這些值*作爲什麼?* – whatwhatwhat

+1

圖像具有所有這些信息:圖像A的矩陣形式可以通過SVD分解,並且總和'sigma_k * u_k * v_k.''正好是'A '。但是,只能通過總和最大的奇異值而不是所有的奇異值來近似「A」。如果'N'(近似項中的項數)小於'R'(奇異值的總數),則可以用很少的計算得到一個很好的近似值。 – TroyHaskin

回答

2

當您對圖片執行:

[U,S,V] = svd(I,'econ'); %//you get matrices U, S, V 

S將是一個diagonal矩陣,沿對角線降低奇異值。

Approximation by truncating...意味着我可以在S歸零奇異值重建I'

I_recon = U(1:256,1:N)*S(1:N,1:N)*V(1:256,1:N).'; %//Reconstruct by keeping the first N singular values in S. 

這裏會發生什麼事是,I_reconN最顯著的奇異值重構的圖像。這樣做的目的是爲了我們可以刪除less significant對圖像I的貢獻,並且代表I數據較少。

這是重建圖像的具有不同N一個例子:

SVD reconstruction of I

+0

我正在嘗試你的建議,它不工作。我的結果圖像即使在N = 128時也只是一束黑色,灰色和白色線條。這是我使用的代碼:'A = double(imread(「image.jpg」))/ 255; (U1,S1,V1)= svd(A(:,:,1)); [U2,S2,V2] = svd(A(:,:2)); [U3,S3,V3] = svd(A(:,:3)); N = 128; (1:763,1:N)* S1(1:N,1:N)* V1(1:N,1:691))* 255; trunc_image = imwrite(trunc_image,「truncimg.jpg」,「jpg」);' – whatwhatwhat

+0

@whatwhatwhat 1)讀取圖像後不需要分割255(轉換爲double矩陣就足夠了)。 2)似乎你不需要使用綠色和藍色通道,所以你不需要第3和第4行。3)重建時,一定要調換你的'V'矩陣。 4)由於你正在使用'double'類型的矩陣,所以在你顯示任何東西之前一定要把它除以255。 – Lincoln

+0

我最初除以255的原因是因爲我的問題集指示我這樣做。 [見此截圖](http://imgur.com/ezkSX62)。但是,我沒有看到這樣做的任何一點!你知道爲什麼在使用'imwrite'之前除以255再乘以255是有用的嗎? – whatwhatwhat