提问人:Александр Асратян 提问时间:6/4/2023 最后编辑:Александр Асратян 更新时间:6/4/2023 访问量:58
为什么在尝试使用 numpy.linalg 从奇异值分解重建图像时会得到荒谬值的矩阵?
Why do I get matrices of absurd values when trying to reconstruct an image from a singular value decomposition using numpy.linalg?
问:
我正在通过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]]
对于问题和格式的愚蠢,我深表歉意,但我真的迷失在这一点上。
答:
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 或硬件的问题。
评论