1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66
| import numpy as np import matplotlib.pyplot as plt from PIL import Image import requests from io import BytesIO import os
def download_load_image():
if not os.path.exists("lena.jpg"): url = "https://raw.githubusercontent.com/opencv/opencv/master/samples/data/lena.jpg" response = requests.get(url) img = Image.open(BytesIO(response.content)) img.save("lena.jpg")
else: img = Image.open("lena.jpg") return np.array(img)
def rgb_to_grayscale(rgb_img): return np.dot(rgb_img[...,:3], [0.299, 0.587, 0.114])
def svd_compress(image, k): U, s, Vt = np.linalg.svd(image, full_matrices=False) return U[:,:k] @ np.diag(s[:k]) @ Vt[:k,:]
lena_rgb = download_load_image() lena_gray = rgb_to_grayscale(lena_rgb) / 255.0
if lena_gray.shape != (512, 512): from PIL import Image img_pil = Image.fromarray((lena_gray * 255).astype(np.uint8)) lena_gray = np.array(img_pil.resize((512, 512))) / 255.0
plt.figure(figsize=(20, 10))
plt.subplot(2, 4, 1) plt.imshow(lena_gray, cmap='gray') plt.title("Original Image") plt.axis('off')
k_values = [1, 5, 10, 20, 30, 50, 100]
for i, k in enumerate(k_values): compressed_img = svd_compress(lena_gray, k)
position = i + 2 plt.subplot(2, 4, position) plt.imshow(compressed_img, cmap='gray') plt.title(f"top {k} singular values", fontsize=12) plt.axis('off')
plt.tight_layout() plt.show()
|