Hej,

w ramach jesiennych wyzwań dostałem zestaw:

  • Namaluj dowolną techniką jesienny obraz

  • Wybierz się dowolnym środkiem transportu do pobliskiego miasta, w którym dawno nie byłeś i pokaż go z najciekawszej strony

  • Napisz list do samego siebie, który otworzysz za rok o tej porze

U mnie wybór padł na pierwszy punkt z małym twistem. Jako, że do duszy artystycznej mi daleko i byłoby to widać, to stwierdziłem, że podzielę się chociaż czymś ciekawym

Na załączonych obrazkach widać obraz "namalowany" techniką kompresji a następnie dekompresji zdjęcia metodą SVD.


Górne zdjęcie jest oryginałem, dolne po cyklu kompresja -> dekompresja. Oryginalny rozmiar zdjęcia (gdyby zapisać je wprost, piksel po pikselu, z trzema wartościami R, G i B) to 12712.50 KiB, a rozmiar po kompresji to 4372.81 KiB, co stanowi 34.40% rozmiaru oryginalnego. Na następnych zdjęciach widać poszczególne kanały R, G i B oraz to w jaki sposób zostały skompresowane przez algorytm.


Metoda kompresji SVD jest de facto metodą kompresji macierzy a nie obrazu, z tego względu plik wejściowy należy wstępnie przetworzyć rozbijając go na 3 kolory składowe. Tak uzyskane trzy macierze możemy skompresować każdą z osobna, przeprowadzając jej rozkład zgodnie ze wzorem z ostatniego zdjęcia. Sam rozkład SVD jednak nie pomaga nam przy kompresji, ponieważ jest to matematycznie równość, a zamiast przechować NxM danych, mamy teraz MxM (macierz U) + MxN (macierz Σ) + NxN (macierz Vᵀ). Na szczęście jednak wartości na przekątnej macierzy Σ spadają na tyle szybko, że możemy obciąć wszystkie trzy macierze zachowując tylko r najważniejszych wierszy i/lub kolumn. Właśnie w tym momencie następuje stratna kompresja obrazu (nie jesteśmy potem w stanie idealnie odtworzyć tego co było na wejściu).


Algorytm, który wygenerował poniższe zdjęcia dodatkowo najpierw oblicza rozkład przy użyciu SVD, a następnie decyduje czy nie byłoby korzystne rozbicie macierzy rekurencyjnie na cztery mniejsze, co podnosi skuteczność kompresji w momencie gdy dana macierz jest jednolita w lokalnym obszarze (wtedy brak jest rozbicia na fragmenty i mamy mniej wartości do przechowania) lub zróżnicowana pod względem wartości (wtedy następuje rozbicie aby możliwe było dokładniejsze zachowanie cech obrazu). Sposób tego podziału jest widoczny na czarnobiałych diagramach. Pokazuje to rozkład i udział każdego z kolorów w końcowym obrazie.


W efekcie przechowujemy trzy drzewa dla każdego koloru, gdzie w liściach (pojedyncza komórka na czarnobiałym podziale) znajdziemy informację o tym który konkretnie fragment obrazu jest przechowywany w danym liściu oraz macierze U, Σ i Vᵀ służące do odtworzenia tego właśnie fragmentu. W celu dekompresji tak zachowanego obrazu wystarczy odpowiednio przemnożyć wartości U, Σ i Vᵀ aby dzięki temu otrzymać rekonstrukcję wartości wejściowych i zapisać je w odpowiednim fragmencie buforu.


Więcej o tym można poczytać tutaj. Z tej strony pochodzi też obrazek objaśniający kroki kompresji obrazu.

P.S.

Rykoszetem "wykonałem" również zadanie drugie, bo zdjęcie (choć nie moje, dlatego odznaczam tylko punkt pierwszy :P), przedstawia jesienny park zdrojowy w Busku-Zdroju, moją rodzinną okolicę


#jesiennewyzwania #nauka #matematyka

4dd8f238-e036-4671-9822-fd6a9e8e819d
bf59bdd2-37a3-4d70-bda7-264aacd8e1e4
75940e8d-bd99-4343-80ee-ed8fc208a98b
8d1182bc-305b-4b7b-b94e-c8061cf84f4a
0301311b-96a8-4028-8868-44bdbdbc4994

Komentarze (9)

entropy_

@spalona_zarowka ciekawe, zostawiam komentarz żeby wrócić wieczorem i na spokojnie przeczytać

Felonious_Gru

@spalona_zarowka sorry, ale hejto tak kompresuje obrazki, że nie widać różnicy xD

spalona_zarowka

@Felonious_Gru tego się bałem 😆 Chciałem tak dobrać paramtery żeby ładnie było widać różny rozkład poszczególnych kolorów, jak będę miał moment to przygotuję wizualizację w której lepiej widać artefakty kompresji. Na ten moment możesz się przyjrzeć liściom na drzewach w samym centrum zdjęcia, tam widać charakterystyczne pionowe i poziome rozmazania

Felonious_Gru

@spalona_zarowka jak się mocno powiększy yo cos tam widać.

Sprobuj na imgur może

spalona_zarowka

@Felonious_Gru tym razem dla odmiany skompresowałem swoje własne zdjęcie (z wakacji, Bolonia, Włochy)

Pierwsze zdjęcie to 15.44% rozmiaru oryginalnego, drugie to 10.62% a trzecie 5.98%. Procentowo różnica niby niewielka, ale w jakości widać spadek jak na dłoni

d2246d60-52ec-4c85-91f9-ed2a97bed85b
752a7739-01eb-4c33-9e99-f4f55e232cb0
d33799a5-5415-4cd9-aa18-b69d7c234851
Felonious_Gru

@spalona_zarowka na telefonie całkiem skuteczna ta kompresja bo bez zoomu wszystkie dobre xd

sireplama

Hmm... Bardzo ciekawe, nic nie zrozumiałem.

spalona_zarowka

@sireplama to bardzo niedobrze bo znaczy to tyle że źle opisałem proces ciężko mi było uniknąć pewnie niektórych skrótów myślowych które są mniej lub bardziej oczywiste dla kogoś kto już po prostu temat zna

W takiej prostej analogii polega to na rozbiciu zapisu obrazu na pojedyncze liczby a potem rozbiciu tych liczb w sposób który zajmuje mniej miejsca w komputerze, np. 774367 to w przybliżeniu 770000 = 77*10⁴ (więc zamiast pamiętać 6 cyfr pamiętamy tylko trzy, bo 77 i 4 jako potęgę do której należy podnieść 10 jeśli przyjmiemy konwencję że zawsze zapisujemy kompresję w tej postaci) i w zależności od tego jak duże przybliżenie założymy, tak dużą kompresję otrzymamy

Tyle tylko że mnożymy macierze a nie liczby

Zaloguj się aby komentować