Pytanie:
Czy plik JPG gwarantuje wytwarzanie tych samych pikseli?
Wayne Werner
2016-10-16 05:27:10 UTC
view on stackexchange narkive permalink

Wiem, że robienie zdjęć w formacie RAW ma wiele zalet, ale w tej chwili wydaje mi się, że JPG działa dla mnie dobrze. Rozmiary plików są znacznie mniejsze, a darktable wydaje się działać z nimi dobrze (chociaż, co ciekawe, wydaje się, że w rzeczywistości jest to szybsze przy edycji plików RAW, ale może to być po prostu halucynacja).

O ile wiem, darktable działa poprzez utworzenie pliku pomocniczego zawierającego zmiany do wprowadzenia w oryginalnym pliku JPG, więc teoretycznie zmiany są nieniszczące (tj. nie jest to rekompresowanie obrazu do JPG za każdym razem).

Biorąc to wszystko pod uwagę, byłem ciekawy - czy ten sam plik JPG gwarantuje, że za każdym razem renderuje te same piksele? Załóżmy na przykład, że mam plik JPG zapisany z jakością 98%. Jeśli otworzę go przy powiększeniu 100%, czy będzie miał te same piksele, gdy otworzę go w darktable, jak po otwarciu w Google Chrome? Albo kiedy otworzysz go w Photoshopie? A co z plikami o większej kompresji, np. 50% jakości?

Niektóre kodery umożliwiają wybór między zmiennoprzecinkowym a całkowitym DCT. Czy ktoś, kto wie, o czym mówią (nie ja w tym przypadku!) Może odnieść się do tego, czy może to być * przechowywane * z wartościami zmiennoprzecinkowymi? A może to tylko pośrednie obliczenie?
Byłyby między nimi różnice, byłyby małe, ale zdecydowanie inne matematycznie.
Siedem odpowiedzi:
Aaganrmu
2016-10-21 13:51:07 UTC
view on stackexchange narkive permalink

Krótka odpowiedź

Nie, nie gwarantuje się, że dekodowanie będzie zawsze takie samo. Jednak różnice na pewno będą bardzo, bardzo małe.

Specyfikacje ISO

Specyfikacje Międzynarodowej Organizacji Normalizacyjnej (ISO) dla formatu JPEG mają następujące specyfikacje dla dekoderów (wyróżnienie moje):

Dekoder powinien

a) z odpowiednią dokładnością przekonwertować na zrekonstruowane dane obrazu wszelkie skompresowane dane obrazu z parametrami mieszczącymi się w zakresie obsługiwanym przez aplikację i które są zgodne ze składnią formatu wymiany określoną w załączniku B dla procesu (-ów) dekodowania realizowanego przez dekoder;

b) akceptować i prawidłowo przechowywać dowolną tabelę dane specyfikacji, które są zgodne ze skróconym formatem składni danych specyfikacji tabeli określonym w załączniku B dla procesu (-ów) dekodowania realizowanego przez dekoder;

c) z odpowiednią dokładnością , przekonwertować do zrekonstruowanych danych obrazu wszelkie skompresowane dane obrazu, które są zgodne ze skróconym formatem dla określonej składni skompresowanych danych obrazu w załączniku B dla procesu (-ów) dekodowania realizowanego przez dekoder, pod warunkiem, że dane specyfikacji tabeli wymagane do dekodowania skompresowanych danych obrazu zostały wcześniej zainstalowane w dekoderze.

Odpowiednia dokładność jest bardzo surowa. Każdy konwerter spełniający te specyfikacje należy porównać z algorytmem odniesienia. W przypadku pojedynczego piksela każdy składnik może różnić się od odniesienia tylko o jeden bit. Ponadto (kwadratowy) błąd na każdym bloku 8x8 pikseli i na całym obrazie musi być bardzo mały.

Ale dlaczego miałoby być inaczej?

W przeciwieństwie do bmp czy png, plik jpeg nie przechowuje samych pikseli, ale opis obrazu. Aby zrekonstruować poszczególne piksele, stosuje się złożony algorytm matematyczny. Po każdym kroku algorytm zapisuje wynik w pamięci. W tym miejscu coś może pójść nie tak: wartość w pamięci ma określoną precyzję, precyzję maszyny. Z tego powodu wartość musi zostać zaokrąglona. Chociaż specyfikacje zapewniają minimalną precyzję, nie ma maksymalnej. Zaokrąglenie może więc być różne dla każdej implementacji. Może nawet zależeć od używanego sprzętu, ponieważ niektóre procesory używają więcej bitów precyzji, niż jest to wymagane. Niektóre wczesne procesory Pentium zrobiły to nawet po prostu źle.

Drobny, nadmiernie uproszczony przykład: obliczanie 5 * 0,12 przez wielokrotne dodawanie.

Komputer może to zrobić, przechowując wartości pośrednie z dokładnością do jednej cyfry. : 0,12 + 0,12 = 0,24, zapisz wynik pośredni jako 0,2 (zaokrąglając w dół). Następnie oblicz 0,2 + 0,12 = 0,32, zapisz jako 0,3 (ponownie zaokrąglając w dół). Kontynuuj ten wzór, a wynik wyniesie 0,5 zamiast oczekiwanego wyniku 0,6. Gdyby zastosowano większą dokładność (na przykład dwie cyfry), wynik byłby inny.

Uważam, że to poprawna odpowiedź. Wypróbowałem kilka popularnych aplikacji, aby sprawdzić, czy mogę wykryć jakiekolwiek 1-bitowe różnice, ale jak dotąd nie udało mi się.
Odkryłem, że moja wcześniejsza awaria była spowodowana tylko brakiem doświadczenia z edytorem zdjęć, który mam pod ręką. Kiedy wymyśliłem, jak właściwie poprawić różnice w obrazie, były oczywiste. Zostawiłem własną odpowiedź, aby zademonstrować.
Świetnie, faktycznie masz dowód.
Fakt, że istnieje norma ISO, nie oznacza, że ​​jest on powszechnie przestrzegany w rzeczywistych implementacjach.
Mark Ransom
2016-10-21 22:08:06 UTC
view on stackexchange narkive permalink

Nie, nie można polegać na tym, że zdekodowane obrazy JPEG będą identyczne w bitach.

Jako przykład próbowałem wyświetlić obraz u góry tej strony w dwóch różnych przeglądarkach: Chrome 53.0.2785.143 i Internet Explorer 11.0.9600.18426. Wyglądają identycznie, ale umieściłem zrzuty ekranu w edytorze obrazów i powiększyłem różnicę. Widać, że to nie to samo.

Oto oryginalny obraz:

Original image

A oto różnica między dwoma renderami przeglądarek, ulepszona:

Enhanced difference

A co, jeśli otworzysz go w chrome w dwóch różnych zakładkach - czy otrzymujesz wtedy identyczny obraz?
@WayneWerner Próbowałem tego właśnie teraz i tak, były identyczne. Tak, jak bym się spodziewał. Jestem całkiem pewien, że różnice wynikają ze szczegółów algorytmów dekodowania z innego oprogramowania, o których mowa w innej odpowiedzi.
Czy próbowałeś tego również z PNG, na wypadek gdyby Chrome i Internet Explorer używały innego zarządzania kolorami?
@LoganPickup nie, nie zrobiłem, ale to dobry pomysł.
null
2016-10-16 06:27:06 UTC
view on stackexchange narkive permalink

Czy ten sam plik JPG gwarantuje tworzenie tych samych pikseli przy każdym renderowaniu?

Tak. To tylko lista liczb reprezentujących wartości kolorów (w sprytny sposób, aby były małe). W procesie otwierania pliku jpeg nie ma informacji „tworzonych”, które różniłyby się między dwiema aplikacjami.

A co z plikami o wyższej kompresji, np. 50% jakości?

Wtedy liczby na liście będą inne. (więcej zer) Poza tym nie ma różnicy.

To prawda, jeśli chodzi o część dekompresyjną. Jest jednak jedno duże zastrzeżenie: inny kod zarządzania kolorami może dawać różne wyniki podczas konwersji do docelowej przestrzeni kolorów - szczególnie jeśli jedna aplikacja określa kompensację punktu czerni, a inna nie. I to nawet nie biorąc pod uwagę żadnego obcięcia obliczeń pośrednich, które mogą wystąpić lub nie.
Czyli przy takim samym współczynniku kompresji wartość hash md5 wygenerowanych obrazów powinna pozostać taka sama, niezależnie od tego, ile razy uruchamiamy proces kompresji oryginalnego obrazu?
Euri Pinhollow
2016-10-16 22:17:10 UTC
view on stackexchange narkive permalink

Sama kompresja i elementy wewnętrzne JPEG nie wpływają na odtwarzalność już skompresowanego pliku - przy założeniu, że przestrzeń kolorów zdjęcia odpowiada kolorowi, w poprawnie działających programach da takie same piksele przestrzeni systemu zarządzania kolorami

  • oglądasz obraz w 100% skali, tj. wysyłanie piksela do piksela na monitor
  • Jeśli na przykład obraz plik zawiera dane AdobeRGB, może dać różne dane pikseli w systemach kolorów sRGB, ponieważ różne algorytmy mogą być używane do konwersji z AdobeRGB do sRGB i mogą używać różnej precyzji do obliczeń. Photoshop i Chrome najprawdopodobniej używają różnych algorytmów konwersji kolorów.

    Wiele przeglądarek nie jest poprawnie skonfigurowanych do celów kolorymetrycznych i może w ogóle nie używać profilu monitora i może wyświetlać obraz zupełnie inaczej niż w programie Photoshop.

    Gdy obraz jest skalowany, pojawi się różnica między algorytmami zmiany rozmiaru.


    To może być zbyt skomplikowane, ale prawdopodobnie coś, co chciałbyś wiedzieć.

    James Snell
    2016-10-17 18:40:16 UTC
    view on stackexchange narkive permalink

    Większość schematów kodowania JPEG nie ma być dokładnie dokładna, są one „percepcyjnie bezstratne”. Taka zasada zostanie zastosowana w implementacjach algorytmów kodera i dekodera.

    Rozsądnie jest oczekiwać, że w dekoderze zostaną zaimplementowane pewne optymalizacje, które faworyzują wydajność nad dokładnością, że zarządzanie kolorami może nie wszystko i że konwersja RGB-Y'CrCb nie będzie identyczna między dekoderami.

    JPEG ma być „wystarczająco dobre”, różnice byłyby subtelne i tego należy się spodziewać. Ta sama zasada miałaby zastosowanie niezależnie od poziomu kompresji zastosowanego do pliku źródłowego.

    xiota
    2018-07-21 06:39:16 UTC
    view on stackexchange narkive permalink

    @Aaganrmu jest ogólnie poprawne. Nie ma gwarancji, że określony plik JPEG zostanie wyrenderowany dokładnie w ten sam sposób za każdym razem, gdy zostanie otwarty , nawet przez ten sam program .

    W praktyce, o ile program nie został zaktualizowany, otwarcie tego samego pliku tym samym programem da takie same wyniki. Wiele programów używa również tych samych bibliotek dekodujących i produkuje te same wyniki. Celowe wprowadzenie zmian w algorytmie JPEG w celu uzyskania różnych wyników za każdym razem, gdy otwierany jest plik, byłoby zbyt dużym wysiłkiem programistów. Nie jest to również to, czego użytkownicy oczekiwaliby lub chcieli. (Jest to ignorowanie profili kolorów i korekcji, które są oddzielnym krokiem po dekodowaniu).

    Możliwość odchylenia pochodzi od różnych danych wejściowych, które potencjalnie skutkują taki sam wynik jako wynik transformacji, zaokrąglenia i kwantyzacji, które występują jako część algorytmu JPEG. Te operacje są również źródłem artefaktów JPEG.

    JPEG variations

    Dekodery JPEG knusperli i jpeg2png zostały zaprojektowane w celu zredukowania artefaktów JPEG w ramach ograniczeń dozwolonych przez algorytm JPEG. Tworzą dane wyjściowe, które powinny dawać te same dane, które zostały wprowadzone po ponownej kwantyzacji przy tych samych ustawieniach. (Jeśli dobrze rozumiem ich działanie, ignorują różnice, które mogą być wprowadzone przez zaokrąglanie błędów). W rezultacie dekodowanie trwa dłużej, a ich dane wyjściowe są inne (lepsze?) Niż w przypadku innych dekoderów.

    Oto 100% przycięcia, aby pokazać różnicę między libjpeg (po lewej) a jpeg2png (po prawej):

    jpeg2png example

    WayneF
    2016-10-16 21:02:35 UTC
    view on stackexchange narkive permalink

    Piksel to tylko kolor, jeden średni kolor próbkowany z tego małego obszaru piksela. Kolor to sposób, w jaki widzimy szczegóły. Widzimy czarny przewód zasilający biegnący przez obraz błękitnego nieba tylko z powodu innego koloru. Kolor to szczegół.

    Jakość JPG 50 to tylko 50, tylko liczba, to NIE jest 50%.
    JPG 100 to nie 100% niczego. 100 to całkiem dobry JPG, ale nadal jest to JPG.

    Artefakty JPG (spowodowane niższym współczynnikiem jakości) zmieniają kolor piksela. Piksel ma inny kolor, a piksel jest tylko kolorem, więc jest to inny piksel.

    Kodowanie (tworzenie) JPG jest często inne w każdym programie. Istnieje kilka opcji, które w różnych programach przyjmowane są różnie. Jakość 80 w jednym programie raczej nie odpowiada jakości 80 w innym programie.

    Domyślam się, że dekodowanie (wyświetlanie) JPG jest standardem, pokazując, co zostało zakodowane.

    JPG jest dziś lepszy niż poprzednio kiedyś było, ale nadal istnieją artefakty JPG.

    Jednym z rodzajów artefaktów JPG jest to, że JPG próbuje sprawić, aby kolory w blokach 8x8 pikseli były 64 w tym samym kolorze, jeśli były już podobne. Niska jakość JPG ma tendencję do pokazywania bloków 8x8 pikseli w obszarach o podobnym kolorze (niebo, ściany itp.).

    Innym rodzajem artefaktu JPG jest rozmycie lub echo ostrych krawędzi przesuniętych nieco od oryginalnej krawędzi .

    Zobacz http://www.scantips.com/basics09b.html, aby zobaczyć kilka przykładów artefaktów JPG.

    Niska jakość JPG może sprawić, że e-maile i Internet jest mniejszy i szybszy, ale w przypadku naszych rzeczywistych zdjęć po prostu nie ma powodu, dla którego chcielibyśmy mieć niską jakość JPG. :)



    To pytanie i odpowiedź zostało automatycznie przetłumaczone z języka angielskiego.Oryginalna treść jest dostępna na stackexchange, za co dziękujemy za licencję cc by-sa 3.0, w ramach której jest rozpowszechniana.
    Loading...