﻿

# SVD Compression

Nov 28th, 2020 (edited)
505
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
1. """
2. Created on Tue Oct 27 12:31:49 2020.
3.
4. @author: manoj
5. """
6. import numpy as np
7. import matplotlib.pyplot as plt
8. import scipy.linalg as scipy_linalg
9. import skimage.io
10.
11.
12. def compress_svd(image, bw, color):
13.     U, s, Vt = scipy_linalg.svd(image, full_matrices=False)
14.     inspect_svalues(s, color)
15.     recon_image = U[:, 0:bw] @ scipy_linalg.diagsvd(s[0:bw], bw, bw) @ Vt[0:bw, :]
16.     return recon_image
17.
18.
19. def inspect_svalues(svals, color):
20.     plt.plot(svals)
21.     plt.xticks(list(range(0, 501, 40)))
22.     plt.xlabel("Index of Singular Value")
23.     plt.ylabel("Magnitude of Singular Value")
24.     plt.title("Singular Values of {0} Channel".format(color))
25.     plt.show()
26.
27.
28. def see_imgs(img1, img2, rank, color='gray'):
29.     fig, axs = plt.subplots(1, 2)
30.     axs[0].imshow(img1, cmap=color)
31.     axs[0].set_title("Original image")
32.     axs[1].imshow(img2, cmap=color)
33.     axs[1].set_title("Compressed image to rank = {0}".format(rank))
34.     plt.suptitle("Image compression using Singular Value Decomposition", y=0.82)
35.     plt.show()
36.
37.
38. eff_rank = 40
39.
40. img = skimage.io.imread(fname="./img_for_q3.bmp")
41. olayers = [img[:, :, i].astype(np.double) for i in range(3)]
42. clayers = [compress_svd(olayers[i], eff_rank, c).astype(np.uint8) for i, c in enumerate(["Red", "Green", "Blue"])]
43. re_img = np.dstack(clayers)
44.
45. see_imgs(img, re_img, eff_rank)
46. [see_imgs(olayers[i], clayers[i], eff_rank, color=cl) for i, cl in enumerate(['Reds_r', 'Greens_r', 'Blues_r'])]
RAW Paste Data