2016-04-25 28 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