zoukankan      html  css  js  c++  java
  • MATLAB 奇异值分解压缩图像

    介绍一下奇异值分解来压缩图像。今年的上半年中的一篇博客贴了一篇用奇异值分解处理pca问题的程序,当时用的是图像序列,是把图像序列中的不同部分分离开来。这里是用的不是图像序列了,只是单单的一幅图像,所以直接就对图像矩阵进行svd了。

      吴军的《数学之美》里其实已经介绍过用svd进行大数据的压缩了,不过我这里还是针对图像进行介绍一下吧。比如一幅1000*1000的图像A,存储就需要1000000个像素了。我们对A进行svd分解,则A=USV’,如果rank(A)=r,那么U就为1000*r的矩阵,S为r*r的矩阵,V为1000*r的矩阵。所以存储的数据就是1000*r+r*r+1000*r个数了,如果这个r比较小,那么存储的空间就会小很多了,当然了,如果r=1000,这时这样来算svd就是既浪费了空间又浪费了时间。所以用这个svd时,还是先看看它的秩为好。

      下面给出程序和运行结果,这里使用不同的特征分量对原图像进行重构,可以看一下效果。(这里悲剧的秩就是原图的宽)

     1 clear all;
     2 close all;
     3 clc;
     4 
     5 a=imread('lena.jpg');
     6 
     7 imshow(mat2gray(a))
     8 [m n]=size(a);
     9 a=double(a);
    10 r=rank(a);
    11 [s v d]=svd(a);
    12 
    13 %re=s*v*d';
    14 re=s(:,:)*v(:,1:1)*d(:,1:1)';
    15 figure;
    16 imshow(mat2gray(re));
    17 imwrite(mat2gray(re),'1.jpg')
    18 
    19 re=s(:,:)*v(:,1:20)*d(:,1:20)';
    20 figure;
    21 imshow(mat2gray(re));
    22 imwrite(mat2gray(re),'2.jpg')
    23 
    24 re=s(:,:)*v(:,1:80)*d(:,1:80)';
    25 figure;
    26 imshow(mat2gray(re));
    27 imwrite(mat2gray(re),'3.jpg')
    28 
    29 re=s(:,:)*v(:,1:150)*d(:,1:150)';
    30 figure;
    31 imshow(mat2gray(re));
    32 imwrite(mat2gray(re),'4.jpg')

    下面是效果图:

     lena原图

     只用第1个特征值进行重构

     用前10个特征值进行重构

     用前80个特征值进行重构

     用前150个特征值进行重构

    最后说一些奇异值分解的应用:

    1.图像压缩,正如上面的。

    2.噪声滤波。

    3.模式识别。因为svd就是提取主要的成分嘛。

    4.生物,物理,经济方面的一些统计模型的处理。

  • 相关阅读:
    flash播放器插件与flash播放器的区别
    FLASH动作脚本详解
    flash代码
    LitJson使用中需要注意的一些问题(转)
    AS3中ASCII码和字符互转函数
    JQuery直接调用asp.net后台WebMethod方法(转)
    C#文件操作
    js延迟执行
    js操作表格、table、
    定时任务、js定时任务
  • 原文地址:https://www.cnblogs.com/ybqjymy/p/13646021.html
Copyright © 2011-2022 走看看