图片尺寸缩小

Picture dimension reduction

提问人:Igor 提问时间:7/2/2023 最后编辑:desertnautIgor 更新时间:7/3/2023 访问量:73

问:

我需要通过奇异值分解来减少我的图片尺寸。

我已经看到了很多关于这个主题的来源。他们建议使用以下方法:

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, :]

这应该将图像的大小减小到 .但是图像的大小是相同的,因为 和 保持不变。我能做些什么?xm * nU.shape[0]V.shape[1]

蟒蛇 numpy svd

评论

0赞 chrslg 7/2/2023
我很想知道你到底想做什么。我认为你不只是在试图降低分辨率(在这种情况下,这根本不是人们在谈论“降维”时所想到的)。
0赞 chrslg 7/2/2023
了解SVD(或PCA)的作用很重要:它在一堆向量中找到冗余(或准冗余),并利用它用更少的数据(在小于所有向量空间的子空间中)表示它们。因此,如果你有向量 ,并且 ,它利用了第 3 个向量是前两个向量之和的事实,允许您使用前两个向量的唯一信息“编码”这 3 个向量,并利用它们构建第 3 个向量(这里是向量)的方法。[1,2,3,4,5,6,7,8]0,1,0,1,0,1,0,11,3,3,5,5,7,7,9[1,1]
0赞 chrslg 7/2/2023
这并不完全是 SVD 中的工作方式。但就其核心而言,它是它所依赖的:由所有向量组成的矩阵的秩小于 ,或者至少存在一个非常相似的矩阵,但秩更小,也就是说,它存在一些列的线性组合,这些列为 0(或几乎如此)。n
0赞 chrslg 7/2/2023
所以,总而言之:当使用 SVD 来减少矩阵的维度时,你在这里所依赖的(参见 @Daraan 关于如何减少的答案)是矩阵的列(或行,一起)上的冗余。我真的不确定这是否可以很好地应用于由图像像素组成的矩阵。人们通常不会将图像视为一堆非常相似的行。潜在的重复模式实际上并不成行。
0赞 chrslg 7/2/2023
SVD 在减少维度方面的一个更现实的用法可能是,例如,减少色彩空间的维度。您有一张 m×n×3 彩色图像。将其展平为 (mn)×3 2D 数组。然后,使用 SVD 尝试找到一个更紧凑的色彩空间(如果您的图像实际上是以 RGB 编码的黑白或棕褐色图像,它会很好地工作)。或者,如果你有一个高光谱图像,并且想减少它,毕竟,人类的视觉皮层就是这样。

答:

1赞 Daraan 7/2/2023 #1

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

为此,您只使用两个矩阵:

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

你同样可以用 V 来做到这一点,这是一种简化。 在考虑表格数据时,这样做不是减少特征,而是减少样本。


通过使用另一个矩阵,您可以重建原始数据 - 根据 x 会有一些误差。此重构数据是具有秩 x低秩近似值。

img_reconstructed = img_cut @ V[:x, :]

评论

0赞 Igor 7/2/2023
但是,例如,如果我有一张尺寸为 256 * 256 的图像。列和行具有相同的含义。如果我这样做:img_cut = U[:, :x] @ np.diag(S[:x, :x]),那么我只减少了社区。但我想保留 4 个主成分并拥有矩阵 4 * 4。我必须减少两个维度:行和列。我可以做这样的事情吗?(我意识到,这几乎永远是对的) imc_cut = U[:4, :4] @ S[:4, :4] @ V[:4, :4]
0赞 Daraan 7/2/2023
好吧,你可以得到一个方形矩阵,就像你说的。但据我所知,这不是 SVD 的用例。您必须尝试它是否对您的情况有用。U[:x, :x] @ np.diag(S[:x, :x]) @ V[:x,:x]
1赞 V. Mikaelian 7/3/2023 #2

The SVD decomposition of a matrix A does not change the dimensions of A. And it wouldn't be a valuable thing to just reduce and image size, for, it would reduce the image quality. But we want to preserve image quality!

Instead, the SVD decomposition A = U Σ V^T means that we keep the same dimension for A, but we can replace three matrices U, Σ, V by much smaller matrices U_r, \Sigma_r, V_r which require much less numbers to write, but the product A_r = U_r Σ_r V_r^T of which is very close to our original matrix A.

These lecture notes explain the thing in detail: https://www.researchgate.net/publication/318066716_Linear_Algebra_Theory_and_Algorithms?o=Linear_Algebra

In particular, please see Section 38.2 and Section 41.1 (this section deals with images exactly!).