精华内容
下载资源
问答
  • 奇异值分解(Singular Value Decomposition 简称SVD)是线性代数中的一种重要分解,在很多领域都有着广泛的应用。这篇文章将通过一个图像压缩的例子教你如何在Python中使用SVD实现数据压缩,并说明其原理。奇异值分解...

    奇异值分解(Singular Value Decomposition 简称SVD)是线性代数中的一种重要分解,在很多领域都有着广泛的应用。这篇文章将通过一个图像压缩的例子教你如何在Python中使用SVD实现数据压缩,并说明其原理。

    奇异值分解压缩的原理

    先看一个简单的例子,如果你想要在网络上给别人发送一段数据,数据的内容为

    7dd4c8a30585f319741881645e8bd282.png

    19eb704d2b36491f9c1f172d63a6be75.png

    当然,最简单的方法就是给这个矩阵直接发过去,这是一个5x5的矩阵,你至少需要发送25个数字。

    但是我们可以把这个矩阵分解为两个矩阵的乘积,这样只需要发送10个数字。

    91e54b542010e2169aba67999d95f485.png

    图像也可以被视为矩阵,图像的每一个点都是由RGB值定义的,所以每个图像可以被表示为三个巨型矩阵(分别是R,G,B矩阵)。

    但图像所生成的矩阵显然不会像上面的例子那样简单的就被分解了。想要分解任意矩阵,这就需要用到SVD了。

    SVD分解可以被认为是EVD(Eigen Value Decomposition 特征值分解)的延伸。特征值分解将一个矩阵分解为两组正交的特征向量和一个特征值对角线矩阵。

    而特征值矩阵又是从大到小排列的,特征值大小的下降速度很快,我们可以通过丢弃一些特征值来压缩数据。对于压缩图像来说,只要人眼不可察觉便可以认为是成功的压缩。

    简单来说,就是通过把一块大的数据分解为很多项,通过给数据的每个项的重要程度排序,挑选出一部分最重要的保留,丢弃一部分最不重要的,来实现数据压缩。

    Python实现图像压缩

    在python中使用SVD算法很容易,直接使用库函数即可。这里主要使用numpy库用来进行矩阵计算,matplotlib用来显示图像以及PIL库用来读取本地测试图片。

    首先需要把测试图片导入进来,转换为numpy的矩阵。

    img=Image.open(,)
    a=np.array(img)

    这里图片转矩阵后的格式实际上是一个图片长乘宽的矩阵,这个矩阵的每一个项都包含3个数字,分别是R,G,B的值

    实现SVD分解

    SVD分解只需要一句话即可

    u,sigma,v=np.linalg.svd(a[:,:,0])

    这里的SVD分解返回三个执行后返回三个矩阵,分别是u,sigma和v

    实现重建函数

    def rebuild_img(u,sigma,v,p):
         m=len(u)
         n=len(v)
         a=np.zeros((m,n))
         count=(int)(sum(sigma))
         curSum=0
         k=0
         while curSum<=count*p:
             uk=u[:,k].reshape(m,1)
             vk=v[k].reshape(1,n)
             a+=sigma[k]*np.dot(uk,vk)
             curSum+=sigma[k]
             k+=1
         a[a<0]=0
         a[a>255]=255
         return np.rint(a).astype()

    重建函数接受4个参数,u,sigma,v即重建矩阵所需的内容,p则为使用特征值的比例,我们将通过改变比例p来看使用特征值比例对画面的影响。

    算法的步骤如下描述:

    首先计算出m和n,即图片矩阵的长和宽,然后创建一个零矩阵a作为组装场地。

    count是所有特征值加起来的总和,用于后面计算比例使用

    uk和vk就是从参数u和v中取出,改变形式后形成的与当前特征值对应得一组特征向量。

    然后不断地从参数中取出uk、vk和sigma,运算后叠加到a上去,直到满足一定的比例。

    最后把所有矩阵内的项取整数退出即可。

    数据压缩实验

    有了分解与重建,现在可以设计数据压缩试验了。

    这里我们控制特征值的使用比例,从0.1到1,每次步进0.1,然后分解重建,看看图像的显示情况。

    for i in np.arange(0.1,1,0.1):
         u,sigma,v=np.linalg.svd(a[:,:,0])
         R=rebuild_img(u,sigma,v,i)
         u,sigma,v=np.linalg.svd(a[:,:,1])
         G=rebuild_img(u,sigma,v,i)
         u,sigma,v=np.linalg.svd(a[:,:,2])
         B=rebuild_img(u,sigma,v,i)
         I=np.stack((R,G,B),2)
         plt.subplot(330+i*10)
         plt.title(i)
         plt.imshow(I)
     plt.show()

    为了展示细节的丢失程度,特地找了一张细节丰富的图像作为试验对象。原图分辨率1920×724,见图1.

    2079b438a555af6a0ed7a0c23511f719.png

    19eb704d2b36491f9c1f172d63a6be75.png

                        图 1    丰富细节的原始图

    图2为运行结果

    5a914286db5639a87b1595c9b72d9f68.png

                         图 2     SVD分解后结果图

    可以看到,当sigma比例在0.5及以下时,能够明显察觉到图片被压缩的痕迹,但当sigma比例超过0.6时,细节的还原就比较好了,当0.7,0.8,0.9时,肉眼几乎无法发现压缩痕迹,证明了SVD作为图像压缩算法,在细节丢失方面是可以控制得比较好的。在保持细节的前提下,可以将数据压缩10%-30%左右。

    最后,如果您有python /java /小程序/安卓/linux相关需求,可以通过微信公众号联系我们。

    微信公众号:320科技工作室。

    25ba9b36e9afa8f85ad8c04295c1cd8a.png

    展开全文
  • 基于奇异值分解图片压缩 一、目的 在网络空间安全数学基础上,老师给出了一种基于奇异值分解图片压缩办法。在本篇文章中,对此进行简单的实现。 二、简单的数学原理 step1:我们考虑一个 n * n 的方阵A,其总...

    基于奇异值分解的图片压缩

    一、目的

    在网络空间安全数学基础上,老师给出了一种基于奇异值分解的图片压缩办法。在本篇文章中,对此进行简单的实现。

    二、简单的数学原理

    step1:我们考虑一个 n * n 的方阵A,其总满足:

    在这里插入图片描述
    假设有好多特征值 Lambda 与特征向量 x 都满足上述公式,则有:

    在这里插入图片描述
    可以得到:

    在这里插入图片描述

    这样,我们就把一个方阵 A 进行了分解。

    step2:同理,任意 m * n 的矩阵 M,都可分解为这样的形式,我们把它称为奇异值分解。

    step3:我们将 M 分解为如下图所示:
    在这里插入图片描述
    化简一下,就变为:

    在这里插入图片描述
    我们看到,这个式子大概加了 n 次,如果我们将图片变为矩阵,n是很大的,那如果只保留前 k 项,对矩阵 M 的影响如何呢?
    (注意:la_1 > la_2 >…> la_n)

    三、Matlab代码实现:

    在此,我们将一个图片化为矩阵,只保留奇异值分解的前 k 项,观察对图片的影响。

    I = imread('C:\Users\dell\Desktop\IMG_20190405_111109.jpg');
    I=double(I);  %将图片 0~255 转化为 double 形式,方便奇异值分解
    [u s v]=svd(I(:,:,1));   %奇异值分解只能分解二维矩阵
    k=200;    %保留项数为200
    left=u(:,1:k);
    val=s(1:k,1:k);
    right=v(:,1:k);
    out=left*val*right';
    low=min(min(out));
    high=max(max(out));
    imshow(out,[low,high]);  %看一下图片啥样的啊
    imwrite(uint8(out), 'C:\Users\dell\Desktop\result.jpg');%保存一下
    
    四、测试结果:

    我们所处理的图片:5.87 MB
    1.当 k = 200 时,大小为1.6 MB:
    在这里插入图片描述
    2.当 k = 50 时,大小为1.0 MB:
    在这里插入图片描述

    展开全文
  • svd函数返回三个分解部分u,s,vh,由于s是一个对角矩阵,因此s是一个一维数组,保存对角线上的非零值s中的每个值与vh的行向量以及u中的列向量对应,默认按照从大到小的顺序排列,他表示与其对应向量的重要性奇异值...

    svd函数返回三个分解部分u,s,vh,由于s是一个对角矩阵,因此s是一个一维数组,保存对角线上的非零值

    s中的每个值与vh的行向量以及u中的列向量对应,默认按照从大到小的顺序排列,他表示与其对应向量的重要性

    奇异值大小差别很大,图中y轴为对数坐标轴

    使用svd分解后的向量还原图片

    原图

    使用5个向量

    使用50个向量

    使用100个向量

    200

    500

    1000

    全部

    向量数目越多,效果越好,用所有向量即可还原原始图片

    from scipy import linalg

    import numpy as np

    import cv2 as cv

    import pylab as pl

    img = cv.imread('img.png')

    img = cv.cvtColor(img, cv.COLOR_BGR2GRAY)

    cv.imshow('img', img)

    print(img.shape) # (1920, 1080)

    u, s, vh = linalg.svd(img)

    print(u.shape, s.shape, vh.shape) # (1920, 1920) (1080,) (1080, 1080)

    # 根据前n个向量合成图片

    def composite(n):

    return np.dot(u[:, :n], s[:n, np.newaxis] * vh[:n, :])

    pl.semilogy(s, lw=3)

    img5 = composite(5).astype(np.uint8)

    print(img5.shape, img5.dtype) # (1920, 1080) uint8

    cv.imshow('img5', img5)

    cv.imshow('img50', composite(50).astype(np.uint8))

    cv.imshow('img100', composite(100).astype(np.uint8))

    cv.imshow('img200', composite(200).astype(np.uint8))

    cv.imshow('img500', composite(500).astype(np.uint8))

    cv.imshow('img800', composite(800).astype(np.uint8))

    cv.imshow('img1000', composite(1000).astype(np.uint8))

    cv.imshow('img_all', composite(len(s)).astype(np.uint8))

    pl.show()

    cv.waitKey(0)

    转载至链接:https://my.oschina.net/ahaoboy/blog/1933077

    展开全文
  • 在矩阵M的奇异值分解中 ·U的列(columns)组成一套对M的正交"输入"或"分析"的基向量。这些向量是MM的特征向量。 ·V的列(columns)组成一套对M的正交"输出"的基向量。这些向量是MM的特征向量。 ·Σ对角线上的元素是...

    最近在做通过svd压缩数据的项目,虽然不是图片处理的,但是发现在对图片压缩方面还是挺不错的,就做了做尝试,svd的数学原理不再说重复。

    直观的解释
    在矩阵M的奇异值分解中
    ·U的列(columns)组成一套对M的正交"输入"或"分析"的基向量。这些向量是MM的特征向量。
    ·V的列(columns)组成一套对M的正交"输出"的基向量。这些向量是M
    M的特征向量。
    ·Σ对角线上的元素是奇异值,可视为是在输入与输出间进行的标量的"膨胀控制"。这些是MM及MM的奇异值,并与U和V的列向量相对应。

    Python实现:
    需要numpy库,如果使用anaconda的话不需要再 pip install numpy

    import numpy as np # 导入numpy库
    from scipy import ndimage
    import matplotlib.pyplot as plt
    # np.linalg.svd( ) # SVD函数
    
    img = ndimage.imread(".../test.jpg", flatten=True) # 图片路径
    ori_img = np.array(img)
    U,S,VT = np.linalg.svd(img) # 奇异值分解
    k = 50 # 取前50个奇异值
    sig = np.eye(k) * S[: k]
    new_img = np.dot(np.dot(U[:, :k], sig), VT[:k, :])
    
    fig, ax = plt.subplots(1, 2)
    ax[0].imshow(ori_img)
    ax[0].set_title("old")
    ax[1].imshow(new_img)
    ax[1].set_title("new")
    plt.show()
    

    程序用的灰度图进行的读取,感兴趣的可以尝试RGB三通道图的读取,做法差不多。
    以下是结果
    在这里插入图片描述

    展开全文
  • 矩阵的奇异值是一个数学意义上的概念,一般是由奇异值分解(Singular Value Decomposition,简称SVD分解)得到。如果要问奇异值表示什么物理意义,那么就必须考虑在不同的实际工程应用中奇异值所对应的含义。下面先...
  • 奇异值分解

    2019-04-26 16:20:24
    奇异值分解理论描述新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个...
  • SVD奇异值分解

    2020-12-24 22:01:42
    下面是Matlab奇异值分解压缩图片的程序: 注意图像的存储,不仅和像素值的多少有关,还和图像保存信息的复杂程度有关。有可能相同分辨率的图片大小不同,因为信息的保存方式不一样。 % 奇异值分解 nr = 2; %保留的秩...
  • SVD概念可以参考:《统计学习方法》–奇异值分解(Singular Value Decomposition,SVD) 2. 原理简介 彩色图片有3个图层,RGB(红、绿、蓝)也就是矩阵的一个位置上存储了3个基色的数值,由3个基色混合成不同的色彩...
  • 奇异值分解/图片压缩

    2019-09-25 10:29:27
    我是一个搬运工
  • 奇异值分解(Singular Value Decomposition 简称SVD)是线性代数中的一种重要分解,在很多领域都有着广泛的应用。这篇文章将通过一个图像压缩的例子教你如何在Python中使用SVD实现数据压缩,并说明其原理。奇异值分解...
  • SVD奇异值分解代码.zip

    2020-09-08 23:26:45
    SVD奇异值分解代码:包含完整工程,可直接运行,代码有C++和C两种。奇异值分解在数据降维中有较多的应用,这里把它的原理简单总结一下,并且举一个图片压缩的例子,最后做一个简单的分析,希望能够给大家带来帮助。
  • def restore1(sigma,u,v,k):#奇异值,左特征向量,右特征向量 print k m=len(u) n=len(v[0]) a=np.zeros((m,n)) for k in range(k+1): for i in range(m): a[i]+=sigma[k]*u[i][k]*v[k] b=a.a...
  • 奇异值分解svd

    2018-06-08 18:24:47
    目前所有的文章都是直接给出了svd的应用比如图压缩的例子,然后就告诉你奇异值分解就是这个意思可以做数据的压缩等等,但是为什么?为什么可以做图片的压缩?换句话说我们这么干了之后为什么图片会在最大程度上代表原图?...
  • 奇异值分解(Singular Value Decomposition 简称SVD)是线性代数中的一种重要分解,在很多领域都有着广泛的应用。这篇文章将通过一个图像压缩的例子教你如何在Python中使用SVD实现数据压缩,并说明其原理。 奇异值...
  • 奇异值分解是特征值分解的一个普遍化的方法,适用于降维、图片压缩等方面的应用。 特征值分解 矩阵A是一个m*m的实对称矩阵(A=A’),则A可被分解为QEQ’,其中Q是正交矩阵(QQ’=I)。 奇异值分解 特征值分解需要A...
  • 图象压缩挺重要的,而百度百科上说:奇异值分解(Singular Value Decomposition,SVD)是线性代数中一种重要的矩阵分解,奇异值分解则是特征分解在任意矩阵上的推广。具体的数学原理我不是很清楚,这篇博客主要总结...
  • SLAM中的奇异值分解

    2020-07-29 12:40:25
    奇异值分解的物理意义和几何意义 奇异值分解是一个能适用于任意的矩阵的一种分解的方法: 假设A是一个M* N的矩阵,那么得到的U是一个M* M的方阵(里面的向量是正交的,U里面的向量称为左奇异向量且为单位正交阵) ...
  • 特征值分解与奇异值分解及其应用

    千次阅读 2018-06-28 12:51:50
    SVD奇异值分解 正交矩阵 正交矩阵   正交矩阵对应着正交变换,特点在于不改变向量的尺寸(模)和任意两个向量的夹角。在x-y坐标系中,通俗地讲,就是旋转两个坐标轴,得到新的互相垂直的坐标轴,求向量在新...
  • SVD(奇异值分解)

    2021-04-03 15:32:37
    奇异值分解(SVD) 作用: 用于图片压缩 用于加速神经网络的运算过程
  • 奇异值分解(Singular Value Decomposition 简称SVD)是线性代数中的一种重要分解,在很多领域都有着广泛的应用。这篇文章将通过一个图像压缩的例子教你如何在Python中使用SVD实现数据压缩,并说明其原理。奇异值分解...
  • 注:奇异值分解在数据降维中有较多的应用,这里把它的原理简单总结一下,并且举一个图片压缩的例子,最后做一个简单的分析,希望能够给大家带来帮助。 1、特征值分解(EVD)# 实对称矩阵# 在理角奇异值分解之前,...
  • 奇异值分解的物理意义

    千次阅读 2019-06-11 09:44:40
    矩阵的奇异值是一个数学意义上的概念,一般是由奇异值分解(Singular Value Decomposition,简称SVD分解)得到。如果要问奇异值表示什么物理意义,那么就必须考虑在不同的实际工程应用中奇异值所对应的含义。下面先...
  • SVD(奇异值分解

    2020-06-15 11:10:10
    注:奇异值分解在数据降维中有较多的应用,这里把它的原理简单总结一下,并且举一个图片压缩的例子,最后做一个简单的分析,希望能够给大家带来帮助。 1、特征值分解(EVD)# 作者: EndlessCoding 出处:...
  • 奇异值分解矩阵还原灰度图像结果报告一、由图片生成矩阵1.1原图与灰度图1.2图片转换矩阵二、奇异值分解还原图像2.1取最大特征值还原图像2.2取最小特征值还原图像 一、由图片生成矩阵 用特征值(奇异值)还原图片涉及...

空空如也

空空如也

1 2 3 4 5 6
收藏数 120
精华内容 48
关键字:

奇异值分解图片