Czy ostatecznie wszystkie obrazy cyfrowe nie są tylko wartościami pikseli od 0 do 255?

56

Mam kilka niezwykle podstawowych (głupich?) Pytań dotyczących obrazów; w szczególności formaty obrazów i wartości pikseli.

Wybacz mi, nie jestem fotografem. Jestem tylko kimś, kto pracuje z obrazami, a dla mnie są to tylko rzędy i kolumny liczb.

Moje pytania to:

Jeśli rdzeniem zdjęcia są tylko 3 kanały wartości pikseli [0, 255] X RBG, to w jaki sposób może istnieć jakakolwiek różnica między dowolnymi dwoma formatami obrazów? To znaczy, co czyni RAW innym niż TIFF - czy nie wszystkie są ograniczone do wartości z zakresu od 0 do 255? Liczba jest liczbą - czy nie powinien istnieć tylko jeden zestaw formatów? Czy też nie należy blokować dwóch obrazów o tej samej wysokości i szerokości, aby mieć ten sam rozmiar pliku?

Co więcej, z liczbowego punktu widzenia, co sprawia, że ​​coś w rodzaju obrazów 16-bitowych różni się od obrazów 32-bitowych? Ponownie, obraz jest tylko tablicą o wartościach całkowitych od 0 do 255.

Kontynuując tę ​​perspektywę, że obraz w systemie plików komputera to tylko 3-kanałowa tablica liczb całkowitych od 0 do 255, jaki jest sens kompresji obrazu do stratnego formatu, takiego jak na przykład JPG? Powiedz, że algo kompresji zmienia niektóre wartości pikseli z 254 na 255 lub cokolwiek innego. Więc? W jaki sposób zapewnia to oszczędności w rozmiarze pliku lub wpływa na jakość obrazu?

Wiem, że istnieje wiele różnych sposobów przechowywania danych obrazu. Ale nie pytam o nic innego niż podstawowy 3-kanałowy obraz RBC. Wiem tylko, że jeśli ktoś poda mi jedną z nich, mam teraz szereg liczb. Nie mam powodu, aby wiedzieć, dlaczego jedna tablica liczb może być inna niż jakakolwiek inna tablica liczb od 0 do 255. Mam nadzieję, że to ma sens. To pytanie nie ogranicza się do formatu RAW! Chodzi raczej o dowolną tablicę wartości pikseli

Monica Heddneck
źródło
32
Zaczynam się zastanawiać, czy to nieporozumienie wynika z pracy na wyższym poziomie. Czy czytasz pliki za pomocą Matlaba lub innego narzędzia? Zaufaj mi, jeśli otworzysz i przeczytasz plik TIFF, PNG lub JPG na poziomie pliku raw, będziesz musiał zrobić wiele rzeczy, zanim uzyskasz ładną i czystą matrycę RGB.
rura
2
Pomogłoby to, gdyby OP mógł zapewnić nieco więcej kontekstu. Np. Czy jest to związane z kodem przetwarzania obrazu?
remco
1
Jeśli chodzi o edycję: jeśli masz tablicę liczb, po prostu z tym pracuj. Gdzie jest druga tablica? Jeśli masz 2 tablice do porównania, to inna historia. Mogą zawierać wartości wystarczająco bliskie, które wyglądają podobnie do ludzkiego oka. Biorąc pod uwagę tablicę, po kodowaniu stratnym, dekodowanie tablicy nigdy nie da oryginalnej tablicy, ale wystarczająco blisko
phuclv
3
Uważaj na pakiety oprogramowania, które mają zaimportować TIFF, FITS i inne nieskompresowane obrazy. Wiele takich pakietów, w tym podstawowe narzędzia MATLAB i python, automatycznie przycinają dane do 8 bitów niezależnie od rozmiaru źródła. Jeśli chcesz tego uniknąć, musisz znaleźć specjalistyczne funkcje / biblioteki lub rzucić własne narzędzia.
Carl Witthoft
2
@Monica Heddneck: jest już sporo fajnych odpowiedzi, które doprowadziły cię do wniosku, że nie, obraz nie jest prosty, ponieważ jest pikselem wartości RGB255, ale po prostu nie rozumiem, dlaczego nie rozumiesz uzasadnienia dla skompresowanych formatów. Są tam, aby zapisać dane w pamięci lub w transporcie. Kompresja byłaby korzystna, nawet gdyby wszystkie zdjęcia były tylko trojaczkami RGB255.
Gábor,

Odpowiedzi:

72

Przykro nam, ale podstawowa przesłanka jest błędna: obraz można zakodować jako tablicę pikseli RBG z 8 bitami na wartość, ale istnieje wiele innych sposobów:

  • jeden kanał z jednym bitem / kanałem (czysta czerń i biel),
  • jeden kanał z x bitem / kanałem (formaty w skali szarości, x zwykle będzie wynosić 8 lub 16, dając wartości 256 lub 65536),
  • różne formaty oparte na palecie (por. GIF)
  • pełnokolorowy z (przynajmniej teoretycznie) tyloma kanałami, ile chcesz, z dowolną wymaganą głębią bitową.

Dotyczy to obrazu przechowywanego w pamięci RAM komputera podczas edycji / przeglądania. Ignoruję różne istniejące formaty obrazów RAW (tutaj i w dalszej części tego postu).

W przypadku fotografii najczęściej występują 3 kanały z 8, 16 lub 32 bitami / kanał (zwykle liczba całkowita, ale przynajmniej niektóre programy działają wewnętrznie z 32-bitowymi liczbami zmiennoprzecinkowymi). Często występuje czwarty kanał (alfa), szczególnie gdy program pozwala na użycie warstw. I gdzieś należy zapisać wymiary tablicy obrazów.

Istnieją różne przyczyny tych różnych formatów. W przypadku formatu w pamięci ważną kwestią był rozmiar danych i szybkość (znacznie szybsze manipulowanie jednym 8-bitowym kanałem niż 4 32-bitowe kanały). Są one obecnie mniej ważne, ale mamy pełne zarządzanie kolorami z różnymi przestrzeniami kolorów. Niektóre z nich (np. Prophoto RGB) wymagają co najmniej 16 bitów / kanał, aby różnice między sąsiednimi kolorami były wystarczająco małe, aby uniknąć widocznych pasm. A ponieważ zabiegi stają się coraz bardziej skomplikowane, istnieją zalety korzystania z 32-bitowych liczb zmiennoprzecinkowych (gdzie kolory są kodowane wartościami od 0,0 do 1,0, a obróbka pozwala na wartości pośrednie poza tym zakresem).

Jeśli chcesz móc zapisać obraz do pliku i załadować go ponownie do tych samych danych w pamięci, musisz użyć co najmniej tyle bitów na kanał, co format im-memory, i musisz przechowywać informacje o wymiary obrazu, głębia bitowa i przestrzeń kolorów.

Użytkownicy tych zdjęć lubią także przechowywać dodatkowe informacje o obrazie (podpis, tytuł, kto zrobił zdjęcie itp.). Znów różne sposoby przechowywania tych informacji.

Istnieją różne sposoby kompresji danych obrazu do przechowywania plików. Jednym z prostszych jest RLE (Run Length Encoding), w którym zapisujesz liczbę i wartość piksela za każdym razem, gdy napotkasz powtarzającą się wartość piksela. Inne, takie jak jpeg, są o wiele bardziej skomplikowane, ale także zapewniają znacznie większą kompresję. Np. Jpeg używa transformacji kosinusowej i wyrzuca (mniej widoczne) informacje o wysokiej częstotliwości, dając wysokie wskaźniki kompresji kosztem utraty informacji (jest więcej, ale robi się to zbyt długo).

Daje to już wiele sposobów przechowywania informacji na dysku, ale niezależnie od wybranego sposobu format musi być dobrze określony, aby umożliwić prawidłową interpretację podczas ładowania obrazu.

Następnie stale rozwija się np. Techniki kompresji bezstratnej, z którymi istniejące formaty nie zawsze mogą sobie poradzić.

W rezultacie otrzymujemy różne formaty plików, z różnymi kompromisami między wiernością przechowywanych informacji, zajmowanym miejscem na dysku a szybkością odczytu, zapisu i przesyłania (porównaj rozmiar nieskompresowanego pliku TIFF i przyzwoitą jakość jpg) .


Po obejrzeniu edytowanego pytania, kilka dodatkowych aspektów:

Jeśli zostanie obsłużony obraz w pamięci, będzie on miał postać jednej lub więcej tablic. W tym momencie oryginalny format pliku nie powinien już odgrywać żadnej roli . Zakładam, że dane są przetwarzane z 8 bitami / kanał.

Ale musisz wiedzieć, czy masz przetworzony obraz, czy surowy obraz, ponieważ istnieją dwie ważne różnice między nimi:

  • nieprzetworzone obrazy zazwyczaj mają 1 kolor na piksel , a piksele są zwykle ułożone w układzie Bayera z 2 zielonymi, 1 czerwonymi i 1 niebieskim pikselem na kwadrat o 4 pikselach. Wartości są proporcjonalne do intensywności sceny (z wyjątkiem bardzo niskich i bardzo wysokich wartości).
  • przetworzone obrazy mogą być ułożone jako tablica 2D zawierająca 3 wartości liczbowe lub jako płaszczyzny kolorów (3 tablice 2D, po jednej dla każdej z R, G, B). Ponadto wartości zwykle nieproporcjonalne do intensywności sceny . Co gorsza, dokładna zależność między wartościami pikseli a intensywnością sceny zależy od przetwarzania obrazu. Równowaga między kolorami została dostosowana do reakcji ludzkiego oka (balans bieli, czerwony i niebieski są wzmacniane względem zieleni).

Jeśli więc otrzymujesz surowy obraz z 3 wartościami kolorów na piksel, ten surowy obraz został już poddany pewnej obróbce (przynajmniej demosykacja lub proste binowanie 4 nieprzetworzonych pikseli do 1 piksela obrazu). To, czy jest to do przyjęcia, będzie zależeć od twojej aplikacji.

remco
źródło
Nie jestem trochę zainteresowany różnorodnością sposobów przedstawiania obrazów, ale zamiast tego, jeśli otrzymam dwie 3-kanałowe macierze liczb, co odróżnia jedną z nich od innych? Jaka jest różnica między powiedzeniem TIFF i RAW, jeśli oba są tablicami trójwymiarowymi?
Monica Heddneck,
4
Być może zainteresowałem się, gdy pomyślałem, że 16-bitowe obrazy mają 16 bitów na kanał. W świecie grafiki komputerowej obrazy 16-bitowe miały 16 bitów, co stanowi sumę wszystkich 3 kanałów (zazwyczaj 5 czerwonych, 6, zielonych, 5 niebieskich). Chciałem tylko zwrócić uwagę na to w komentarzu, aby ktoś, kto widzi 16-bitowy kolor, był świadomy, że istnieją dwa znaczenia tego terminu, w zależności od tego, kto go używa.
Cort Ammon
„znacznie szybciej manipuluje się jednym 8-bitowym kanałem niż 4 32-bitowymi kanałami”. Czy nie masz na myśli „znacznie szybciej manipulować jednym 32-bitowym kanałem niż 4 8-bitowymi kanałami”?
l0b0
1
@MonicaHeddneck Jeśli jedna z macierzy zawiera dane RGB, podczas gdy druga zawiera (np.) Dane HSV, wówczas rozmiar i głębia bitowa obu tablic są takie same, a po renderowaniu na urządzeniu wyświetlającym będą wyglądały tak samo ( + ), ale dane przechowywane w dwóch tablicach z pewnością nie są takie same. ( + ) W rzeczywistości nie będą wyglądać dokładnie tak samo, ponieważ zarówno 888RGB, jak i 888HSV mają 2 ^ 24 „punktów” w swoich gamutach, nie ma odwzorowania jeden na jeden między dwoma zestawami punktów. Jednak w praktyce prawdopodobnie będzie bardzo trudno dostrzec różnicę ludzkimi oczami.
dgnuff
Właściwie chodzi o kolor pływającego bitu hdr 32, który nie jest zakodowany w 0 do 1, ale 0 do czegokolwiek, jeśli naprawdę chcesz to zrobić, zamiast tego użyj liczb całkowitych. Tak jak prawdziwe światło, tak naprawdę nie ma górnej granicy. Ale zobaczysz tylko jego kawałek. Jest to przydatne z wielu powodów, ale jeśli pozwiesz je na przykład w odbiciach 3d, wtedy prawdziwa energia jest nadal wychwytywana, co ma duże znaczenie dla takich rzeczy jak niebo i selektywność na przykład 20%
joojaa
48

Jeśli rdzeniem zdjęcia są tylko 3 kanały wartości pikseli [0, 255] X RBG,

Ale zdjęcia nie są „tylko 3 kanałami wartości pikseli”, nawet „rdzeniem”. Ekrany komputerowe są zazwyczaj składa się z tablicy RGB pikseli, więc jeśli chcesz, aby wyświetlić obraz na ekranie komputera trzeba, w pewnym momencie, mapa cokolwiek obraz dane masz na tablicę RGB pikseli, ale że dane jest tylko szczególne renderowanie danych obrazu. Dane na obrazie mogą w ogóle nie zawierać strumienia wartości pikseli. Aby uzyskać wartości pikseli z obrazu, musisz wiedzieć, jak formatowane są dane.

jak więc może istnieć jakakolwiek różnica między dowolnymi dwoma formatami obrazów? To znaczy, co czyni RAW innym niż TIFF - czy nie wszystkie są ograniczone do wartości z zakresu od 0 do 255?

Są to dwa dobre przykłady, ponieważ żaden z tych formatów niekoniecznie zawiera prostokątny układ wartości RGB.

RAW wcale nie jest jednym formatem - to rodzaj ogólnej nazwy plików zawierających dane zapisane bezpośrednio z matrycy. Plik RAW może więc zawierać sekwencję wartości reprezentujących napięcia odczytane z różnych miejsc czujników. Te witryny są jak piksele obrazu, ale nie są to piksele RGB. Aby uzyskać piksele RGB z pliku RAW, musisz interpretować te dane w kontekście informacji o czujniku, ustawieniach aparatu w tym czasie itp. Innymi słowy, możesz otworzyć plik RAW w edytorze szesnastkowym i wyglądaj, jak chcesz, ale nie znajdziesz ani jednej wartości RGB.

TIFF oznacza format pliku z oznaczonym obrazem i jest to bardzo interesujący format, ponieważ może zawierać wiele różnych reprezentacji obrazu. Pojedynczy plik TIFF może zawierać „ten sam” obraz w kilku rozmiarach, takich jak miniatura, obraz w rozdzielczości ekranu i obraz w rozdzielczości wydruku, a także może mieć wersje kolorowe i w skali szarości. Czy wiesz, że faksy zazwyczaj wysyłają swoje dane jako pliki TIFF? Aby uzyskać piksele RGB z pliku TIFF, musisz zrozumieć nie tylko format TIFF, ale także format konkretnej reprezentacji obrazu w tym pliku.

Liczba jest liczbą - czy nie powinien istnieć tylko jeden zestaw formatów?

Nie. Istnieje wiele różnych formatów obrazów, ponieważ każdy z nich zaspokaja inny zestaw potrzeb. Kompresja stratna JPEG jest świetna do uzyskiwania bardzo małych plików obrazów, ale nie jest dobra dla obrazów, które trzeba będzie edytować kilka razy. Niektóre formaty używają przeplotu , co sprawia, że ​​odczyt obrazu jest bardzo szybki w kilku różnych rozdzielczościach. I tak dalej ... każdy format oferuje własną kombinację zalet i kompromisów.

Czy też nie należy blokować dwóch obrazów o tej samej wysokości i szerokości, aby mieć ten sam rozmiar pliku?

Nie, to byłoby okropne. Jeśli rozmiar każdego pliku obrazu musiałby być zasadniczo width * height * 3(przy założeniu 24-bitowego koloru), marnowałbyś dużo miejsca do przechowywania. Większość zdjęć zawiera wiele nadmiarowości, tj. Regiony, w których ten sam kolor jest powtarzany wiele razy. Aby zaoszczędzić miejsce na dysku, często warto wyeliminować te zbędne informacje. Jednym ze sposobów na to, na przykład, jest kodowanie długości przebiegulub RLE. Na przykład, jeśli masz region 4195 kolejnych pikseli, które wszystkie są białe, o wiele bardziej efektywne jest kodowanie tego, ponieważ „wszystkie kolejne 4195 pikseli to {255, 255, 255}” zamiast po prostu przechowywać tyle białych pikseli w plik. RLE jest faktycznie używany w niektórych formatach obrazów, ale wiele formatów ma znacznie bardziej wyrafinowane schematy, które oszczędzają o wiele więcej miejsca, a to oznacza, że ​​możesz przechowywać o wiele więcej obrazów na dysku twardym lub karcie pamięci. Dzięki temu wysyłanie obrazu do kogoś innego jest znacznie szybsze.

Kontynuując tę ​​perspektywę, że obraz w systemie plików komputera to tylko 3-kanałowa tablica liczb całkowitych od 0 do 255, jaki jest sens kompresji obrazu do stratnego formatu, takiego jak na przykład JPG?

Chodzi o to, że plik jest znacznie mniejszy. Kompresja JPEG często zmniejsza rozmiar pliku o współczynnik 10 lub więcej. Oznacza to, że możesz zmieścić więcej zdjęć na danym urządzeniu pamięci masowej, możesz skopiować je szybciej, szybciej je otworzyć, a także szybciej je przesyłać i pobierać. Przechowywanie tego samego obrazu (lub prawie takiego) w znacznie mniejszej przestrzeni zużywa zasoby bardziej wydajnie, a zatem zmniejsza koszty. Pomyśl o tym na dużą skalę: jest prawdopodobne, że bardzo duży procent informacji dostępnych w Internecie składa się z obrazów i filmów, a bez kompresji potrzebowalibyśmy więcej lub większych centrów danych i zużyłoby znacznie więcej energii.

Powiedz, że algo kompresji zmienia niektóre wartości pikseli z 254 na 255 lub cokolwiek innego. Więc? W jaki sposób zapewnia to oszczędności w rozmiarze pliku lub wpływa na jakość obrazu?

Rozważ mój przykład RLE powyżej. Załóżmy, że masz zdjęcie, które zawiera dużą pustą ścianę, więc duże obszary zdjęcia są tego samego koloru, z wyjątkiem tego, że występują rozproszenie nieco ciemniejszych pikseli, ledwo zauważalne na zdjęciu. Piksele te zmniejszają skuteczność kompresji. Zamiast po prostu powiedzieć: „wszystkie następne 500 000 pikseli to {243, 251, 227}”, musisz uruchomić długość, aby zakodować o wiele więcej mniejszych fragmentów, ponieważ co jakiś czas napotykasz jeden z tych nieco innych pikseli. Jeśli zezwolisz algorytmowi kompresji na dokonywanie niewielkich zmian, być może zmieniając tylko piksel o nie więcej niż 1% lub 2%, możesz uzyskać znacznie wyższy współczynnik kompresji bez zauważalnej zmiany obrazu. To jest kompromis: ty porzucenie niewielkiej ilości informacji z oryginalnego obrazu w zamian za duże zmniejszenie rozmiaru pliku. Dokładnie to, gdzie chcesz narysować tę linię, może się zmienić, więc formaty stratne, takie jak JPEG, pozwalają użytkownikowi wybrać żądany poziom kompresji.

Caleb
źródło
1
Poparliśmy bardzo jasne i wyczerpujące wyjaśnienie złożonego tematu! Myślę, że wiele się z tego nauczyłem. Zastanawiam się, czy jednym ze skutecznych sposobów zarządzania kompresją bezstratną byłoby kodowanie długości, ale zasadniczo zasadniczo drugie przejście przez obraz w celu dodania później wyjątków nieparzystych na piksel. Coś w rodzaju „od 23 do 400 jest czarny”, a następnie „302 jest biały” nadpisuje ten jeden piksel. zamiast 23 - 301 to czarny, 302 to czarny, 303 - 400 to czarny. Podejrzewam, że tak właśnie traktuje to co najmniej jeden format kompresji.
Ruadhan2300
1
@ Ruadhan2300 - rzeczywiście istnieją. Zobacz na przykład: en.wikipedia.org/wiki/Lossless_JPEG, który wykorzystuje metodę przewidywania koloru każdego piksela (choć nieco bardziej złożonego niż kodowanie długości przebiegu), a następnie koduje różnicę między tą prognozą a rzeczywistą wartością piksela.
Jules
18

Oprócz fantastycznej odpowiedzi @ remco chcę dodać, dlaczego istnieją różne kodeki do (mniej więcej) tego samego celu.

Kodeki mają na celu:

  • Bądź bezstratny kontra stratny
  • Szybko koduj a zmniejszaj rozmiar pliku
  • Asymetryczne vs. symetryczne en / dekodowanie
  • Bądź kompatybilny z oprogramowaniem
  • Bądź percepcyjnie prawie bezstratny w różnych poziomach kompresji / sytuacjach
  • Funkcje niedostępne w innych kodekach, w tym:
    • będąc wolne od tantiem
    • obsługa warstw
    • obsługa kanału alfa (np. RGBA) / transparrency
    • oferują szybki widok strony internetowej
    • obsługuje wysoką (er) głębię bitową
    • obsługa wielu przestrzeni kolorów (RGB / CMYK)
    • obsługa metadanych / wersjonowania / ...

Niektóre z tych rzeczy wzajemnie się wykluczają. Z tego powodu pozostało nam wiele kodeków.


Kilka przykładów

Uwaga: Lista kodeków nie jest kompletna, ani nie wymieniono wszystkich ich funkcji (lub jej braku). Jeśli ta odpowiedź okaże się przydatna dla kogoś, mogę dodać trochę więcej informacji (i być bardziej precyzyjnym).

Być może najbardziej znanym formatem jest JPEG . Jest to bardzo szeroko obsługiwany, ale stary format. Wykorzystuje DCT (Discrete Cosine Transformation), więc chociaż oferuje całkiem dobrą jakość przy najwyższych ustawieniach jakości, blokowanie pojawi się z niższymi.

Potem pojawił się JPEG 2000, który zastąpił JPEG: Opiera się on na transformacji falkowej, więc chociaż oferuje mniej więcej tę samą jakość co JPEG w wyższych ustawieniach jakości, oferuje znacznie lepszą jakość w niższych ustawieniach jakości (bloki są nieco rozmyte ). Ponadto JPEG 2000 oferuje interesujące regiony (wysoka jakość w jednym obszarze obrazu, niższa jakość gdzie indziej) i wsparcie 16-bitowe. (Również kilka innych rzeczy.) Niestety (?), Ponieważ jest on bardziej kosztowny obliczeniowo niż JPEG i z powodu pewnych problemów licencyjnych, JPEG 2000 nie jest tak szeroko obsługiwany jak JPEG.

PNG to kolejny szeroko znany format - jest bezstratny i obsługuje kanały alfa, ale nie obsługuje przestrzeni kolorów innych niż RGB (takich jak CMYK). Dlatego jest to format „tylko online”.

Są też formaty VFX, takie jak OpenEXR . Wszystkie obracają się wokół jakości i szybkości: OpenEXR jest bezstratny, obsługuje do 64 bitów i szybko koduje / dekoduje. Jest stosowany głównie w branży VFX jako format pośredni.

TIFF to kolejny bezstratny format, który jest dość popularny wśród fotografów. Do kompresji oferuje brak / ZIP / RLE / LZW / JPEG. Obsługuje do 32 bitów. Dzięki kompresji do wyboru jest dość adaptacyjny, ale z powodu swojej bezstratności jest bardziej w formacie offline.

HEIF to jeden z najnowszych kodeków obrazu. Używa tej samej kompresji co HEVC / h.265 i dlatego oczekuje się, że zapewni lepszy współczynnik kompresji niż JPEG. Ponieważ jednak jest całkiem nowy i podlega patentom, nie jest tak szeroko wspierany, jak którykolwiek z powyższych.

Obrazy RAW Zobacz także nie są prawdziwymi zdjęciami, tak naprawdę: są raczej pojemnikiem na surowe (stąd nazwa) dane odczytu czujnika. Tylko z oprogramowaniem, które potrafi interpretować dane, można uzyskać obraz. Dlatego też konwertery RAW, takie jak Lightroom / Capture One / DarkTable / ..., wymagają aktualizacji w celu obsługi nowych aparatów, które używają już określonych pojemników, takich jak * .CR2 dla Canon. Jest to również powód, dla którego 14-bitowy plik RAW oferuje więcej opcji edycji niż 32-bitowy plik TIFF wyeksportowany z tego samego pliku RAW.


Intermisision: Lossless vs. lossy

Nadal nie jestem pewien, o co tak naprawdę pytasz, więc pomyślałem, że nie zaszkodzi dodać małe wyjaśnienie dotyczące strat bez strat.

Kompresja bezstratna polega na kodowaniu RLE / kodowaniu Huffmana / ... w celu kompresji danych. Same dane nie są zmieniane, ale zapisywane w mniejszym pakiecie. Na przykład weźmy RLE: powiedzmy, że mamy strumień bitów kanału R (od piksela 0,0do piksela 0,11) 255,255,255,255,255,215,215,235,100,000,000,000- RLE zakoduje to, ponieważ 52552215123511003000- jest znacznie mniejszy, a ponieważ wiemy, że jest zapisany w grupach po 4 cyfry i że pierwsza cyfra to licznik, a ostatnie trzy cyfry to wartość, a następnie możemy zrekonstruować pełny 255,255,255,255,255,215,215,235,100,000,000,000.

Z drugiej strony kompresja stratna stara się kompresować nawet dalej, niż może to zrobić bezstratna. Aby to zrobić, kodeki stratne zwykle próbują usunąć rzeczy, których nasza percepcja nie otrzymuje. Weźmy, na przykład, YUV( YCbCrnaprawdę) Model JPEG (i prawie każdy kodek wideo) wykorzystuje: Y = Luminance, Cb = Chrominance Blue, Cr = Chrominance Red. Człowiek nie może dostrzec różnicy między obrazem 4:2:0(każdy piksel ma wartość luminancji, ale kolory są zapisywane naprzemiennie w blokach 2x2) a 4:4:4obrazem (każdy piksel ma luminancję i oba kanały kolorów). Wynika to z fizjologii naszego oka : nie widzimy różnic w kolorze, a także widzimy różnice w luminancji.

Działa to dobrze przez większość czasu, ale porównaj to z plikiem MP3: prawie nikt nie jest w stanie dostrzec różnic między 192 kb / s a ​​320 kb / s, ale spada poniżej 64 kb / s, a sprawy stają się brzydkie. Ponowne kodowanie dodatkowo obniży jakość, ponieważ mogą pojawić się niechciane artefakty (np. W JPEG, małe bloki z kodowań wysokiej jakości będą uważane za szczegóły obrazu w dalszych kodowaniach).


Dolna linia

Jeśli nie przejmujesz się formatami zdjęć lub ich funkcjami, jedno z nich będzie w porządku. Przy odpowiednio wysokiej jakości ustawieniach jest możliwe i oczekiwane, że nawet nie zobaczysz różnicy między nimi.

Jeśli jednak potrzebujesz jakiejś konkretnej funkcji, może (i prawie na pewno: będzie) istniał kodek, który ją obejmuje.

flolilo
źródło
Dodałbym dwie rzeczy do twojej listy właściwości kodeka: 1. renderowanie progresywne (obecnie nie jest często używane, ale była dużą funkcją w PNG) 2. animacje (są animowane PNG, JPEG, GIF ...).
Sulthan,
@Sulthan Zastanowię się nad dodaniem, że chociaż progresywne - jak mówisz - nie jest dziś rzeczą uważaną za ważną, a animacja nie jest funkcją, która dotyczy fotografii. W każdym razie: dzięki za wkład!
flolilo,
2
„Tylko oprogramowanie, które potrafi interpretować dane, pozwala uzyskać obraz”, który jest prawdziwy dla każdego formatu obrazu. Jeśli oprogramowanie nie wie, jak interpretować, powiedzmy, dane JPEG, nie będzie w stanie wyświetlić ani przetworzyć go jako obraz. Surowe pliki przechowują dane, które pozwalają na rekonstrukcję z niego obrazu i są ustrukturyzowane w określony sposób (choć być może specyficzny dla modelu kamery). Jest to więc format obrazu, to nie tylko jeden format, ale „surowy format kamery X”.
0
1
@ n0rd Oczywiście. Ale pliki JPEG z mojego 5D Mk III spełniają te same specyfikacje (pozornie) jak w Nikon P7000 lub EOS M6. .CR2naprawdę mówi tylko: „spójrz na mnie, jestem plikiem RAW aparatu Canon! Przeczytaj mnie, jeśli masz odwagę!” - o to mi chodziło, chociaż stwierdził pan to w znacznie jaśniejszym języku.
flolilo
Przestrzenie LAB i XYZ istnieją w niektórych formatach obrazu.
joojaa
10

Jeśli rdzeniem zdjęcia są tylko 3 kanały wartości pikseli [0, 255] X RBG

Jest to poważnie złamane założenie, a reszta twojego pytania jest po prostu niemożliwa bez oderwania się od niego.

To znaczy, co czyni RAW innym niż TIFF - czy nie wszystkie są ograniczone do wartości z zakresu od 0 do 255?

Termin „surowy” może odnosić się do dwóch różnych rzeczy, obrazu „camera raw” lub pliku zawierającego surowe dane obrazu bez nagłówków.

Obraz „camera raw” przechowuje nieprzetworzone dane wychodzące z czujnika. Większość nowoczesnych czujników kamer ma przetworniki ADC z więcej niż 8 bitami, ale zbierają one również dane o intensywności dla jednego koloru w każdym miejscu. Geometria może być zniekształcona przez obiektyw, wartości intensywności z ADC mogą nie odwracać uwagi od postrzegania intensywności przez ludzi, składniki kolorów mogą nie być odwzorowane dokładnie na te używane przez monitor i tak dalej.

Potrzebny jest skomplikowany proces mapowania obejmujący interpolację, aby przekształcić nieprzetworzone dane czujnika w obraz RGB dobrej jakości i nie ma jednego właściwego sposobu na zrobienie tego. Ponadto ze względu na potrzebę interpolacji składników kolorów obraz RGB może być większy niż surowe dane.

Konwersji można (i często dokonuje się) w aparacie, ale wielu fotografów próbuje zapisać surowe dane, aby mogli dostosować przetwarzanie po fakcie.

Tiff jest złożonym formatem plików, w którym można przechowywać obrazy w wielu różnych formatach z szeroką gamą metadanych. W praktyce jest jednak zwykle używany do przechowywania nieskompresowanych lub bezstratnie skompresowanych obrazów RGB lub CMYK.

Pliki zawierające surowe dane obrazu bez nagłówków są rzadko używane, ponieważ musisz znać ich format i wymiary, zanim będziesz mógł je odczytać. Niektóre narzędzia do przetwarzania obrazów je obsługują.

Co więcej, z liczbowego punktu widzenia, co sprawia, że ​​coś w rodzaju obrazów 16-bitowych różni się od obrazów 32-bitowych?

Niestety „n bit” może oznaczać dwie różne rzeczy. Może to oznaczać, że wszystkie składniki koloru są wciśnięte w liczbę bitową (np. 5 bitów dla czerwieni, 5 bitów dla niebieskiego i 6 bitów dla zielonego dla 16 bitów lub 8 bitów czerwonego, 8 bitów zieleni, 8 bitów niebieskiego i 8 bitów alfa dla 32 bitów) lub at może oznaczać, że każdy składnik koloru ma n bitów informacji w każdym miejscu w pikselach.

Kontynuując z tą perspektywą, że obraz w systemie plików komputera jest tylko 3-kanałową tablicą liczb całkowitych od 0 do 255

Ponownie ta perspektywa jest po prostu błędna.

Plik jest sekwencją bajtów, ale te bajty prawie nigdy nie są „tylko 3-kanałową tablicą liczb całkowitych od 0 do 255”

Możesz przechowywać taki obraz. Niektóre narzędzia obsługują nawet odczytywanie i zapisywanie takich plików, ale problem polega na tym, że musisz wiedzieć o pliku, zanim będziesz mógł go odczytać. Załóżmy, że masz plik o wielkości 3000 bajtów, czy masz 1000 24-bitowych pikseli RGB? 3000 8-bitowych pikseli w skali szarości? 3000 8 bitowych pikseli z palety? W jakiej kolejności są komponenty kolorów? jaki kształt ma obraz? czy komponenty kolorów są w kolejności RGB lub BGR? O ile nie znasz odpowiedzi na te pytania, nie możesz sensownie przeczytać takiego pliku.

Tak więc praktyczne formaty obrazów zwykle zaczynają się od jednego lub więcej nagłówków, które identyfikują typ pliku, wymiary obrazu i sposób przechowywania rzeczywistych danych obrazu. Mogą również zawierać opcjonalne metadane.

jaki jest sens kompresji obrazu do stratnego formatu, takiego jak na przykład JPG? Powiedz, że algo kompresji zmienia niektóre wartości pikseli z 254 na 255 lub cokolwiek innego. Więc? W jaki sposób zapewnia to oszczędności w rozmiarze pliku lub wpływa na jakość obrazu?

Algorytmy kompresji nie tylko „zmieniają wartości”, ale kodują informacje w zupełnie inny sposób, na przykład JPEG można z grubsza opisać jako

  • Konwertuj dane z RGB na YUV
  • (opcjonalnie) zmniejsz rozdzielczość kanałów chrominancji o współczynnik 2 w jednym lub obu wymiarach
  • Podziel dane dla każdego kanału na bloki 8x8.
  • Przekształć bloki w domenę częstotliwości za pomocą dyskretnej transformacji kosinusowej
  • Kwantyzuj wyniki, zachowując informacje o niskiej częstotliwości, jednocześnie zmniejszając precyzję informacji o wysokiej częstotliwości.
  • Zakoduj uzyskane liczby jako sekwencję bajtów przy użyciu schematu kodowania o zmiennej długości (kodowanie Huffmana lub kodowanie arytmetyczne)
  • Zapisz te bajty w pliku wraz z odpowiednimi nagłówkami.

Z drugiej strony, bezstratnie skompresowane formaty często bazują na algorytmie kompresji danych ogólnego przeznaczenia, ale czasem uzupełniają je o wstępne przetwarzanie specyficzne dla obrazu, na przykład wygląda PNG.

  • Konwertuj dane na jeden z obsługiwanych formatów (np. Każdy bit dla koloru czerwonego, zielonego i niebieskiego w tej kolejności)
  • Dla każdego wiersza obrazu wykonującego procesy „filtrowania” istnieją opcje filtrowania serwerowego (w tym w ogóle brak filtrowania), ale ogólnym celem jest pobranie informacji specyficznych dla obrazu, że piksel może być podobny do swoich sąsiadów i kodować to w sposób, z którym może poradzić sobie „deflacja”.
  • Skompresuj filtrowane dane za pomocą algorytmu kompresji ogólnego przeznaczenia „deflate”.
  • Zapisz te bajty w pliku wraz z odpowiednimi nagłówkami.
Peter Green
źródło
1
To chyba najlepsza odpowiedź tutaj, mówi o obu różnych formatach plików do przechowywania i kompresji obrazów oraz o tym, jak błędne jest założenie, że obraz jest zbiorem liczb od 0-255
pfg
Dobrze wspomina o kolejności komponentów. Zakładam, że rzeczy takie jak Opengl 2 miały dobre powody, aby mieć funkcje do czytania różnych permutacji rzędu RGB. Szczerze mówiąc, bez standardowych lub metadanych nie znasz nawet początku ani kierunku obrazu, nie mówiąc już o długości linii. Jeśli załadowałeś duszka zagłady, nawet po
zajęciu się paletą
Mam wrażenie, że kolejność komponentów jest trochę jak endian. Niektórzy dostawcy systemów wybrali RGB, podczas gdy inni (głównie Windows) wybrali BGR.
Peter Green,
9

Istnieje kilka powodów, dla których to założenie jest nieprawidłowe i wszystkie sprowadzają się do jednej rzeczy:

Jakiej skali używasz?

I można to nieco dalej rozbić:

Co to jest 255?

„Kolor” nie jest własnością fizycznego wszechświata. To odczucie powstaje w umyśle. I obejmuje to takie rzeczy jak „niebieski”, „zielony” i „czerwony”. Skala od 0 oznacza „brak niebieskiego” do 255 oznacza „cały niebieski!” nie mogę tak naprawdę mieć 255 reprezentującego platońskiego ideału niebieskiego , ponieważ ... w prawdziwym świecie nie ma czegoś takiego idealnego. Czy to oznacza:

  • najbrzydsza rzecz, jaką możesz zrobić na urządzeniu przed sobą?
  • tak blisko idealnego dopasowania do czystego niebieskiego z punktu widzenia ludzkiego systemu wizyjnego, nawet jeśli większość ekranów i kombinacji drukarek / atramentu / papieru nie jest w stanie tego przedstawić?
  • całkiem dobry niebieski, który prawdopodobnie będzie reprezentowany na wielu różnych urządzeniach?
  • niebieski, który jest poza zasięgiem wzroku człowieka, ale który pozwala potrójnej osłonie RGB na większość kolorów, które są w zasięgu?

Dźwięk wymyślony? Nie! To są prawdziwe przykłady. Sprawdź te reprezentacje każdego wyboru. Zakrzywiony obszar jest dwuwymiarowym wycięciem przestrzeni kolorów ludzkiego wzroku, a trójkąt pokazuje obszar, który można przedstawić, biorąc pod uwagę konkretny wybór koloru czerwonego, zielonego lub niebieskiego.

Po pierwsze, oto profil mojego ekranu laptopa, który jest dość reprezentatywny dla obecnych urządzeń klasy średniej:

ThinkPad X260

Oto przestrzeń Adobe RGB. Zauważ, że jest to o wiele większe niż to, co może pokazać mój ekran!

AdobeRGB

Oto sRGB - standard defacto i domyślna przestrzeń zwykle przyjmowane, gdy nic nie jest określone. W większości sytuacji ma być „wystarczająco dobry”.

sRGB

I wreszcie ProPhoto RGB, które używają wyimaginowanych kolorów jako kolorów podstawowych , aby trójkąt był wystarczająco duży, aby pasował do prawie całej ludzkiej wizji.

ProPhoto RGB

Teraz dodaj kolor samego światła i adaptację chromatyczną - zdolność ludzkiego systemu wizyjnego do dostosowania percepcji do otoczenia. W rzeczywistości nie tylko zdolność: coś, co się dzieje, czy tego chcesz, czy nie . Czy „czysty niebieski” oznacza, że ta rzecz wygląda tak niebiesko, jak to możliwe, w świetle tego żarowego światła? Jaka powinna być wartość, jeśli zamiast tego fotografujemy w świetle słonecznym?

Zatem „255” może oznaczać wiele różnych rzeczy.

Co to jest 0?

Jest to dość proste - jak czarne potrzebujesz 0, aby być? Czy to vantablack czarny? Jeśli tak, ale wszystkie rzeczywiste odcienie w twojej scenie są znacznie mniej ekstremalne , czy naprawdę chcesz „zmarnować” garść potencjalnych wartości dla zakresu dynamicznego, którego nie ma na twojej scenie - i który, podobnie jak kolor, może nie będzie reprezentowany przez żadne urządzenie lub drukarkę, do której masz dostęp?

Jaka jest twoja krzywa?

Więc kiedy masz swoje punkty końcowe, jak przechodzisz od jednego do drugiego? Ludzkie postrzeganie jasności jest zdecydowanie nieliniowe . Czy w twojej skali 0-255 100 powinno być dwa razy jaśniejsze niż 50, czy może to być jakiś większy czynnik? Czy różnica percepcyjna między, powiedzmy, 3 i 4 powinna być taka sama jak różnica między 203 a 204?

Jeśli zdecydujesz się na system przechowywania logów, czy ta krzywa powinna być zoptymalizowana, aby pasowała do ludzkiego wzroku, do optymalizacji danych lub do czegoś innego?

Istnieje wiele możliwości dla wielu różnych potrzeb.

Po kompresji

Ty pytasz.

Powiedz, że algo kompresji zmienia niektóre wartości pikseli z 254 na 255 lub cokolwiek innego. Więc? W jaki sposób zapewnia to oszczędności w rozmiarze pliku lub wpływa na jakość obrazu?

Nowoczesne algorytmy kompresji są bardziej skomplikowane, ale stanowi to dobry przykład. Będę używał szesnastkowej FFdo reprezentowania 255 i FEdo reprezentowania 254, i wyobraź sobie, że używamy kodowania długości przebiegu jako formy kompresji. Dla uproszczenia załóżmy czarno-biały zamiast koloru. Dzięki temu, jeśli mamy wiersz danych, który wygląda następująco:

FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 

możemy to skompresować w bardzo prosty sposób

16×FF 

... co jest dość oczywistymi oszczędnościami. Zasadniczo możemy przechowywać 16 bajtów na dwa (jeden na zliczanie, dwa na dane). Ale powiedzmy, że mamy:

FF FF FE FF FE FF FF FF FF FF FE FE FE FF FE FE

Teraz kodowanie długości przebiegu daje nam:

2×FF 1×FE 1×FF 1×FE 5×FF 3×FE 1×FF 2×FE

... co wcale nie oznacza oszczędności, a w rzeczywistości mogłoby zwiększyć rozmiar pliku. Ale jeśli zaokrąglimy wszystkie FEwartości do FF, wrócimy do pierwszego przypadku, ze znacznym zmniejszeniem rozmiaru, z niewielkim, ale prawdopodobnie trudnym do zauważenia wpływem na jakość pliku.

Oczywiście jest to trywialny, wymyślony przykład, ale wszystkie algorytmy kompresji stratnej mają tę podstawową cechę: utrata danych ułatwia korzystanie z bardziej kompaktowego formatu pamięci, przy, miejmy nadzieję, niezbyt zauważalnej zmianie.

Na głębokości bitów

Co więcej, z liczbowego punktu widzenia, co sprawia, że ​​coś w rodzaju obrazów 16-bitowych różni się od obrazów 32-bitowych? Ponownie, obraz jest po prostu tablicą o wartościach całkowitych od 0 do 255.

Więc ..... tablica liczb całkowitych z przedziału od 0-255 jest tablicą ośmiobitową . (2⁸ = 256.) Przy trzech kanałach jest to obraz 24-bitowy; niektóre formaty mają również kanał przezroczystości („alfa”) dla 32 bitów. Można również użyć wyższej wartości na kanał, co zwykle mamy na myśli, mówiąc „głębokość 16 bitów”. Oznacza to, że tablica ma zakres 0-65535 (2¹⁶ = 65536), a nie 0-255. Zasadniczo w takim schemacie jest to po prostu mnożnik, w którym najwyższa wartość reprezentuje to samo na każdej skali, ale większa głębokość bitowa daje więcej możliwych niuansów. (Zobacz tę odpowiedź, aby uzyskać więcej informacji na ten temat.) Istnieją również niektóre specjalistyczne formaty plików, które używają 64-bitowych liczb zmiennoprzecinkowych (!) Zamiast liczb całkowitych dla wartości lub innych typów danych w zależności od przypadku użycia, ale podstawowa koncepcja jest taka sama .

mattdm
źródło
s / 0-65536 / 0-65535 /
Ruslan
1
@Ruslan Dobry połów. Przepraszam za przepełnienie bufora. :)
mattdm
Również dobre wyjaśnienie, dlaczego sukienka była tak polaryzująca, FWIW
Wayne Werner
8

Nie, obraz to nie tylko wartości RGB z zakresu 0–255. Nawet jeśli zignorujesz formaty pamięci, istnieje wiele sposobów na opisanie koloru. Oto kilka przykładów:

  • Elementy czerwone, zielone i niebieskie (RGB)
  • Elementy cyjan, magenta, żółty i czarny (CMYK)
  • Barwa, nasycenie i jasność / wartość (HSL / HSV)
  • Ilość światła, które trafiło w grupę czujników w kamerze
  • Ilość światła i jego kierunek w momencie uderzenia w czujniki (w kamerze pola świetlnego )

Pierwsze dwa są najczęściej używane do wyświetlania odpowiednio na monitorach i drukowania.

Ponadto obraz to nie tylko piksele, ale także metadane. Mogą to być takie elementy, jak szerokość w liczbie pikseli, szerokość fizyczna, jeśli chcesz go wydrukować, obraz miniatury , a nawet położenie geograficzne aparatu podczas robienia zdjęcia.

Faks
źródło
6
I nawet przy czymś tak „prostym” jak RGB, istnieją różne przestrzenie kolorów. Prosta 24-bitowa mapa bitowa RGB może na przykład zostać skorygowana gamma - i bez odwrócenia tej korekcji, będzie wyglądać na zbyt ciemną. Rozkład intensywności może być liniowy lub dowolny. Adobe RGB i sRGB są 24-bitowymi bitmapami RGB, ale mają bardzo różne odwzorowanie „tych samych” kolorów. Podobnie jak „nie ma czegoś takiego jak zwykły plik tekstowy”, nie ma formatu „zwykłego obrazu”. Najlepsze, co możesz uzyskać, to „natywny format obrazu dla tego konkretnego systemu / aplikacji”.
Luaan,
1
Nigdy nie widziałem formatu, który przechowuje dane hsv / hsl, ale widziałem takie, które przechowują dane LAB lub XYZ
joojaa
2
@Luaan Powinieneś rozwinąć tę odpowiedź. Różnice gamma to jedna rzecz, której nikt inny nie dotykał w odpowiedziach.
Tim Seguine,
5

Twoje założenie nie jest złe: każdy obraz może być reprezentowany przy użyciu N-wymiarowej tablicy skończonych wartości. Osobiście generalizuję to za pomocą dyskretnej geometrii zamiast matrycy, ale istota jest taka sama. Ale to treść, a nie plik.

Jednak formaty plików są różne. Zasadniczo istnieje kilka różnych sposobów przedstawienia tego samego obrazu, na przykład wspomniane osoby: bmp, png, jpg itp. Oczywiście po ich zdekodowaniu dwie bezstratnie zakodowane wersje tego samego obrazu doprowadzą do tych samych matryc.
Pomyśl o tym jak o pliku .txt, który skompresowałeś za pomocą zip. Z dodatkową dziwnością, że bezstratne kodowanie zwróci tekst, który nie jest taki sam jak oryginalny, ale naprawdę zamknięty, prawie jak stępiona wersja tekstu.

Pozostając przy analogii tekstu, załóżmy, że masz ten sam tekst zapisany jako .txt, .docx, .pdf itp. Dlaczego nie wszystkie pliki są dokładnie takie same, jeśli treść jest taka sama? (Ok, txt nie ma formatowania, ale inne mają).

Przy okazji sprawdź, jak naprawdę kodowanie Netpbm różni się od JPEG .

Fábio Dias
źródło
3

W przypadku formatów RAW i TIFF, o ile mogę powiedzieć, odpowiedź (jak powiedzieli inni) jest taka, że ​​w rzeczywistości nie zawsze używają tych samych przestrzeni kolorów (np. Pliki RAW mogą wykorzystywać więcej bitów na piksel, więc mogą przechowywać dokładniejsze informacje o kolorze) .

Ale aby przejść do sedna pytania - czasami są obrazy, które są przechowywane w różnych formatach, ale każdy ostatecznie reprezentuje dokładnie tę samą tablicę liczb.

Dobrym przykładem tego są różnice w kompresji między plikiem PNG a plikiem TIFF.

Pliki PNG używają jednego konkretnego algorytmu kompresji. Oznacza to, że obraz nie będzie przechowywany tylko jako duża lista liczb dla każdego piksela. Uproszczony przykład: może przechowywać coś, co mówi „w tym 10x10 bloku pikseli wszystkie piksele mają kolor XYZ”. Następnie zamiast przechowywać te informacje 100 razy, przechowuje je raz, a także odrobinę informacji o regionie, którego dotyczą.

Problem polega na odzyskaniu oryginalnej tablicy liczb (reprezentujących kolory), abyś mógł ją wyświetlić lub edytować lub cokolwiek innego, potrzebujesz oprogramowania, które wie, jak interpretować te skompresowane informacje.

Pliki PNG zawsze używają tego samego algorytmu kompresji, więc oprogramowanie obsługuje wszystkie prawidłowe pliki PNG. Z drugiej strony niektóre obrazy mają strukturę, która nie nadaje się do algorytmu kompresji PNG, więc niektóre pliki PNG mogą być dość duże.

Z drugiej strony pliki TIFF obsługują wiele różnych algorytmów kompresji. W rzeczywistości może nawet przechowywać różne części obrazu inaczej skompresowane. I obsługuje „rozszerzenia”, dzięki czemu można kompresować obrazy przy użyciu zastrzeżonych sposobów. Może więc górna połowa obrazu zostanie skompresowana przy użyciu metody podobnej do PNG, ale nie skompresuje ona dobrze dolnej połowy, więc dolna połowa zostanie skompresowana przy użyciu innej metody.

Dzięki temu pliki TIFF są bardziej elastyczne - możesz przechowywać dokładnie tę samą tablicę liczb przy użyciu mniejszej liczby bajtów. Ale oprogramowanie potrzebne do zdekodowania obrazu będzie bardziej skomplikowane i może nie działać konsekwentnie z każdym plikiem TIFF, który do niego wrzucisz, np. Możesz zapisać plik TIFF w jednym oprogramowaniu i nie będzie można go otworzyć przy użyciu innego oprogramowania, chociaż nadal działa w oryginale.

Więc pytasz

Ale nie pytam o nic innego niż podstawowy 3-kanałowy obraz RBC. Wiem tylko, że jeśli ktoś poda mi jedną z nich, mam teraz szereg liczb. Nie mam powodu, aby wiedzieć, dlaczego jedna tablica liczb może być inna niż jakaś inna tablica liczb od 0 do 255.

Aby przekazać go Tobie, ktoś musiał wiedzieć, w jaki sposób obraz był przechowywany i jak przełożyć go na tablicę liczb. (Być może niektóre programy wykonują to tłumaczenie dla Ciebie bez wiedzy).

Możesz spróbować zapisać obraz jako PNG i ponownie jako TIFF lub GIF i spojrzeć na niego w przeglądarce szesnastkowej, aby zobaczyć, jak każdy z nich reprezentuje tę samą tablicę liczb inaczej. Lub zapoznaj się ze szczegółami, w jaki sposób pliki PNG i TIFF są wewnętrznie reprezentowane, aby dać ci wyobrażenie o tym, co należy wbudować w oprogramowanie, aby odczytać identyczne tablice liczb w różny sposób.

LangeHaare
źródło
1
But to get to the crux of your question - sometimes there are images which are stored in different formats, but each ultimately represents exactly the same array of numbers.Może tak być w przypadku obrazów bezstratnych - ale jest całkowicie błędne, jeśli np. Porównasz obraz HEIF o niskiej przepływności z JPEG o niskiej przepływności .
flolilo
1
@ flolilolilo tak, dlatego powiedziałem „czasami” - moją interpretacją pytania było to, że pytali „jeśli skończę z dokładnie taką samą siatką kolorów, jaka jest różnica między plikami”. Mówiłem więc o kompresji bezstratnej jako uproszczonym przypadku, w którym można uzyskać dokładnie taką samą siatkę liczb z różnych typów plików przy użyciu różnych metod kompresji.
LangeHaare
Raw prawie nigdy nie używa więcej bitów na „piksel”, ale RAW również nie opisuje pikseli, opisuje strony fotograficzne. Obrazy RAW to nieprzetworzone dane czujnika z każdego czujnika, a każda strona ma tylko 1 kanał, a nie 3. Kanały RGB są określane na podstawie sąsiadujących ze sobą stron o innych kolorach. Pliki RAW będą zasadniczo mniejsze niż nieskompresowane obrazy powstałe w wyniku przetwarzania RAW.
AJ Henderson
1
Na przykład 16-bitowy raw wykorzystuje tylko 16 bitów na „piksel”, ale nieskompresowany 8-bitowy kolor BMP będzie używał 24 bitów na piksel, ponieważ musi przechowywać 8 bitów informacji dla koloru czerwonego, zielonego i niebieskiego. Powodem, dla którego RAW można bardziej dostosować, jest to, że informacje o kolorze nie zostały jeszcze połączone. Możesz zmieniać takie rzeczy, jak balans bieli (które zmieniają wpływ poszczególnych kolorowych stron na zdjęcie w określaniu informacji o kolorze każdego z powstałych pikseli).
AJ Henderson
3

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.

Brythan
źródło
3

Powiedzmy, że to prawda, że ​​każdy piksel miał tylko trzy cyfry (czerwony, zielony i niebieski) każdy w zakresie 0–255. Inni respondenci rozpoczęli od (prawidłowego) zakwestionowania tego założenia, ale dla uproszczenia powiedzmy, że to prawda.

Pamiętam (ale niestety nie mogę znaleźć w Internecie) kreskówkę z podręcznika lingwistycznego: dwa starożytne egipskie kamienne rzeźby siedzą wyczerpane na dole masywnej ściany, na której wyryły bardzo dużą liczbę maszerujących postaci. Jedno mówi drugiemu: „Z pewnością musi być łatwiejszy sposób na napisanie:„ Faraon miał 100 000 żołnierzy? ”. Pamiętaj o tym pomyśle.

Załóżmy teraz, że pierwszy rząd obrazu zawiera 1800 czarnych pikseli. Jak by to było reprezentowane?

0 0 0    0 0 0     0 0 0   ....

Ile miejsca to wymagałoby? Każda wartość jest bajtem. Trzy bajty na piksel, 1800 pikseli w rzędzie, więc już 5400 bajtów na wiersz. Obraz o wymiarach 1800 x 1200 musi zająć 1200 razy tyle, czyli ponad 6 megabajtów. Przejdźmy teraz do wyszukiwania obrazów Google i pobierzmy kilka obrazów 1800 x 1200 - powiedzmy jeden .pngobraz i jeden .jpgobraz. Spójrz na rozmiar pliku: czy to 6 MB? Nie ma mowy, zwykle jest znacznie mniejszy niż to. I to jest pożądane, oczywiście, cała ta oszczędność miejsca i krótszy czas pobierania ...

Więc co się dzieje? Kluczem jest to, że nawet jeśli masz tyle numerów do przechowywania, istnieją różne sposoby reprezentacjite liczby w pliku. Oto przykład bardziej wydajnej reprezentacji tutaj, w mojej odpowiedzi, dwa akapity temu. Napisałem słowa „1800 czarnych pikseli”. To 17 znaków, więc nie musi zajmować więcej niż 17 bajtów, ale doskonale opisuje dokładnie te same informacje, dla których naszym zdaniem potrzebowaliśmy 5400 bajtów. I na pewno możesz zrobić lepiej niż 17 bajtów (a także zaoszczędzić dużo wysiłku przy implementacji kodowania / dekodowania), jeśli nie użyjesz języka angielskiego do kodowania tych informacji, ale raczej języka specjalnego. Więc teraz już wprowadziliśmy więcej niż jeden format kompresji obrazu: taki, który używa angielskich słów i jeden, który jest bardziej wydajny. Widzisz dokąd to zmierza?

OK, mówisz, to działa, jeśli cała wiązka sąsiednich pikseli ma ten sam kolor. Ale co jeśli nie? Cóż, jasne, zależy to od zawartości konkretnego obrazu: im więcej jest nadmiarowości , tym łatwiej jest skompresować informacje. Nadmiarowość oznacza, że ​​części obrazu można dość dobrze przewidzieć, jeśli znasz już inne części. Kompresja oznacza jedynie zapisanie absolutnego minimum niezbędnego do odtworzenia informacji. Nie każdy możliwy obraz ma nadmiarowość, ale każdy prawdziwy obraz, który ma znaczenie dla ludzkiego oka i mózgu, mimo że jest bardziej złożony niż mój przykład z czysto czarnego przykładu, nadal będzie miał dość dużą nadmiarowość. Istnieje wiele różnych sposobów kompresji. Niektóre metody kompresji są bezstratne, co oznacza, że ​​informacje można zrekonstruować tak, aby były matematycznie identyczne z oryginałem, jak w moim przykładzie z czarnym rzędem pikseli. Większość .pngplików korzysta z bezstratnej metody kompresji. Niektóre metody są stratne : rekonstrukcja nie jest doskonała, ale błędy są ukryte w taki sposób, że ludzkie oko i mózg prawie ich nie zauważają. Większość .jpgplików jest stratna.

Szczegóły tego, jak rozpoznajesz skomplikowane wzorce redundancji i jak piszesz ich efektywne skompresowane opisy, są wysoce matematyczne i nietrywialne, dlatego jest miejsce na tak wiele różnych formatów, odpowiadających różnym strategiom kompresji. Ale mam nadzieję, że rozumiesz zasadę.

Kilku komentujących powyżej podało rozsądne przypuszczenia, gdzie mogło powstać twoje nieporozumienie. Wydaje ci się, że w twoim pytaniu kompresja tylko nieznacznie zmienia wartości pikseli (i oczywiście metody kompresji stratnej robią to miejscami, ale tylko jako niepożądany efekt uboczny) bez zmiany układu informacji. Kiedy otwierasz plik i patrzysz na zawartość obrazu (na przykład jako tablicę liczb w Matlabie lub jako obraz na ekranie w Photoshopie), nie patrzysz na zawartość skompresowanego pliku, ale raczej na rekonstrukcję, który ma taki sam układ jak oryginał (nie byłaby to duża rekonstrukcja, gdyby nie odtworzył poprawnie układu). Procedura otwierania pliku zdekompresowała informacje z pliku do pełnej nieskompresowanej reprezentacji w pamięci. Jeśli porównasz dwie nieskompresowane rekonstrukcje, to rzeczywiście nie ma nic, co można by rozróżnić między dwoma różnymi formatami obrazu, z których pochodzą (z wyjątkiem ewentualnych błędów rekonstrukcji).

jez
źródło
1

Tak, ale sposób, w jaki dostajesz się do tych 1 i 0, jest bardzo różny.

Podam przykład, ale jest on fałszywy i ma ilustrować więcej niż być dokładny. Należy pamiętać, że wszystkie obrazy cyfrowe są reprezentowane w postaci binarnej na pewnym poziomie.

Aby skomplikować sprawę, istnieją różne kanały. CMYK, RGB, czarno-biały, żeby wymienić tylko kilka. Nie będziemy w to wchodzić. Istnieją również różne etapy, takie jak przechwytywanie, przechowywanie i wyświetlanie. Zajmiemy się tym, choć znowu przykład ma wykazać, że nie jest dokładny. Jeśli potrzebujesz dokładnych przykładów, musisz znaleźć mnóstwo dokumentów technicznych.

Tak więc w naszej próbce będziemy patrzeć na czarno-biały obraz.

00067000
00067000
00567800
04056090
40056009

Liczby pokazują, jak silny jest „czarny”. W ten sposób aparat przechwycił obraz. To przyzwoity aparat, więc też przechowuje obraz.

Teraz zapisuje obraz na komputerze, ale zajmuje dużo miejsca, więc go skompresujemy. Oprócz zacierania, wiemy również, że większość ludzi nie może wykryć różnicy o 1 poziom czerni, więc zamierzamy go trochę wygładzić.

302730
302730
204820
*04056090
1420262019

W ten sposób przechowujemy obraz na dysku. Zajmuje mniej miejsca i pozwala nam wyprodukować dużą część oryginalnego obrazu.

Powiedzmy, że chcemy wydrukować go na drukarce. Drukarka drukuje tylko jeden poziom czerni, więc komputer tłumaczy zapisany, skompresowany obraz na mowę drukarki.

00011000
00011000
00111100
01011010
10011001

To drukuje obraz o rozsądnym wyglądzie, ale widać nawet skrajny brak jakości. Ale hej, to wina drukarki.

Na koniec wydrukujesz obraz na dobrej drukarce z 10 poziomami czerni. Taki sam jak twój aparat. Więc używasz zapisanego i skompresowanego obrazu.

00077000
00077000
00888800
04056090
40066009

Jak widać obraz jest „lepszy”, ale został nieco zmieniony w stosunku do oryginału.

W danym momencie masz rację, że to tylko siła kanału. A poza skompresowanym obrazem, który i tak musi zostać zdekompresowany, pozostaje w tym całkiem wierny.

Jednak skompresowany format traci wiele „informacji”. Czy ta informacja jest ważna? Cóż, to zależy od artysty i publiczności. Istnieje kilka kompromisów między oszczędnością miejsca, czasem przetwarzania, jakością końcowego / przechowywanego obrazu i potrzebą. Skanuję większość moich dokumentów w jednym kolorze czarnym, ponieważ to wszystko, czego potrzebuję. Jednak moje zdjęcia ślubne są w formacie OGROMNEGO RAW, ponieważ nigdy nie wiem, kiedy będę chciał je wydrukować. To powiedziawszy, kiedy przesyłam je (zdjęcia) do cyfrowej ramki na zdjęcia, przekształcam je w JPEG, aby zaoszczędzić miejsce. Różne kanały, różne filtry i różne metody kompresji to szereg kompromisów. To jest jak cyfrowa wersja trójkąta drukarek.

Coteyr
źródło
Twój drugi blok kodu (skompresowany) pokazuje RLE, prawda? Prawdopodobnie powinieneś powiedzieć, że zastępujesz próbki liczbą powtórzeń + wartością próbki, aby ludzie wiedzieli, jaki rodzaj kompresji, ponieważ jest to całkowicie nieoczywiste, jeśli nie oczekujesz RLE.
Peter Cordes,
1

Zajmę się trochę dodatkowymi informacjami, ponieważ pracowałem z wykrywaniem obrazu i kodowaniem / kompresją, aczkolwiek głównie z ruchomymi obrazami.

W swojej podstawowej formie obraz (KAŻDY obraz) wyświetlany na konkretnym ekranie JEST po prostu identyczną tablicą liczb. Wszystkie te liczby mogą wynosić 0-255 lub 0-65535 lub 0-cokolwiek-32-bitów-to-ja-zapomniałem google-it.

ALE istnieje tak wiele sposobów PRZECHOWYWANIA i TRANSPORTU tych informacji, wiele z nich to po prostu produkty technologii zagubionych w mgle czasu.

Ponadto jednym szczegółem, o którym nie widziałem żadnego z pozostałych pedantów tutaj, jest to, że dane z matrycy RAW z aparatu cyfrowego mogą być RGrGbB w układzie Bayera lub coś, co należy przetworzyć przynajmniej trochę, aby zrobić jakikolwiek sens dla ludzkiej gałki ocznej Mk.1. Możliwe, że nigdy nie dostaniesz tego nawet w formacie RAW zapisanym przez DSLR, ponieważ jest bezużyteczny, dopóki nie przekonwertujesz go na ładną siatkę pikseli RGB lub YUV, o głębokości 8, 16, 32 lub jedenastu biliardów.

Rzeczy, nad którymi pracowałem, używają YUV wewnętrznie z jakiegokolwiek powodu, zakładam, że są one łatwiej przetwarzane przez kodeki, ponieważ ludzie postrzegają jasność z dużo większą czułością niż kolorem.

Aby zapoznać się z lekkim czytaniem na dobranoc, zobacz sekcję „format obrazu ramki”: http://focus.ti.com/lit/ug/sprufg8b/sprufg8b.pdf

W każdym razie ... wróć do pierwotnego pytania na temat różnicy między nieskompresowanymi plikami obrazów, takimi jak TIFF / RAW / IFF / PNG.

Zasadniczo istnieją one dlatego, że wiele księżyców temu każdy producent komputera / systemu operacyjnego / drukarki wymyślił swój nieco inny zestaw wymagań dotyczących sposobu przechowywania / wysyłania obrazów.

Tak więc, RAW, jak omawiali inni w tym wątku, jest ogólnym terminem określającym kilka różnych rzeczy zapisanych przez różne aparaty cyfrowe, wykorzystujących dowolny ładunek danych, które producent aparatu uznał za ważne, w oparciu o funkcje, które ich aparat ma lub może mieć w przyszłości. Tak więc, chociaż główny bit danych obrazu może być bardzo podobny, otaczające go „opakowanie”, które opisuje obraz i wszystkie ustawienia aparatu itp., Więc jeden plik nie zostałby zrozumiany przez innego producenta.

Tradycyjnie jest to tak, że mogą zmusić Cię (lub, bardziej prawdopodobne, profesjonalnych fotografów) do korzystania z ich zastrzeżonego (a czasem drogiego) oprogramowania do przetwarzania obrazów o wyższej jakości, w przeciwnym razie możesz zacząć korzystać z kosztownego oprogramowania innych osób. Ponadto, być może Adobe Photoshop chce obsługiwać ich format, więc może mogą pobierać opłaty za Adobe $$$ za te informacje, aby bardziej profesjonalni fotografowie kupili PS i być może kupiliby ten aparat, ponieważ PS obsługuje go teraz. Przytulny!

RAW przechowuje również informacje o tym, jak przekształcić ten konkretny pakiet danych z powrotem w obraz widoczny dla ludzi, po prostu wprowadzając wszystkie poprawki, które należy wprowadzić, aby obraz wyglądał „dobrze”.

TIFF był wczesnym formatem obrazu, który był używany między innymi do przesyłania danych graficznych do drukarek (kiedy drukarki obsługujące grafikę zaczęły być dostępne). To był dość prosty, więc łatwy do przetworzenia na małym, tanim mikroprocesorze wewnątrz drukarki.

IFF (tak, to jest coś) był podobnym formatem używanym na komputerach Amiga, wierzę, że wymyślony przez nich lub jeden z popularnych pakietów farb. Ale używam go tutaj jako przykładu, ponieważ chociaż przechowuje dane obrazu mapy bitowej, podobnie jak inne, obsługuje dane nieskompresowane lub RLE, zmienne głębokości bitów od 1-bitowego mono do 8-bitowego 256-kolorowego (ale z 3x8-bitowa paleta RGB do wyboru dla każdego z kolorów), a także specjalne tryby zwane Halftone i Hold-And-Modify, pozwalające na uzyskanie większej liczby kolorów niż inne maszyny z tamtych czasów. Aha, a także obsługuje animację (jak GIF), więc plik IFF może przechowywać dowolną liczbę ramek, ze zmiennymi opóźnieniami między ramkami, a każda ramka może mieć własną paletę. Zatem IFF zawiera dodatkowe dane do obsługi tego wszystkiego w porównaniu, powiedzmy, z plikiem TIFF.

PNG to kolejny bezstratny format obrazu, ponownie przechowujący dane bitmapowe, ale obsługujący niektóre funky, takie jak 8-bitowy kanał alfa zapewniający zmienną przezroczystość obrazu (przydatny na stronach internetowych), więc ponownie „ładunek” danych obrazu może wyglądać bardzo podobnie ale opakowanie wokół niego jest inne, a ładunek może zawierać RGBA, a nie tylko dane RGB na piksel.

Tak więc opisano 4 różne formaty plików graficznych - możesz przechowywać przykładowy kolorowy obraz HD kota w dowolnym z 4 i wyglądałby identycznie, każdy piksel na ekranie miałby DOKŁADNĄ SAMĄ wartość i NIE byłoby różnica w jakości między 4 ... ale 4 pliki prawdopodobnie będą miały różny rozmiar, układ i będą łatwiejsze lub trudniejsze do załadowania i przetworzenia przez oprogramowanie.

Mam nadzieję, że to pomaga!

John U
źródło
0

Pomyślałam, że włączy się tutaj informacja, która powinna była znaleźć się w pierwszej odpowiedzi na to pytanie.

Piksele w obrazie nie są zapisywane w bajcie - chyba że obraz jest monochromatyczny, tj. Tylko czarno-biały.

Jeśli masz obraz truecolor, każdy piksel jest reprezentowany przez 16 bitów lub 2 bajty - jako jedną wartość. Jeśli masz obraz 32-bitowy, każdy piksel wymaga 32 bitów lub 4 bajtów, ponownie jako pojedynczej wartości.

co ciekawe, pliki graficzne i dźwiękowe oraz każdy inny typ danych w komputerze sprowadza się do bitów 1 i 0. Jedynie poprzez interpretację ich w kawałkach o odpowiedniej wielkości, znaczenie jest z nich wydobywane.

Na przykład obraz i dokument tekstowy oraz plik mp3 mają tę samą podstawową zawartość danych (wiązka bajtów), a każdy z nich może być interpretowany jako jeden z innych typów - można interpretować słowo doc jako dźwięk plik i usłyszysz coś, ale nie byłaby to muzyka. Na pewno można zinterpretować plik dźwiękowy jako obraz, który coś by wyświetlał, ale nie byłby to spójny obraz.

Podsumowując, komputer wie tylko o bitach - trochę to 1 lub 0. Wszystkie obrazy, dźwięki, dokumenty, filmy, wideo, nagrania, gry, rozmowy telefoniczne, SMS-y i wszystko inne oznaczone jako cyfrowe ma dokładnie to samo content - wiązka 1 i 0. Zera i jedynki stają się obrazami, dźwiękami i dokumentami oraz wszystkim innym, ponieważ czytający je kod wie, jak czytać te bity w grupach i odpowiednio je przetwarzać.

Dlatego mamy 16-bitowe i 32-bitowe obrazy oraz 16-bitowe i 24-bitowe pliki audio. Im więcej bitów użyjesz na piksel lub próbkę dźwięku, tym bardziej wyrazisty możesz być - 16 bitów może zdefiniować tylko 64k unikalnych kolorów, ale 32 bity mogą zdefiniować ponad 4 miliony unikalnych kolorów. Obraz monochromatyczny wykorzystuje 1 bit na piksel - jest włączony lub wyłączony.

W przypadku plików audio im więcej bitów używasz na próbkę, tym bardziej szczegółowe i dopracowane może być nagranie.

Rodney P. Barbati
źródło
0

Nie przeczytałem całego wątku, ale wydaje mi się, że wiele osób zapomina o wektoryzowanych formatach obrazów. To nie są tablice pikseli, ponieważ koncepcja piksela nawet nie istnieje w takim formacie. To renderer decyduje, jak wygenerować obraz na ekranie lub innym nośniku.

Nawet nie wspominając o domenach kolorów, kompresji, rozmiarach bitów i formacie kanału, istnieje zestaw formatów plików, które są całkowicie odmienne od map pikselowych. A jednak formaty wektorowe są również znacznie „lepsze” w reprezentowaniu niektórych rodzajów obrazów, zwykle wytwarzanych przez komputer, a nie aparat.

Kafein
źródło
1
To jest strona z fotografiami, a ponieważ aparaty cyfrowe rejestrują tablice pikseli zamiast wektorów, nie powiedziałbym, że to tyle „zapominania”, co nietypowe w tym kontekście.
mattdm
0

Odpowiedź na to pytanie była dość szczegółowa. Jednak pomimo wielu teorii przedstawionych w odpowiedziach, wydaje mi się, że istnieją pewne podstawowe tematy, zwykle związane z programowaniem komputerowym, które wymagają więcej wyjaśnień. Muszę stwierdzić, że jestem inżynierem oprogramowania. Po przeczytaniu pytania uświadomiłem sobie, że całkowicie nieporozumienie dotyczy podstawowych typów danych programowych, które wygenerowały to pytanie.

Pierwsze pytanie tutaj:

Co więcej, z liczbowego punktu widzenia, co sprawia, że ​​coś w rodzaju obrazów 16-bitowych różni się od obrazów 32-bitowych? Ponownie, obraz jest tylko tablicą o wartościach całkowitych od 0 do 255.

Jak przedstawiono wcześniej: Nie, nie jest. Obraz to nie tylko tablica wartości całkowitych z przedziału od 0 do 255. W rzeczywistości może to być pojedyncza lub wielowymiarowa tablica wartości od 0 do 65535, tablica od 0 do 4294967295 lub nawet tablica bitów (bit może zawierać wartości 0 lub 1, to wszystko), które są konwertowane przez oprogramowanie, które jest w stanie odczytać pliki obrazów na liczby całkowite zgodnie z różnymi regułami kodowania.

Aby to lepiej zrozumieć, jak wspomniano wcześniej, uważam, że konieczna jest dyskusja na temat podstawowych typów danych programowania. Spróbuję wyjaśnić je tak prosto, jak to możliwe, aby każdy zrozumiał problemy związane z przechowywaniem wartości całkowitych w plikach komputerowych.

W programowaniu komputerowym używamy podstawowych prymitywnych typów danych do zapisywania wartości w plikach, odczytywania ich z plików do pamięci komputera, manipulowania tymi wartościami przy użyciu różnych typów danych w różnych językach programowania i ostatecznie zapisywania ich z powrotem do plików. Liczby całkowite w programowaniu komputerowym to nie tylko liczby całkowite. Istnieją wszelkiego rodzaju liczby całkowite, zależą od używanego języka programowania i ilości potrzebnej pamięci dla każdego z nich. Zazwyczaj w większości języków programowania mamy następujące typy danych (i sposoby ich manipulowania):

  • BIT - posiadający 0 lub 1
  • UINT8 - 8-bitowa liczba całkowita bez znaku - mogą przechowywać wartości między [0 a 255] przedziałami.
  • INT8 - 8-bitowa liczba całkowita ze znakiem - mogą przechowywać wartości w przedziale [-126 do 127].
  • UINT16 - 16-bitowa liczba całkowita bez znaku - mogą zawierać wartości z przedziału [0 do 65535].
  • INT16 - 16-bitowa liczba całkowita bez znaku - mogą przechowywać wartości z przedziału [−32768 do 32767].
  • UINT32 - 32-bitowa liczba całkowita bez znaku - mogą przechowywać wartości między [0 a 4294967295] przedziału.
  • INT32 - 32-bitowa liczba całkowita bez znaku - mogą przechowywać wartości z przedziału [-2147483648 do 2147483647].
  • LUB połączenie wszystkich tych typów danych w bardziej złożonym formacie. Na przykład UINT16 (16 BITów) z 3 różnymi wartościami, pierwsze 4 BIT z wartościami od 0 do 127, następnie BIT z 0 lub 1 i tak dalej.

Ponadto WIĘCEJ jest coś, co programiści mają do czynienia podczas odczytywania lub zapisywania liczb całkowitych typu danych z plików. Endianess.Endianness odnosi się do kolejności sekwencyjnej, w której bajty (UINT8 z naszej tabeli) są uporządkowane w większe wartości liczbowe, gdy są przechowywane w pamięci lub plikach. Endianness jest przedmiotem zainteresowania w informatyce, ponieważ powszechnie używane są dwa sprzeczne i niekompatybilne formaty: wartości mogą być reprezentowane w formacie big-endian lub little-endian, w zależności od tego, czy bity, bajty lub inne komponenty są uporządkowane z dużego końca (najbardziej znaczące bit) lub mały koniec (najmniej znaczący bit). Po prostu umieść taką wartość 0000000011011111 lub ... taką jak 1101111100000000, zależnie od wybranej przez ciebie kolejności endianów. I możesz wybrać dowolne zamówienie, które pasuje do twojego celu. Nie ma innych zasad niż te, które tworzysz podczas projektowania formatu pliku obrazu.

Proszę zauważyć, że w programowaniu liczby całkowite zajmują więcej lub mniej miejsca, zależy od wartości. Podobnie jak potrzebujesz więcej papieru do napisania 255255255, potrzebujesz więcej bitów, aby zapisać większą wartość. Potem, kiedy chcesz odczytać wartość, musisz dokładnie znać reguły, które stworzyłeś podczas jej pisania. W przeciwnym razie nie jest możliwe, abyś zorientował się, jak odczytać tylko tablicę z wartościami całkowitymi od 0 do 255, ponieważ po prostu nie wiesz, gdzie te liczby są przechowywane i jak te liczby są przechowywane, biorąc pod uwagę tak wiele możliwości (BIT, UINT8 , UINT16, UINT32 lub kombinacja wszystkich tych typów danych komputerowych). I nie zapomnij, Endianness. Jeśli nie wiesz, że dane zostały zapisane przy użyciu kolejności big-endian lub little-endian, nie możesz odczytać właściwej wartości.

Z tego powodu obrazy NIGDY nie są tylko tablicą o wartościach całkowitych od 0 do 255. Niektóre z nich to tablice UINT16 (obrazy 16-bitowe), inne to tablice UINT32 (obrazy 32-bitowe), a inne to tablice UINT8 (obrazy 8-bitowe). Niektórzy bardzo kreatywni programiści komputerowi mogą nawet używać podpisanych typów, które zawierają tablice INT8, co oznacza tablicę wartości od -126 do 127.

W rzeczywistości, gdy czytasz plik obrazu, jednym z pierwszych napotkanych danych są zwykle niektóre BITY reprezentujące szerokość i wysokość obrazu. I to nie są tylko niektóre wartości 0–255. Są to także niektóre typy danych wybrane przez programistę. Niektórzy programiści pomyślą, że 16 bitów jest wystarczających do przechowywania maksymalnej szerokości obrazu 65535 pikseli, ponieważ projektują format obrazu używany w grze do przechowywania niektórych małych przycisków. Niektórzy inni programiści mogą użyć tutaj wartości 32-bitowej, co pozwala przechowywać obrazy o szerokości i wysokości 4294967295. Niektórzy szaleni programiści NASA mogą nawet użyć 64-bitowej pamięci do przechowywania ogromnego zdjęcia galaktyki do 18446744073709551615 pikseli.Jeśli nie znasz zasad, nie możesz odczytać tych „wartości”, jak je nazywasz. Ponieważ nie wiesz, gdzie zaczynają się w pliku obrazu i gdzie kończą. W rezultacie otrzymujesz mnóstwo BITÓW, o których nic nie rozumiesz.

Dlatego wszechświat jest pełen tak wielu różnych formatów obrazów. Ponieważ nie ma standardowego rozwiązania, aby zapisać pewne wartości całkowite do pliku. Jest to wybór programisty w całości oparty na wielu czynnikach, takich jak Endianess maszyny, nad którą pracujesz, język programowania, którego używasz do projektowania oryginalnej implementacji formatu pliku i wiele innych rzeczy, takich jak cel formatu obrazu (jak wyraźnie zostało to wcześniej określone przez inne odpowiedzi).

Praktyczny prosty format pliku czarno-białego obrazu, który zawiera tylko jedną pojedynczą wartość 166, która reprezentuje obraz 4x2 pikseli:

Obraz (1 - czarny piksel, 0 - biały piksel):

1010 
0110

Ten format pliku wykorzystuje 1 BIT na PIXEL przechowywany jako POJEDYNCZA 8-bitowa liczba całkowita 166 (10100110). To wszystko. Nie jest używana tablica wartości 0–255, ale 8 różnych wartości 0 lub 1 zapisanych jako wartość 166.

Jeśli użyjesz tablicy 0-255 wartości dla każdego piksela * 3 razy dla RGB, otrzymasz obraz 24-krotnie większy. Ten format pliku właśnie zaoszczędził 24-krotność miejsca na dysku potrzebnego do zapisania takiego obrazu lub 24-krotnie mniej pamięci komputera potrzebnej do odczytania i przechowywania tego obrazu w pamięci RAM komputera, gdy używasz tego obrazu na przykład w wysokiej wydajności silniku gier 3D do narysuj nim coś na ekranie (teksturowanie tysięcy latających cząstek pyłu może być dobrym kandydatem :)).

Grigore Madalin
źródło