import numpy as np
import matplotlib.pyplot as plt
from matplotlib.image import imread
# 1. Load an example image (grayscale)
img = imread("mai_phuong_thuy.jpg") # <-- replace with your image path
if img.ndim == 3: # convert to grayscale if RGB
img = img.mean(axis=2)
U, S, Vt = np.linalg.svd(img, full_matrices=False)
def compress_image(k):
"""
Reconstruct image using only top-k singular values
"""
Uk = U[:, :k]
Sk = np.diag(S[:k])
Vk = Vt[:k, :]
return Uk @ Sk @ Vk
# 3. Try different ranks
ranks = [60]
plt.figure(figsize=(12, 8))
# Original
plt.subplot(2, 3, 1)
plt.imshow(img, cmap='gray')
plt.title("Original")
plt.axis("off")
# Compressed versions
for i, k in enumerate(ranks, start=2):
compressed = compress_image(k)
plt.subplot(2, 3, i)
plt.imshow(compressed, cmap='gray')
plt.title(f"Rank {k}")
plt.axis("off")
plt.tight_layout()
plt.show()