为什么在尝试使用 numpy.linalg 从奇异值分解重建图像时会得到荒谬值的矩阵?

Why do I get matrices of absurd values when trying to reconstruct an image from a singular value decomposition using numpy.linalg?

提问人:Александр Асратян 提问时间:6/4/2023 最后编辑:Александр Асратян 更新时间:6/4/2023 访问量:58

问:

我正在通过numpy.linalg对灰度图像(读取:大矩阵)进行奇异值分解。问题是,当我尝试从分解中重建图像时,我得到一个荒谬值的矩阵,这些值无法与源图像的像素相对应。谷歌没有给出任何关于可能是什么问题的答案,而且代码本身太简单了,编写它时不会犯任何错误。

代码和图像如下: image

import numpy as np
import matplotlib.pyplot as plt
from numpy.linalg import svd
from skimage.io import imread

img = imread(r'chain_small.JPG')
img = img.mean(axis=2)

U, S, VT = svd(img, full_matrices = False)

print(U @ np.diag(S) @ VT)

以下是连续三次运行时的三个输出:

1: [[ 159014.89394671   39487.99098681   -9874.57609635 ...  -71737.85515213
  -128874.27699761   -3386.92849387]
 [ 203461.80899605   75002.13673717  126260.20741683 ...  158491.47548145
   157982.81363556  137954.09746291]
 [ 293467.76004879  -90981.28699457  -28559.21588133 ...  -72627.56336045
   -57172.40331332  -25768.69870728]
 ...
 [  29835.15592901   20815.81893506   -5236.87874038 ...  -19871.19469429
    29210.33682942   15554.95475245]
 [-104265.48680219  -17915.06944458    5938.52625767 ...   15497.27973241
    -8433.1313703    -9386.58231012]
 [ -70906.08392422  -15034.78054189    5742.7956658  ...   -1110.09557333
   -13252.87395276  -19236.4320781 ]]

2: [[-1.40339175e+05  1.84856533e+03 -1.70047632e+04 ...  4.07286857e+04
   8.27626972e+04  8.77105170e+02]
 [ 9.23440572e+05  1.61186883e+03  7.16404929e+04 ... -1.41672490e+05
   3.35168593e+05 -4.94743352e+03]
 [ 2.29648889e+05  9.32584084e+04 -3.03421382e+04 ...  3.09541683e+05
   2.39098724e+04 -7.89459012e+03]
 ...
 [ 5.31486822e+04  2.55513683e+04 -5.36843672e+03 ... -4.51257913e+03
   1.40963817e+04  1.04165914e+04]
 [-5.33436869e+04 -1.47708525e+04  1.70761244e+04 ... -1.82554352e+04
  -4.00233256e+04 -5.65965532e+04]
 [-3.01219658e+04 -1.66921447e+04  1.73071052e+04 ... -3.37167442e+04
  -4.62436316e+04 -6.80044548e+04]]

3: [[ 170683.38688212   28358.22126302  -23356.74822456 ...   88247.14000447
   -25268.54838009  -59126.11297314]
 [ 548066.38756864  -65846.99861054   64624.47642912 ...   31491.42901022
   -24204.73172982   19110.93935304]
 [ 667140.05662532   39098.12090819   37824.13446388 ... -119091.87577846
   249393.0348422    54838.74200844]
 ...
 [  11244.29360774    5379.79454404   -8576.07360678 ...    4032.56408047
    28892.94580266    7560.6402372 ]
 [ -80855.17281102  -10303.81468742   14164.90681016 ...   17284.69756787
   -10799.40786149  -33744.18482325]
 [ -48865.0672561   -10991.37326434   13474.09716008 ...    1738.80247443
   -17218.39061216  -43756.29097246]]

对于问题和格式的愚蠢,我深表歉意,但我真的迷失在这一点上。

python 图像 numpy 图像压缩 svd

评论


答:

0赞 IlexAquiforum 6/4/2023 #1

代码中的“a”变量是什么?我无法测试代码,因为未定义“a”。怀疑在这个地方你需要img。

U, S, VT = svd(img, full_matrices = False)

相反

U, S, VT = svd(a, full_matrices = False)

评论

0赞 Александр Асратян 6/4/2023
你是对的,应该有“img”而不是“a”。它被定义为用于测试目的的 3x4 numpy 数组,程序很好地重建了它,这就是我知道代码本身没有问题的方式。我想我在这里复制和粘贴重要的代码时忘记更改它了,很抱歉。不过我没有更改任何其他内容,因此这适用于将“a”换成“img”。
0赞 Александр Асратян 6/4/2023 #2

问题已“解决”。仍然不确定是什么原因造成的,但我在另一台机器上运行了该程序,它运行良好。可能是 Python 或硬件的问题。