Show code cell source
import numpy as np;
from scipy.linalg import svd;
from PIL import Image;
import matplotlib.pyplot as plt;
import requests;
%matplotlib inline
4.5. Primjene#
Osim u problemima najmanjih kvadrata, alati i pojmovi koje smo spomenuli i prošlim lekcijama koriste se i u nekim neuobičajenim primjerima. Pokazat ćemo ih nekoliko.
Komprimiranje slika#
Teorem 4.11 pokazuje nam da se da za neku matricu kojoj nam nije bitan njezin original nego neka aproksimacija možemo uštedjeti mnogo memorije ukoliko pamtimo skraćeni zapis SVD-a njezine aproksimacije nižeg ranga. Pokažimo to na primjeru komprimiranja slika.
Slike su u računalu u pravilu reprezentirane trima matricama (svaka čuva informacije o jednoj od RGB boja) kojima dimenzije ovise o razlučivosti (pikseli). Radi jednostavnosti, fokusirajmo se na one crno-bijele (tj. one u nijansama sive). Neka je ta slika/matrica \(A\) dimenzije \(M \times N\), i neka je \(r \ll M,N\) rang aproksimacijske matrice. Umjesto čuvanja \(M\times N\) podataka originalne slike, u računalu možemo spremiti samo prvih \(r\) stupaca matrica \(U\) i \(V\) iz singularne dekompozicije matrice \(A\) zajedno s njihovih \(r\) najvećih singularnih vrijednosti, što znači da bismo pamtili \(r\cdot (M+N+1)\) podataka. Za jako male \(r\) ušteda je velika, ali je velika i razlika između originalne slike i aproksimativne. Ipak, moguće je izabrati neke \(r\) za koje štedimo, a greška aproksimacije nije loša.
Uzmimo crno-bijelu verziju slike s naslovnice weba PMF-MO , i pogledajmo kako izgledaju aproksimacije te slike matricama različitih rangova.
Show code cell source
# Učitavanje slike, pretvorba u crno bijelu, i spremanje u matricu A.
img_url = 'https://www.pmf.unizg.hr/_pub/carousel/8f883877aae0193238e6c9aa6ccb439d1633939087.jpg';
img = Image.open( requests.get(img_url, stream = True).raw ).convert('L');
A = np.asarray(img);
memory_A = A.shape[0] * A.shape[1];
print( f'Dimenzije slike / matrice A: {A.shape[0]} x {A.shape[1]}' );
print( f'Originalna slika zauzima: {memory_A} doubleova' );
# SVD originalne slike/matrice.
(U, S, Vt) = svd(A);
# Graf singularnih vrijednosti.
plt.figure();
plt.semilogy( S );
plt.title( 'Singularne vrijednosti matrice A' );
plt.xlabel( 'k' );
plt.ylabel( '$\sigma_k$' );
# Rangovi na koje komprimiramo sliku / matricu A.
ranks = [10, 50, 200, 715];
print( 'Komprimirane slike: ' );
for i in range(len(ranks)):
r = ranks[i];
# Skraceni SVD
S_r = np.diag(S[:r]);
U_r = U[:, :r];
Vt_r = Vt[:r,:];
# Aproksimacija slike
X = U_r @ S_r @ Vt_r;
# Vrijednosti van intervala [0, 255] treba vratiti u interval.
X[X < 0] = 0;
X[X > 255] = 255;
# Memorijsko zauzeće.
memory_X = (U_r.shape[0] + 1 + Vt_r.shape[1]) * r;
compression = memory_X / memory_A;
# Konverzija iz matrice u sliku.
compressed_img = Image.fromarray( X.astype(np.uint8) );
# Relativna greška aproksimacije = sigma_{r+1} / sigma_1.
if( r < S.shape[0] ):
rel_err = S[r] / S[0];
else:
rel_err = 0;
print(f" Rang: {r:3d}; slika zauzima: {memory_X:8d} doubleova ({100*compression:6.2f}% originalne); rel. greška: {rel_err:.4f}.")
plt.figure();
plt.imshow( compressed_img, cmap='gray');
plt.title( f'rank={r}' );
plt.figure();
plt.imshow( img, cmap='gray');
plt.title( f'Original' );
Dimenzije slike / matrice A: 715 x 1920
Originalna slika zauzima: 1372800 doubleova
Komprimirane slike:
Rang: 10; slika zauzima: 26360 doubleova ( 1.92% originalne); rel. greška: 0.0714.
Rang: 50; slika zauzima: 131800 doubleova ( 9.60% originalne); rel. greška: 0.0304.
Rang: 200; slika zauzima: 527200 doubleova ( 38.40% originalne); rel. greška: 0.0134.
Rang: 715; slika zauzima: 1884740 doubleova (137.29% originalne); rel. greška: 0.0000.






Vidimo da singularne vrijednosti matrice \(A\) u početku vrlo brzo padaju. Ako uzmemo aproksimaciju \(X\) ranga \(r=50\), onda relativna greška iznosi \(\frac{\|A - X\|_2}{\|A\|_2} = \frac{\sigma_{51}}{\sigma_1} \approx 0.0304\), pa se komprimirana slika razlikuje od originalne u samo \(\approx 3\%\).
Literatura#
Lars Eldén. Matrix methods in data mining and pattern recognition. Volume 4 of Fundamentals of Algorithms. Society for Industrial and Applied Mathematics (SIAM), Philadelphia, PA, 2007. ISBN 978-0-898716-26-9. URL: https://doi.org/10.1137/1.9780898718867, doi:10.1137/1.9780898718867.