Naszym drugim zadaniem będzie implementacja algorytmu pozwalającego na redukcję liczby kolorów w obrazie. Danymi wejściowymi będzie dla nas plik w formacie png, zawierający obraz w formacie RGB, oraz liczba kolorów (k, domyślnie 16), do których powinniśmy zredukować nasz obraz. Jako wynik zwracamy wynik redukcji, tj. nasz obraz wejściowy, ale przetworzony w taki sposób, że wszystkie piksele są w jednym z k kolorów.
Będziemy korzystać z dwóch znanych metod:
– grupowania k-średnich (przy pomocy biblioteki sklearn.cluster.KMeans)
– cieniowania przy pomocy metody Floyd’a Steinberg’a
Punktacja zadania:
– Napisanie programu, który pobiera parametry, wczytuje i zapisuje obrazy, przy pomocy funkcji z biblioteki PIL (3 pkt)
– grupowanie pikseli na k zadanych grup (wg k-średnich), obliczenie średnich wartości w każdej z grup, zamiana wartości pikseli na wartości średnie (4 pkt dla skali szarości, 6 pkt dla RGB – co ważne, klastrowanie w RGB musi być dla wszystkich składowych razem).
– cieniowanie zgodnie z algorytmem Floyd’a Steinberga (własna implementacja w pythonie) (3 pkt w skali szarości, 6 pkt w RGB).
Zadania wysyłamy do 28. kwietnia, jako plik .py z komentarzami i podpisem, i dopiskiem [ONA-2-2019] w temacie maila. Po terminie redukcja punktacji o 50%.
Chciałabym spytać, czy to jest efekt, o który nam chodzi:
https://i.imgur.com/KZEllvk.jpg
Wygląda nieźle. Warto sprawdzić dla jakiejś idiotycznie małej wartości k (np. 2), gdzie różnica pomiędzy cieniowaniem a jego brakiem powinna być wyraźniejsza.
Dla k = 2:
https://i.imgur.com/kfD2eWm.jpg
To wygląda dziwnie (tzn obrazek 2 ok, ale trzeci wykorzystuje więcej barw…)