【发布时间】:2016-01-10 07:45:02
【问题描述】:
我正在尝试学习用于图像处理的 SVD...比如压缩。
我的方法:使用 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 的第 1 列和第 2 列,vt1 和 vt2 是 V 的第 1 和 2 行。
【问题讨论】:
标签: java image image-processing svd