numpy 图像降维

6za6bjd0  于 2023-08-05  发布在  其他
关注(0)|答案(2)|浏览(110)

我需要通过 * 奇异值分解 * 来降低我的图片维度。
我看过很多关于这个主题的资料。他们建议使用以下方法:

m, n = img.shape
U, S, V = np.linalg.svd(img)
#U.shape = m * m; S.shape = m * n; V.shape = n * n
img_cut = U[:, :x] @ np.diag(S[:x, :x]) @ V[:x, :]

字符串
这应该将图像的大小减小到x。但是图像的大小将是相同的m * n,因为U.shape[0]V.shape[1]保持相同。我该怎么办?

tgabmvqs

tgabmvqs1#

正如你已经意识到的,维度是相同的。SVD的原理是将矩阵分解为三个部分M=USV^T。通过只使用前 x 个奇异向量和值,您可以将数据点减少到x维。
为此,您只需使用两个矩阵:

img_cut = U[:, :x] @ np.diag(S[:x, :x])

字符串
你也可以用V来做,这是一个减少。当考虑表格数据时,这样做不是减少特征,而是减少样本。
通过使用另一个矩阵,您可以重建原始数据-根据 x 有一些误差。该重构数据是具有秩 x 的 * 低秩近似 *。

img_reconstructed = img_cut @ V[:x, :]

pqwbnv8z

pqwbnv8z2#

矩阵 A 的SVD分解不改变 A 的维数。这将是一个没有价值的事情,只是减少和图像的大小,因为,它会降低图像质量。但我们希望保持图像质量!
相反,SVD分解 A = U Σ V^T 意味着我们对 A 保持相同的维数,但是我们可以用更小的矩阵 U_r\Sigma_rV_r 来替换三个矩阵 UΣV,它们需要更少的数字来写,但是乘积 A_r = U_r Σ_r V_r^T 非常接近我们的原始矩阵 A
这些课堂笔记详细解释了这件事:https://www.researchgate.net/publication/318066716_Linear_Algebra_Theory_and_Algorithms?o=Linear_Algebra
具体请参见
第38.2节第41.1节**(本节专门讨论图像!).

相关问题