java - SVD、奇异值分解后矩阵值增加

标签 java image image-processing svd

我正在尝试学习用于图像处理的 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行。

最佳答案

其实我问了a question最近在 Kaggle 上就像这样。希望它与您的计算机视觉问题相关...不过,我不明白的一件事是您如何在 S 截断后重建 A' .据我了解,当您的 k=1 时,截断的对角矩阵将如下所示:

21.57942    0.00000    0.00000
0.00000     0.00000    0.00000
0.00000     0.00000    0.00000
0.00000     0.00000    0.00000

A'A 的近似值可能没有更多错误的低能量奇异值,可以通过 A' = US 重建'Vt。这是我对 A' 的结果:

5.268951 3.914582 3.557461
8.753958 6.503777 5.910449
9.796523 7.278353 6.614362
5.617932 4.173858 3.793084

当您认为 UVt 都具有负值时,为什么有些值高于原始 A 矩阵是有道理的当您乘以新的 S 矩阵时,它们现在被清零了。

使用附加资源进行编辑:检查 this question也出来了。

关于java - SVD、奇异值分解后矩阵值增加,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33087744/

相关文章:

java - ImageView 留下不需要的顶部/底部边距/填充

java - servlet 过滤器无法处理 tomcat 中的虚拟目录

java - 如何检查两列是否相同/不相等?

html - Srcset 渲染图像大小错误

ios - IOS模拟器中的硬件加速框架是否反射(reflect)了它在真正的iphone上的作用?

java - RGB channel 之间切换

c++ - 为什么使用 cv::line 函数绘制的不同线条具有不同的透明度 (alpha) 级别?

java - 如何使 SVG 在 Android 中可点击?

php - 在网络服务器上存储多种尺寸的图像或调整当前图像的大小

javascript - 在使用javascript加载页面之前从数组中缓存动态图像