问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

奇异值分解(SVD):从理论到图像压缩实战

创作时间:
作者:
@小白创作中心

奇异值分解(SVD):从理论到图像压缩实战

引用
51CTO
1.
https://blog.51cto.com/deephub/10784375

奇异值分解(SVD)是一种强大的线性代数技术,广泛应用于数据科学领域,特别是在图像压缩方面。本文将从数学原理出发,深入浅出地讲解SVD的工作机制,并通过Python代码演示如何使用SVD进行图像压缩。

奇异值分解的基本概念

奇异值分解(Singular Value Decomposition,简称SVD)可以将任意形状的矩阵分解成三个部分的乘积:U、S、V。原矩阵A可以表示为:

其中,A矩阵中的奇异值就是\Sigma矩阵中的对角线元素,它们是矩阵A的特征值的平方根,表示A矩阵在各个主方向上的拉伸程度。U矩阵是AAT的特征向量构成的正交矩阵,表示数据集在降维后的新的坐标系中的投影。V矩阵是ATA的特征向量构成的正交矩阵,表示每个数据点在降维后的新坐标系中的坐标。

数学原理

假设我们有一个矩阵A:

要计算 SVD,首先需要通过找到 AA^{T} 的特征值来计算奇异值。具体步骤如下:

  1. 计算矩阵 AA^{T} 的特征值和特征向量
  2. 计算矩阵 A^{T}A 的特征值和特征向量
  3. 将特征值的平方根作为奇异值
  4. 构建 U、S、V 三个矩阵

以一个具体的例子来说明:

通过计算得到:

最终得到SVD分解:

图像压缩实战

接下来,我们将使用Python代码演示如何使用SVD进行图像压缩。实验所用的图像如下:

导入库和读取图片

import requests
import cv2
import numpy as np
import matplotlib.pyplot as plt

img = cv2.imread('flower.bmp')
gray_image = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
gray_image = gray_image.astype(np.float64)

执行奇异值分解

U, s, V = np.linalg.svd(gray_image, full_matrices=False)

可视化奇异值

top_10_singular_values = s[:10]

plt.plot(range(1, len(s) + 1), s, 'r-')
plt.xlabel("Rankings")
plt.ylabel("Singular Values")
plt.title("Singular Values versus their Rankings")
plt.savefig("Singular_values_vs_rankings.png")
plt.show()

从图中可以看出,图像的大部分信息都集中在前几个奇异值中:

重建和显示图像

k_values = [10, 50, 100]

plt.figure(figsize=(12,6))

for i in range(len(k_values)):
    low_rank = U[:, :k_values[i]] @ np.diag(s[:k_values[i]]) @ V[:k_values[i], :]
    plt.subplot(2,3,i+1),
    plt.imshow(low_rank, cmap='gray'),
    plt.title(f"For K value = {k_values[i]}")
    plt.savefig("Reconstruction_with_k_values.png")

从重建的图像中可以看出,随着K值的增加,图像的清晰度逐渐提高:

总结

通过本文,我们了解了奇异值分解(SVD)的基本原理及其在图像压缩中的应用。SVD不仅是一种强大的数学工具,更是一个实用的数据处理方法,广泛应用于数据降维、图像压缩等领域。希望本文能帮助读者更好地理解这一重要概念。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号