zoukankan      html  css  js  c++  java
  • 利用矩阵奇异值分解对图像进行压缩

    最近学习线性代数的有关东西,在看到奇异值分解(svd)时,发现了一个在图像压缩上的应用。

    奇异值分解:在线性代数中,我们知道对任意一个矩阵都存在奇异值分解,,其中UV是标准正交矩阵,而是一个对角矩阵,每一个对角元是该矩阵的奇异值,奇异值指的是矩阵的特征值开根号。其具体分解形式如下:

    其中

    A展开得

    A看成一个图像的矩阵,上面和式的每一个分量按大小排序,越大,说明越重要。而后面的权很小,可以舍去,如果只取前面k项,则数据量为(m+n+1)k<<m*n因而达到了压缩图像的目的。

    通过对比发现,当k=1/20 r时,能基本看清图像。当k=1/4r时基本看不出任何区别,对于长宽相等的图像,此时数据量占原数据量的2k/n,在测试图像中,这个数值为0.5 。可见图像压缩的效果是显著的。

    处理结果如下:

    原始图像:

    k=1:

    k=2:

    k=3:

    k=4:

    k=21:

    k=50:

    k=105:

    k=r=420:

    matlab测试代码:

    SNum = 21;

    I = imread('img.bmp');

    h = size(I,1);

    w = size(I,2);

    R = I(:,:,1);

    G = I(:,:,2);

    B = I(:,:,3);

    debug = 'RGB disposed'

    Rd = im2double(R);

    Gd = im2double(G);

    Bd = im2double(B);

    [Ur,Sr,Vr] = svd(Rd);

    [Ug,Sg,Vg] = svd(Gd);

    [Ub,Sb,Vb] = svd(Bd);

    debug = 'end SVD decomposition'

    Rt = zeros(h,w);

    Gt = zeros(h,w);

    Bt = zeros(h,w);

    for i = 1:SNum

        Rt = Rt + Sr(i,i)*Ur(:,i)*Vr(:,i)';

        Gt = Gt + Sg(i,i)*Ug(:,i)*Vg(:,i)';

        Bt = Bt + Sb(i,i)*Ub(:,i)*Vb(:,i)';

    end

    I2(:,:,1) = im2uint8(Rt);

    I2(:,:,2) = im2uint8(Gt);

    I2(:,:,3) = im2uint8(Bt);

    imshow(I2);

  • 相关阅读:
    <<程序员>> 杂志网站
    插入排序
    冒泡排序
    TCP/IP编程实现远程文件传输
    选择排序
    防止基础表数据变动,导致相关的历史记录数据产生变动的解决方案
    发布一个RSS辅助类
    感谢jquery和firebug,让我也终于敢于写javascript了
    DevExpress ASPxGridView 使用文档四:数据源
    DevExpress ASPxGridView 使用文档六:模板
  • 原文地址:https://www.cnblogs.com/maplewizard/p/2942038.html
Copyright © 2011-2022 走看看