这个例子展示了如何使用svdsketch
压缩图像。svdsketch
使用低秩矩阵近似来保留图像的重要特征,同时过滤掉不太重要的特征。作为与使用的公差svdsketch
大小的增加,更多的特征被过滤掉,改变图像的细节级别。
加载图片street1.jpg
,这是一张城市街道的图片。形成这幅图像的三维矩阵是uint8
,将图像转换为灰度矩阵。使用原始矩阵秩的注释查看图像。
一个= imread (“street1.jpg”);= rgb2gray ();imshow (A)标题([“原始(”sprintf (“等级% d)”、等级(双(A)))))
使用svdsketch
计算一个近似的低秩矩阵一个
在容许范围内1)依照
。通过乘以返回的SVD因子形成低秩矩阵svdsketch
,将结果转换为uint8
,并查看生成的图像。
[U1, S1, V1] = svdsketch(1双(A),依照);Anew1 = uint8 (U1 * S1 * V1’);imshow (uint8 (Anew1)标题(sprintf (% d级近似的、大小(S1, 1)))
svdsketch
产生一个288的近似等级,这将导致图像的一些边界线的一些轻微的粒状。
现在,第二次压缩图像使用的容错1 e 1
。随着公差的幅度增加,所产生的近似值的秩svdsketch
普遍降低。
(U2, S2, V2) = svdsketch(双(A), 1 e 1);Anew2 = uint8 (U2 * S2 * V2’);imshow (Anew2)标题(sprintf (% d级近似的、大小(S2, 1)))
这一次,svdsketch
产生一个48级近似。图像的大部分主要方面仍然可见,但额外的压缩增加了模糊度。
svdsketch
根据指定的公差,自适应地确定矩阵草图的秩。然而,您可以使用MaxSubspaceDimension
名称-值对,以指定应用于形成矩阵草图的最大子空间大小。这个选项可能产生不满足容差的矩阵,因为您指定的子空间可能太小。在这些情况下,svdsketch
返回具有最大允许子空间大小的矩阵草图。
使用svdsketch
宽容地1 e 1
最大子空间大小为15。指定第四个输出以返回相对近似误差。
[U3, S3, V3, apxErr] = svdsketch(双(A), 1 e 1,“MaxSubspaceDimension”15);
将结果的相对近似误差与规定的公差进行比较。apxErr
包含一个元素,因为svdsketch
只需要一次迭代就可以计算出答案。
apxErr < = 1 e 1
ans =逻辑0
结果表明,矩阵草图不满足规定的公差要求。
查看严重压缩排名15的图像。
Anew3 = uint8 (U3 * S3 * V3的);imshow (Anew3)标题(sprintf (% d级近似的、大小(S3, 1)))
最后,并排查看所有的图像进行比较。
tiledlayout (2, 2,“TileSpacing”,“紧凑”(A)标题(“原始”) nexttile imshow(Anew1) title(sprintf(sprintf))% d级近似的,size(S1,1))) nexttile imshow(Anew2) title(sprintf(sprintf(1))% d级近似的(1) / /创建一个新文件,然后创建一个新文件,然后创建一个新文件% d级近似的、大小(S3, 1)))