我正在尝试学习SVD以进行图像处理,如压缩。
我的方法是:使用ImageIO将图像作为BufferedImage获取...获取RGB值并使用它们来获取等效的灰度值(位于0-255之间),并将其存储在double[][]数组中。然后在SVD中使用该数组进行压缩。
我正确地获得了USV矩阵...希望如此。 从AATranspose(AAT)获得U,从ATA获得V。
让我举个例子 A是我的原始矩阵。
我的方法是:使用ImageIO将图像作为BufferedImage获取...获取RGB值并使用它们来获取等效的灰度值(位于0-255之间),并将其存储在double[][]数组中。然后在SVD中使用该数组进行压缩。
我正确地获得了USV矩阵...希望如此。 从AATranspose(AAT)获得U,从ATA获得V。
让我举个例子 A是我的原始矩阵。
A = 7.0 3.0 2.0
9.0 7.0 5.0
9.0 8.0 7.0
5.0 3.0 6.0
U = -0.34598 -0.65267 -0.59969 -0.30771
-0.57482 -0.27634 0.26045 0.72484
-0.64327 0.21214 0.44200 -0.58808
-0.36889 0.67280 -0.61415 0.18463
S = 21.57942 0.00000 0.00000
0.00000 3.35324 0.00000
0.00000 0.00000 2.02097
0.00000 0.00000 0.00000
VT = -0.70573 -0.52432 -0.47649
-0.53158 -0.05275 0.84536
-0.46838 0.84989 -0.24149
现在我需要进行外积扩展,为了压缩一些项,我将略去一些项,我们称这些被截断的项为 k
。
当我令 k = 1,并在奇异值上进行外积扩展时,我得到了以下作为我的新矩阵:
B = 6.43235 4.03003 1.70732
9.24653 6.55266 5.12711
9.41838 7.24083 7.21571
4.41866 4.05485 5.70027
您可以看到,B 中的某些值(我认为应该是 SVD 后的最终矩阵)大于我的原始矩阵。
A 只是一个测试矩阵。我稍后会尝试压缩灰度图像,在那里值必须是 0-255。任何 > 255 都对我没有帮助。
我错在哪里了?
编辑:k
是我要截断的项数。因此,当我说 k = 1
时,我将重建以下矩阵:
A = u1 * S11 * vt1 + u2 * S22 + vt2
这里的u1和u2是U矩阵的第一列和第二列,vt1和vt2是V矩阵的第一行和第二行。
V
矩阵截断。 - TayTay