Generate-a-compressed-approximation-of-an-image-using-matrix-decomposition-from-linear-algebra
In [46]:
import matplotlib.pyplot as plt
import numpy as np
In [14]:
img = plt.imread('ax.jpg')
In [16]:
plt.imshow(img)
Out[16]:
In [47]:
img.shape
Out[47]:
In [48]:
img.ndim
Out[48]:
In [49]:
img[:, :, 0]
Out[49]:
In [50]:
img[:, :, 0].shape
Out[50]:
In [51]:
img_array = img / 255
In [52]:
img_array.max(), img_array.min()
Out[52]:
In [53]:
img_array.dtype
Out[53]:
In [54]:
red_array = img_array[:, :, 0]
green_array = img_array[:, :, 1]
blue_array = img_array[:, :, 2]
In [55]:
from numpy import linalg
In [56]:
img_gray = img_array @ [0.2126, 0.7152, 0.0722]
In [57]:
img_gray.shape
Out[57]:
In [58]:
plt.imshow(img_gray, cmap="gray")
Out[58]:
In [59]:
U, s, Vt = linalg.svd(img_gray)
In [60]:
U.shape, s.shape, Vt.shape
Out[60]:
In [64]:
Sigma = np.zeros((173, 173))
for i in range(173):
Sigma[i, i] = s[i]
In [69]:
plt.plot(s)
Out[69]:
In [70]:
k = 10
In [72]:
approx = U @ Sigma[:, :k] @ Vt[:k, :]
In [73]:
plt.imshow(approx, cmap="gray")
Out[73]:
In [74]:
img_array.shape
Out[74]:
In [76]:
img_array_transposed = np.transpose(img_array, (2, 0, 1))
img_array_transposed.shape
Out[76]:
In [77]:
U, s, Vt = linalg.svd(img_array_transposed)
In [78]:
U.shape, s.shape, Vt.shape
Out[78]:
In [84]:
Sigma = np.zeros((3, 173, 307))
for j in range(3):
np.fill_diagonal(Sigma[j, :, :], s[j, :])
In [87]:
reconstructed = U @ Sigma @ Vt
reconstructed.shape
Out[87]:
In [86]:
plt.imshow(np.transpose(reconstructed, (1, 2, 0)))
Out[86]:
In [88]:
approx_img = U @ Sigma[..., :k] @ Vt[..., :k, :]
In [89]:
approx_img.shape
Out[89]:
In [90]:
plt.imshow(np.transpose(approx_img, (1, 2, 0)))
Out[90]:
Comments
Post a Comment