Mapy bitowe
Mapa bitowa (BMP) to w zasadzie to, co opisujesz, tablica liczb reprezentujących kolory pikseli. Np. Coś takiego
1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1
Kompresja bezstratna
Teraz zdefiniujmy schemat kompresji. W naszym schemacie kompresji będziemy mieli tablicę par liczb. Na przykład
3, 1, 1, 0, 7, 1
Pierwszą rzeczą, na którą chcę zwrócić uwagę, jest to, że ten schemat kompresji reprezentuje te same piksele, co pierwsza tablica. Pierwsza tablica ma trzy 1, a następnie pojedyncze 0, a następnie siedem 1. I to właśnie reprezentujemy tutaj. Ten format jest krótszy, ponieważ reprezentuje wiele pikseli z dwiema liczbami. Format bitmapy musi zawierać jedną liczbę dla każdego piksela.
Oczywiście jest to nieco uproszczony widok obrazu (np. Tylko jeden wiersz) i schemat kompresji. Ale mam nadzieję, że pozwoli to zobaczyć, jak schemat kompresji zmienia format obrazu. W ten sposób GIF odnosi się do BMP. GIF stosuje schemat kompresji o nazwie Lempel-Ziv-Welch zamiast tego uproszczonego.
Opisaliśmy tutaj bezstratny schemat kompresji. Problem z bezstratnymi schematami kompresji polega na tym, że w przypadku niektórych danych wejściowych zakodowana postać może być dłuższa niż oryginał. Np. Dla
1, 0, 1, 0, 1
Kodowanie to
1, 1, 1, 0, 1, 1, 1, 0, 1, 1
To było bezużyteczne. Wprowadziliśmy dane dwa razy dłużej.
Kolejna bezstratna kompresja
Rozważmy teraz inny schemat kompresji. W tym przedstawimy obraz jako nałożone koła. Dla każdego koła zdefiniujemy środek, promień i kolor.
Nasza pierwsza bitmapa stałaby się
5, 5, 1, 3, 0, 0
Jest to ta sama długość, co nasza pierwsza metoda kompresji.
Nasza druga może być również
2, 2, 1, 2, 1, 0, 2, 0, 1
Są to trzy koła wyśrodkowane na środkowym elemencie (który w liczeniu komputerowym ma numer 2, ponieważ komputery zaczynają odliczać od 0). Jedno koło ma promień 2 i kolor 1. Następnie dodajemy okrąg koloru 0 i promień 1. Na koniec mamy okrąg koloru 1 i promień 0. W krokach byłoby to
1, 1, 1, 1, 1
1, 0, 0, 0, 1
1, 0, 1, 0, 1
Lub
2, 2, 1, 1, 0, 0, 3, 0, 0
Jest to ten sam początkowy okrąg, ale pokryty dwoma okręgami punktowymi. To będzie krok po kroku
1, 1, 1, 1, 1
1, 0, 1, 1, 1
1, 0, 1, 0, 1
Oba są o jeden krótsze niż pierwsza zakodowana wersja, ale wciąż dłuższe niż oryginał.
Możesz się zastanawiać, dlaczego mówię o kręgach, a nie o zakresach. Głównym powodem jest to, że koła są bliższe temu, co wykorzystują rzeczywiste obrazy dwuwymiarowe.
Kompresja stratna
Mamy również koncepcję stratnych schematów kompresji. Te bezstratne schematy kompresji można przywrócić do oryginalnej tablicy bitmap. Schematy kompresji stratnej mogą nie być odwracalne.
Rozważmy stratną wersję naszej metody kręgów. W tym zastosujemy prostą zasadę. Nie będziemy przechowywać żadnych okręgów o promieniu mniejszym niż 1. Tak więc w naszych dwóch ostatnich kodowaniach mielibyśmy
2, 2, 1, 2, 1, 0
i
2, 2, 1
które ponownie przekonwertowały na piksele
1, 0, 0, 0, 1
i
1, 1, 1, 1, 1
Pierwsza wersja jest tylko o jeden element dłuższa niż oryginał. Druga wersja jest krótsza. Oba są poprawne, więc algorytm może dowolnie opracować oba i wybrać krótszy.
Opisujemy obrazy z bardziej restrykcyjnymi regułami jako niskiej jakości.
Ta reprezentacja obrazów jako nakładanych kolekcji okrągłych kształtów jest podobna do działania Joint Photographic Experts Group lub formatu JPEG . Jego kształty są raczej elipsami niż okręgami, ale idea jest podobna. Zamiast naszej uproszczonej metody wykorzystuje dyskretną transformację kosinusową do kodowania obrazów.
W przeciwieństwie do GIF, JPEG jest w rzeczywistości innym sposobem reprezentacji obrazu. GIF to nadal piksele. Są po prostu przechowywane w inny sposób. JPEG to kształty. Aby wyświetlić JPEG, przekształcamy kształty w piksele, ponieważ tak działają ekrany. Teoretycznie moglibyśmy opracować ekran, który nie działałby w ten sposób. Zamiast pikseli może tworzyć kształty, które lepiej pasują do formatu JPEG. Oczywiście na tym ekranie nie byłyby wyświetlane mapy bitowe. Aby wyświetlić BMP lub GIF, musielibyśmy przekonwertować na JPEG.
Jeśli konwertujesz standardowy plik GIF, powiedzmy 300 x 300 pikseli, konwertujesz go na JPEG i obniżasz jakość, podstawowe kształty, których używa, powinny być widoczne. Wiele plików JPEG pozwala uniknąć tych artefaktów, zaczynając od obrazu o znacznie wyższej rozdzielczości.
Pliki JPEG skalują się dobrze, ponieważ są kształtami, a nie pikselami. Jeśli więc zaczniesz od obrazu o wymiarach 8000 x 8000, przekonwertuj go na JPEG i wyświetl jako obraz o wymiarach 300 x 300, większość utraconych szczegółów i tak zostałaby utracona. Jeśli najpierw przekształcisz mapę bitową 8000 x 8000 w mapę bitową 300 x 300, a następnie w JPEG, wyniki będą często niższej jakości.
MPEG
Rozmawialiśmy o zdjęciach. Grupa Moving Picture Experts lub format MPEG używa tego samego rodzaju kompresji co JPEG, ale robi też coś innego. Podczas gdy prostym sposobem robienia wideo jest wysyłanie sekwencji nieruchomych obrazów, MPEG faktycznie wysyła ramkę, po której następuje pewna liczba zmian listy zmian i kończy się ramką końcową. Ponieważ większość ramek jest podobnych do poprzedniej, lista zmian jest często mniejsza niż drugi obraz.
Sekwencja zwykle nie jest tak długa, powiedzmy pięć klatek. Ale pomaga zmniejszyć strumień niż byłby w innym przypadku.
Uproszczenia
Zignorowałem dużo. Moje obrazy mają tylko dwa kolory (1-bit), a nie 256 obrazów 8-bitowych, a na pewno nie 4294 967 296 obrazu 32-bitowego. Nawet w przypadku obrazów 8-bitowych pamiętaj, że często możesz wybrać różne palety obrazu. Tak więc dwie 8-bitowe mapy bitowe z tymi samymi sekwencjami mogą reprezentować obrazy, które wyglądają inaczej (ten sam kształt, ale różne kolory).
Moje obrazy to pojedyncze rzędy, a nie dwuwymiarowe. Większość obrazów będzie mieć zapisany określony rozmiar wiersza, dzięki czemu tablice będą dwuwymiarowe.
W ogóle nie próbowałem reprezentować faktycznego kodowania. Są znacznie bardziej złożone niż te proste, których użyłem. Zrobiłem to, ponieważ chciałem móc opisać kodowanie w tym poście. Nie jestem przekonany, że mogę wyjaśnić Lempel-Ziv, a tym bardziej bardziej skomplikowane udoskonalenie Lempel-Ziv-Welch w jednej odpowiedzi. I nie rozumiem transformacji Fouriera wystarczająco dobrze, aby je wyjaśnić w dowolnej długości.
Jest to bardzo uproszczona wersja faktycznej obsługi obrazów. Wydaje mi się jednak, że dla celów dydaktycznych łatwiej jest zrozumieć niż bardziej złożona rzeczywistość, jednocześnie odnosząc się do zasadniczych kwestii.