Warning: file_put_contents(accesssvd.log): failed to open stream: Permission denied in /srv/beegfs/web/html/kozlik/linalg2/svd.php on line 20
Andrew Kozlík @

Ztrátová komprese obrázku pomocí singulárního rozkladu


Následující obrázky byly vytvořeny pomocí programu GNU Octave posloupností příkazů:

im = double(imread("barn256.png"));
[U,S,V] = svd(im);
for s = [1, 2, 4, 8, 16, 32, 64, 128]
  im = U( : , 1:s) * S(1:s, 1:s) * V( : , 1:s)';
  imwrite(uint8(im), ["barn" num2str(s, "%03d") ".png"]);
endfor

Původní obrázek je reprezentován jako matice typu 256×341, kde každá složka udává jas příslušného pixelu. Tato matice hodnosti 256 se potom aproximuje maticí nižší hodnosti s = 1, 2, 4, …, 128. Výsledkem jsou obrázky níže. Z matice nižší hodnosti bychom mohli následně spočítat skeletní rozklad, a ten uložit do souboru jako s(256 + 341 − s) skalárů. Tímto lze docílit menší velikosti souboru, než když je obrázek uložen jednoduše jako 256 ⋅ 341 skalárů.

Hodnost matice 1, velikost skeletního rozkladu 0,7 % :

barn001

Hodnost matice 2, velikost skeletního rozkladu 1,4 % :

barn002

Hodnost matice 4, velikost skeletního rozkladu 2,7 % :

barn004

Hodnost matice 8, velikost skeletního rozkladu 5,4 % :

barn008

Hodnost matice 16, velikost skeletního rozkladu 10,6 % :

barn001

Hodnost matice 32, velikost skeletního rozkladu 20,7 % :

barn002

Hodnost matice 64, velikost skeletního rozkladu 39,1 % :

barn004

Hodnost matice 128, velikost skeletního rozkladu 68,8 % :

barn128

Hodnost matice 256, velikost skeletního rozkladu 100 % :

barn256