W jaki sposób podczas tworzenia pliku JPEG mogę zminimalizować występowanie artefaktów?

10

Istnieją 2 główne czynniki, które wydają się prowadzić do cyfrowych artefaktów podczas tworzenia obrazów JPEG: Aliasing i Kompresja.

Przykład:

Konwersja formatu PNG ze znakami na format JPEG lub umieszczenie obrazów wektorowych nad fotografią spowoduje pikselizację ich krawędzi. Antyaliasing generuje wokół nich rodzaj rozmycia, ale jeśli obraz jest stratnie skompresowany , część szczegółów również zostaje utracona, dlatego rozmycie i pikselizacja mogą stać się mniej zauważalne.

Czy to jest właściwe? Tzn. Ponieważ bezstratna kompresja generuje bardzo szczegółowy obraz, artefakty wynikające z aliasingu będą bardziej zauważalne, więc można znaleźć równowagę przy użyciu odpowiedniej kompresji, choć pogarszając jakość obrazu.

Edytować

Właśnie zapisałem ten plik JPEG w mspaint (3,46 KB):

Bezstratny

Oto ten sam plik JPEG z maksymalną kompresją (najniższa jakość, 0,5 KB):

Strata

Oto jeszcze ten sam JPEG z kompresją 50% (zauważ różnicę rozmiaru, 1,29 KB):

Pół brak opcji

Ta sama 50% kompresja, ale zapisana jako „progresywny JPG”, zachowała oryginalne dane EXIF ​​i XMP oraz „próbowała zapisać z oryginalną jakością JPG” (można zauważyć, że wokół nie ma szarych pikseli, 2,96 KB):

Połowa opcji

I na koniec taki sam jak poprzednio przy wyłączonym podpróbkowaniu barwy (ten sam rozmiar pliku, 2,96 KB):

Połowa bez barwy

Stopy
źródło
1
Ciekawe, jaki jest powód, dla którego chcesz mieć plik jpg, czy jest to mniejszy rozmiar pliku? Jeśli pomaga Ci to w konkretnej sytuacji, czy wiesz o kompresji dxt lub teksturach pól odległości?
Alan Wolfe,
1
Nie jest dla mnie jasne, jakie jest twoje pytanie. Czy chcesz wiedzieć, czy dobrze jest kompresować za pomocą JPEG? Czy chcesz wiedzieć, jakie obrazy dobrze kompresują się w formacie JPEG? Lub czy już używasz JPEG i chcesz wiedzieć, jak tworzyć obrazy, aby zminimalizować artefakty spowodowane przez JPEG?
Mokosha,
@AlanWolfe Kilka razy spotkałem się z tym, że mogłem używać tylko JPEG (głównie w aplikacjach internetowych) i dlatego potrzebowałem go w formacie JPEG. Dzięki, ale nie byłem zaznajomiony z kompresją dxt ani teksturami pól odległości. Z tego, co widziałem w Wikipedii , algorytmy dxt różnią się od tych używanych w JPEG, czy masz na myśli, że można ich używać do tworzenia plików JPEG?
Armfoot
@Moshoka dzięki, to bardziej związane z twoim ostatnim pytaniem: jak zminimalizować „efekt wizualny” wywołany przez artefakty na obrazach JPEG?
Armfoot
należy pamiętać, że mozjpegkompresor ma specjalną sztuczkę, aby wytwarzać mniej zniekształceń na tego rodzaju obrazach. (i ogólnie jest on bardziej wydajny niż zwykłe pisarki JPEG). Próbowałeś?
Wyświetl nazwę

Odpowiedzi:

9

Kompresja JPEG obejmuje trzy główne kroki:

  1. Podpróbkowanie barwy . Obraz jest konwertowany z RGB na przestrzeń kolorów YCbCr, w której luma lub jasność (Y) są przechowywane oddzielnie od składników barwy lub koloru, Cb i Cr. Składnik Y jest utrzymywany w pełnej rozdzielczości, ale Cb i Cr są próbkowane w dół, zazwyczaj do połowy rozdzielczości na każdej osi. Wykorzystuje to fakt, że ludzki system wzrokowy jest bardziej wrażliwy na drobne szczegóły jasności niż koloru.

  2. Kwantyzacja częstotliwości. Obrazy Y, Cb i Cr są przekształcane w reprezentację częstotliwości, dzieląc je na bloki 8x8 i stosując dyskretną transformację kosinusową (wariant transformaty Fouriera) do każdego bloku. Wynikiem jest macierz liczb, które opisują amplitudy różnych częstotliwości przestrzennych w bloku. Liczby te można następnie skwantyzować (zaokrąglić do wybranej liczby bitów precyzji). Różne poziomy kwantyzacji są stosowane dla różnych częstotliwości, wykorzystując względnie niższą wrażliwość naszego układu wzrokowego na wysokie częstotliwości. Tutaj właśnie pojawia się ustawienie jakości kodera JPEG: niższe jakości wykorzystują bardziej zgrubną kwantyzację.

  3. Kodowanie entropii . Skwantowane wartości DCT są przekazywane przez koder entropijny, który bezstratnie kompresuje strumień bitów, używając mniejszej liczby bitów do reprezentowania bardziej powszechnych wartości, podobnie jak plik zip.

Kroki 1 i 2 są stratne i każdy z nich wytwarza swój własny rodzaj artefaktów (choć nakładają się na siebie). Podpróbkowanie barwy ma tendencję do rozmycia ostrych krawędzi między regionami o różnych kolorach. Jest to szczególnie widoczne w grafice wektorowej, w której jaskrawe kształty wychwytują błędne postrzępione krawędzie. Kwantyzacja częstotliwości ogólnie zaciera drobne szczegóły, a także tworzy artefakty w kształcie bloku przy niskich ustawieniach jakości, ponieważ DCT odbywa się na zasadzie blok po bloku. Jest to szczególnie widoczne na tekście.

Dlatego JPEG zwykle nie jest używany do obrazów zawierających grafikę wektorową lub tekst - jego algorytmy kompresji są słabo dostosowane do tych przypadków, chociaż działają dobrze w przypadku zdjęć i innych obrazów o złożonej teksturze i niezbyt ostrych krawędziach.

Nathan Reed
źródło
Bardzo dziękuję za szczegółowe wyjaśnienie Nathan +1. Rozumiem, że algorytmy kompresji mają swoje ograniczenia dla JPEG, ale chciałem tylko sprawdzić, czy istnieje odpowiednia równowaga stopnia kompresji wraz z innymi opcjami (podczas zapisywania), które mogą sprawić, że artefakty będą mniej zauważalne. Zredagowałem swoje pytanie próbkami.
Armfoot