svd对图片进行特征值提取(python)

一、介绍

  • SVD 全称:Singular Value Decomposition。SVD 是一种提取信息的强大工具,它提供了一种非常便捷的矩阵分解方式,能够发现数据中十分有意思的潜在模式。

详细了解请移步:SVD-矩阵奇异值分解 —— 原理与几何意义

二、降维处理

  • 代码
import numpy as np
import os
from PIL import Image
import matplotlib.pyplot as plt
import matplotlib as mpl
from pprint import pprint
def restore1(sigma, u, v, K):  # 奇异值、左特征向量、右特征向量
    m = len(u)
    n = len(v[0])
    a = np.zeros((m, n))
    for k in range(K):
        uk = u[:, k].reshape(m, 1)
        vk = v[k].reshape(1, n)
        a += sigma[k] * np.dot(uk, vk)
    a[a < 0] = 0
    a[a > 255] = 255
    # a = a.clip(0, 255)
    return np.rint(a).astype('uint8')
def restore2(sigma, u, v, 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]
    a[a < 0] = 0
    a[a > 255] = 255
    return np.rint(a).astype('uint8')
if __name__ == "__main__":
    A = Image.open("..\\source\\picture\\lena.jpg", 'r')
    print(A)
    output_path = r'./SVD_Output'
    if not os.path.exists(output_path):
        os.mkdir(output_path)
    a = np.array(A)
    print(a.shape)
    K = 50
    u_r, sigma_r, v_r = np.linalg.svd(a[:, :, 0])
    u_g, sigma_g, v_g = np.linalg.svd(a[:, :, 1])
    u_b, sigma_b, v_b = np.linalg.svd(a[:, :, 2])
    plt.figure(figsize=(11, 9), facecolor='w')
    mpl.rcParams['font.sans-serif'] = ['simHei']
    mpl.rcParams['axes.unicode_minus'] = False
    for k in range(1, K+1):
        print(k)
        R = restore1(sigma_r, u_r, v_r, k)
        G = restore1(sigma_g, u_g, v_g, k)
        B = restore1(sigma_b, u_b, v_b, k)
        I = np.stack((R, G, B), axis=2)
        Image.fromarray(I).save('%s\\svd_%d.png' % (output_path, k))
        if k <= 12:
            plt.subplot(3, 4, k)
            plt.imshow(I)
            plt.axis('off')
            plt.title('奇异值个数:%d' % k)
    plt.suptitle('SVD与图像分解', fontsize=20)
    plt.tight_layout(0.3, rect=(0, 0, 1, 0.92))
    # plt.subplots_adjust(top=0.9)
    plt.show()
  • 效果可在文件中查看在这里插入图片描述

三、总结

  • svd是一种降维的方法,降维之后的数据能够还原为图片,在进行某些特征特征判别时,这种方法十分有用

四、参考资料

奇异值分解(Singular Value Decomposition,简称SVD)是一种数学方法,可以将一个矩阵分解为三个矩阵的乘积形式,通常用于降维、数据压缩和特征提取等领域。在利用Python图片进行奇异值分解时,我们可以按照以下步骤进行: 1. 导入必要的库和模块,例如numpy、matplotlib等。这些库将提供我们所需的功能和方法。 2. 读取图片文件。使用Python的图像处理库,例如PIL库,可以读取图片文件并将其转换为矩阵形式。这些库通常提供了将图片矩阵转换为灰度图的功能。 3. 对图片矩阵进行SVD分解。使用numpy库提供的SVD函数,对图片矩阵进行奇异值分解。该函数会返回三个矩阵,分别表示左奇异向量矩阵、奇异值矩阵和右奇异向量矩阵。 4. 根据需要选择保留的奇异值个数。根据奇异值的大小进行排序,选择保留的奇异值个数。通常可以通过设置一个阈值来决定保留的奇异值个数,较大的奇异值对应的信息量较大,可以更好地保留图像的特征。 5. 根据保留的奇异值个数,对三个矩阵进行切片。根据保留的奇异值个数,将三个矩阵切片得到新的矩阵。 6. 将新的矩阵进行SVD分解。使用numpy库提供的矩阵乘法函数,将逆SVD分解得到的三个矩阵合并为一张图像矩阵。 7. 将图像矩阵转换为图片文件。使用Python的图像处理库,例如PIL库,将图像矩阵转换为图片文件,并保存到指定的路径。 通过以上步骤,我们可以利用Python图片进行奇异值分解,并选择保留的奇异值个数,最终得到压缩后的图像文件。这样的操作可以在一定程度上减小图像文件的大小,同时保留了较多的图像特征。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值