• numpy之特征值、奇异值分解及其在图片处理中的应用


    一、特征值与特征向量基本概念及小示例

      

    '''
        特征值与特征向量---针对矩阵而言的,主要记载矩阵信息
            对于n阶方阵A,如果存在数a和非零n维列向量x,使得Ax = ax,则称a是矩阵A的一个特征值,x是矩阵A数据特征值a的特征向量
            ---已知方阵A,求特征值和特征向量的numpy实现:eigvals,eigvecs = np.linalg.eig(A)
            ---已知特征值和特征向量,求方正A的numpy实现:A = eigvecs * np.diag(eigvals) * eigvecs.I
                    ----是由Ax = ax推导出来的
    '''
    import numpy as np
    
    A = np.mat('4 8 9;3 5 8;1 9 3')
    print(A)
    
    # 提取特征信息
    eigvals, eigvecs = np.linalg.eig(A)
    print(eigvals, type(eigvals))
    print(eigvecs, type(eigvecs))
    # 对eigvals进行对角化处理,数据类型为数组
    print(np.diag(eigvals))
    # 逆向推导方阵
    A2 = eigvecs * np.diag(eigvals) * eigvecs.I
    print(A2)
    
    # 如果只保留一部分特征值,则:
    # 应用:图片处理保留主要特征
    eigvals[2:] = -4
    A3 = eigvecs * np.diag(eigvals) * eigvecs.I
    print(A3)
    
    
    
    输出结果:
    [[4 8 9]
     [3 5 8]
     [1 9 3]]
    [15.5686571   0.58730164 -4.15595874] <class 'numpy.ndarray'>
    [[-0.71687407 -0.93836182 -0.2784087 ]
     [-0.53860537  0.01165284 -0.57860785]
     [-0.44271415  0.34545812  0.76661696]] <class 'numpy.matrix'>
    [[15.5686571   0.          0.        ]
     [ 0.          0.58730164  0.        ]
     [ 0.          0.         -4.15595874]]
    [[4. 8. 9.]
     [3. 5. 8.]
     [1. 9. 3.]]
    [[3.98919756 8.03959409 8.96932196]
     [2.97754964 5.08228713 7.93624281]
     [1.02974524 8.89097501 3.08447404]]

    二、提取图片特征值:----仅限于图片像素矩阵为方阵

      

    '''
        提取图像特征值,保留部分特征,生成新图片
    '''
    import numpy as np
    import scipy.misc as sm  # 提供读取图片的方法
    import matplotlib.pyplot as mp
    import imageio
    
    image1 = sm.imread('./da_data/lily.jpg', True)  # 第二个参数为布尔值,表示是否对图片进行亮度处理,若true则起到降维作用
    print(image1, image1.shape, type(image1))
    
    # 提取image特征
    eigvals, eigvecs = np.linalg.eig(image1)
    print(eigvals, type(eigvals), eigvals.size)
    print(eigvecs, type(eigvecs), eigvals.size)
    # 逆向生成图片
    # 只保留50个特征值
    eigvals[50:] = 0
    image2 = np.mat(eigvecs) * np.diag(eigvals) * np.matrix(eigvecs).I
    
    mp.figure('EIG Image', facecolor='lightgray')
    mp.subplot(121, title='IMAGE1')
    mp.imshow(image1, cmap='rainbow')
    mp.xticks([])
    mp.yticks([])
    mp.subplot(122, title='IMAGE2')
    mp.imshow(image2.real, cmap='rainbow')
    mp.xticks([])
    mp.yticks([])
    mp.show()

      

    三、奇异值分解基本概念及小示例

      

    '''
        奇异值分解----不仅可以处理方阵,还可以处理非方阵
        概念:有一个矩阵M,可以分解为3个矩阵U、S、V,是的U*S*V=M,U与V都是正交矩阵(乘以自身的转置矩阵的结果为单位矩阵),那么S矩阵
            主对角线上的值称为M的奇异值,其他元素都是0
    
        numpy中实现奇异值求解:
                U,sv,V = np.linalg.svd(M)   ---sv为分解所得的奇异值数组,U,V为正交矩阵
        numpy中通过U,sv,V求解M:M = U * np.diag(sv) * V
    '''
    import numpy as np
    
    A = np.mat('4 8 9;3 5 8')
    print(A)
    
    # 提取奇异值
    U, sv, V = np.linalg.svd(A, full_matrices=False)  # full_matrices可以保证逆向生成原方阵,针对的是V
    print(sv)
    print(U * np.diag(sv) * V)

    输出结果:
    [[4 8 9]
     [3 5 8]]
    [16.04488896  1.24961523]
    [[4. 8. 9.]
     [3. 5. 8.]]

    四、奇异值在图片处理中的应用---提取图片中的奇异值

      -----奇异值在图片处理中优于特征值在图片处理中的应用,主要有两点:

        1.特征值只能处理方阵,即像素阵必须为方阵,而奇异值可以使非方阵

        2.对奇异值数组和特征值数组抹去同样个数的值,再去生成新的图片时,奇异值所生成的图片效果要好于特征值

      

    '''
        奇异值分解----不仅可以处理方阵,还可以处理非方阵
        概念:有一个矩阵M,可以分解为3个矩阵U、S、V,是的U*S*V=M,U与V都是正交矩阵(乘以自身的转置矩阵的结果为单位矩阵),那么S矩阵
            主对角线上的值称为M的奇异值,其他元素都是0
    
        numpy中实现奇异值求解:
                U,sv,V = np.linalg.svd(M)   ---sv为分解所得的奇异值数组,U,V为正交矩阵
        numpy中通过U,sv,V求解M:M = U * np.diag(sv) * V
    '''
    import numpy as np
    import scipy.misc as sm  # 提供读取图片的方法
    import matplotlib.pyplot as mp
    import imageio
    
    image1 = sm.imread('./da_data/lily.jpg', True)  # 第二个参数为布尔值,表示是否对图片进行亮度处理,若true则起到降维作用
    print(image1, image1.shape, type(image1))
    image = sm.imread('./da_data/1.jpg', True)
    
    # 提取image特征值
    eigvals, eigvecs = np.linalg.eig(image1)
    print(eigvals, type(eigvals), eigvals.size)
    print(eigvecs, type(eigvecs), eigvals.size)
    # 逆向生成图片
    # 只保留50个特征值
    eigvals[50:] = 0
    image2 = np.mat(eigvecs) * np.diag(eigvals) * np.matrix(eigvecs).I
    
    # 奇异值分解--方阵情况
    U, sv, V = np.linalg.svd(image1)
    # 抹掉部分奇异值,生成新图片---只保留50个奇异值
    sv[50:] = 0
    image3 = np.mat(U) * np.mat(np.diag(sv)) * np.mat(V)
    
    # 奇异值分解--非方阵情况,在处理非方阵是full_matrices主要针对V(因为V为方正,其维度无法与U*sv的结果相乘)
    U, sv, V = np.linalg.svd(image, full_matrices=False)
    # 抹去部分奇异值
    sv[50:] = 0
    image4 = np.mat(U) * np.mat(np.diag(sv)) * np.mat(V)
    
    mp.figure('EIG Image', facecolor='lightgray')
    mp.subplot(321, title='IMAGE1')
    mp.imshow(image1, cmap='gray')
    mp.xticks([])
    mp.yticks([])
    mp.subplot(322, title='IMAGE2')
    mp.imshow(image2.real, cmap='gray')
    mp.xticks([])
    mp.yticks([])
    mp.subplot(323, title='IMAGE3')
    mp.imshow(image3.real, cmap='gray')
    mp.xticks([])
    mp.yticks([])
    mp.subplot(324, title='IMAGE')
    mp.imshow(image.real, cmap='gray')
    mp.xticks([])
    mp.yticks([])
    mp.subplot(325, title='IMAGE4')
    mp.imshow(image4.real, cmap='gray')
    mp.xticks([])
    mp.yticks([])
    mp.show()

      

  • 相关阅读:
    Docker 使用笔记 (一)
    oracle 截取字符(substr),检索字符位置(instr)
    oracle表空间配额(quota)与UNLIMITED TABLESPACE系统权限
    把大象放到eclipse分几步?
    hadoop -- 搭建集群小工具
    1. Mybatis简单操作
    SpringMVC --- 拦截器 HandlerInterceptor
    Spring MVC --- 异步请求
    Spring MVC--RequestMapping
    Spring MVC 异常控制
  • 原文地址:https://www.cnblogs.com/yuxiangyang/p/11170169.html
Copyright © 2020-2023  润新知