Sunday, June 12, 2022

Singular Value Decomposition Exercise (Python)

 Декомпозиция сжатого изображения с использованием SVD
















(.env) boris@boris-All-Series:~/MATPLOTLIBSR/SVD$ cat testSVD1.py
import matplotlib.pyplot as plt
import matplotlib.image as mpimg
import numpy as np

img_eg = mpimg.imread("./car.jpg")
print(img_eg.shape) #Operation results: (400,640,3)


#Converting image data into two-dimensional matrix and singular value decomposition
img_temp = img_eg.reshape(400, 640 * 3)
U,Sigma,VT = np.linalg.svd(img_temp)

# Take the first 10 singular values
sval_nums = 10
img_restruct1 = (U[:,0:sval_nums]).dot(np.diag(Sigma[0:sval_nums])).dot(VT[0:sval_nums,:])
img_restruct1 = img_restruct1.reshape(400,640,3)
img_restruct1.tolist()

# Take the first 50 singular values
sval_nums = 50
img_restruct2 = (U[:,0:sval_nums]).dot(np.diag(Sigma[0:sval_nums])).dot(VT[0:sval_nums,:])
img_restruct2 = img_restruct2.reshape(400,640,3)

# Take the first 100 singular values
sval_nums = 100
img_restruct3 = (U[:,0:sval_nums]).dot(np.diag(Sigma[0:sval_nums])).dot(VT[0:sval_nums,:])
img_restruct3 = img_restruct3.reshape(400,640,3)

#Exhibition
fig, ax = plt.subplots(nrows=1, ncols=3)
ax[0].imshow(img_restruct1.astype(np.uint8))
ax[0].set(title = "10")
ax[1].imshow(img_restruct2.astype(np.uint8))
ax[1].set(title = "50")
ax[2].imshow(img_restruct3.astype(np.uint8))
ax[2].set(title = "100")
plt.show()


Видно, что первые 50 или 100 собственных значений могут быть использованы для восстановления изображения, что экономит много места по сравнению с исходным изображением (400 собственных значений).

Прямое сингулярное разложение матрицы









(.env) boris@boris-All-Series:~/MATPLOTLIBSR/SVD$ cat directSVD1.py
import numpy as np
#Create A
A = np.array([[1,5,7,6,1],[2,1,10,4,4],[3,6,7,5,2]])

#Direct singular value decomposition using np.linalg.svd() function
#The function has three return values: left singular matrix,
# all singular values and right singular matrix.

U,Sigma,VT = np.linalg.svd(A)

#Exhibition

print(U)
print("\n")
print(Sigma)
print("\n")
print(VT)
(.env) boris@boris-All-Series:~/MATPLOTLIBSR/SVD$ python3 directSVD1.py
[[-0.55572489  0.40548161 -0.72577856]
 [-0.59283199 -0.80531618  0.00401031]
 [-0.58285511  0.43249337  0.68791671]]


[18.53581747  5.0056557   1.83490648]


[[-0.18828164 -0.37055755 -0.74981208 -0.46504304 -0.22080294]
 [ 0.01844501  0.76254787 -0.4369731   0.27450785 -0.38971845]
 [ 0.73354812  0.27392013 -0.12258381 -0.48996859  0.36301365]
 [ 0.36052404 -0.34595041 -0.43411102  0.6833004   0.30820273]
 [-0.5441869   0.2940985  -0.20822387 -0.0375734   0.7567019 ]]

References





No comments:

Post a Comment