图像的SVD压缩不能给出令人满意的结果

时间:2018-01-18 20:18:36

标签: image matlab compression

让我们假设我们有以下图像 enter image description here

我已阅读并在matlab中转换为灰度

I=imread('tbilisi.jpg');
gray=rgb2gray(I);

我有以下结果 enter image description here

现在我已经完成了这张图片的svd(当然首先我已经转换为双格式)

>> [U E V]=svd(double(gray));

让我们展示我们所拥有的每个组件的大小

>> whos
  Name         Size                  Bytes  Class     Attributes

  E          575x1000              4600000  double              
  I          575x1000x3            1725000  uint8               
  U          575x575               2645000  double              
  V         1000x1000              8000000  double              
  gray       575x1000               575000  uint8   

现在让我们选择前40个组件和近似原始图像

>> approximated=uint8(U(:,1:40)*E(1:40,1:40)*V(:,1:40)');

并显示结果 enter image description here

现在让我们再次检查尺寸

>> whos
  Name                 Size                  Bytes  Class     Attributes

  E                  575x1000              4600000  double              
  I                  575x1000x3            1725000  uint8               
  U                  575x575               2645000  double              
  V                 1000x1000              8000000  double              
  approximated       575x1000               575000  uint8               
  gray               575x1000               575000  uint8

近似且灰色具有相同的字节,其中是压缩?提前谢谢

2 个答案:

答案 0 :(得分:4)

压缩图像是编码的图像。 SVD组件是您应该存储的组件。例如,

compressed = {U(:,1:40), E(1:40,1:40), V(:,1:40)'}

可能是您的压缩图像。 compressed的信息少于gray(尽管所有值都是双倍的,因此每个值占用的空间是一个输入图像像素的8倍;转换为单精度浮点数会有所帮助,例如)。

将组件相乘以形成approximated时,您正在解码(“解压缩”)图像。结果必须与grey图像的像素数相同,因此占用的空间量完全相同。

请注意,此类压缩通常通过将图像分割为小方块来完成。每个方块被独立压缩,并且选择存储的组件的数量使得与输入的差异不是太大。这允许用细节很少的部分图像用比具有大量细节的部分更少的字节来表示。

答案 1 :(得分:1)

术语中存在混淆:近似图像!=压缩图像。

原始(灰色)和解码(近似)图像应尽可能相似 - 包括尺寸。

压缩的“图像”不是图像。它是您存储在文件中并发送给您的朋友的字节集。在这种情况下,它是截断的U,E和V矩阵,希望小于解码图像。当您的朋友获取压缩文件时,她可以创建解码图像。