JPEG | |
---|---|
Förlängning | .jpg, .jpeg, .JPG, .JPEG, .jpeeller.JPE |
MIME -typ | bild/jpeg |
Signatur | 0xFF 0xD8 |
publiceras | 18 september 1992 |
Formattyp | Grafiskt format |
Utvecklad i | JPEG 2000 , JPEG-LS , JPEG XR , MotionJPEG |
Standard(er) | ISO/IEC 10918 |
Hemsida | jpeg.org/jpeg/ ( engelska) |
Mediafiler på Wikimedia Commons |
JPEG (uttalas jpeg [1] , eng . Joint Photographic Experts Group , efter namnet på utvecklarorganisationen ) är ett av de populära rastergrafikformaten som används för att lagra fotografier och liknande bilder. Filer som innehåller JPEG-data har vanligtvis tilläggen (suffix) .jpg (mest populärt), .jfif , .jpe eller .jpeg . MIME -typen är image/jpeg.
JPEG-algoritmen låter dig komprimera en bild med både förlustfri och förlustfri (förlustfri JPEG-komprimeringsläge). Bilder med en linjär storlek på högst 65535 × 65535 pixlar stöds.
År 2010, för att bevara information om digitala format som var populära i början av 2000-talet för eftervärlden, lade forskare från PLANETS-projektet instruktioner för att läsa JPEG-formatet i en speciell kapsel, som placerades i ett speciellt förråd i de schweiziska alperna [2] .
JPEG-algoritmen är mest effektiv för att komprimera fotografier och målningar som innehåller realistiska scener med mjuka övergångar i ljusstyrka och färg. JPEG används mest inom digital fotografering och för att lagra och överföra bilder via Internet .
JPEG-formatet i förlustkomprimeringsläge är till liten nytta för att komprimera ritningar, text och teckengrafik, där en skarp kontrast mellan intilliggande pixlar leder till märkbara artefakter . Det är tillrådligt att spara sådana bilder i förlustfria format som JPEG-LS , TIFF , GIF , PNG eller använda JPEG-komprimeringsläget förlustfritt.
JPEG (liksom andra förlustformat komprimering ) är inte lämpliga för att komprimera bilder under flerstegsbehandling, eftersom förvrängningar kommer att införas i bilderna varje gång mellanliggande bearbetningsresultat sparas.
JPEG bör inte användas i fall där ens minimal förlust är oacceptabel, till exempel vid komprimering av astronomiska eller medicinska bilder. I sådana fall kan det förlustfria JPEG-komprimeringsläget som tillhandahålls av JPEG-standarden (som dock inte stöds av de flesta populära codecs ) eller JPEG-LS- komprimeringsstandarden rekommenderas .
När bilden är komprimerad konverteras den från RGB-färgrymden till YCbCr . JPEG-standarden (ISO / IEC 10918-1) reglerar inte valet av YCbCr, vilket tillåter andra typer av transformation (till exempel med antalet komponenter [3] som skiljer sig från tre), och komprimering utan konvertering (direkt till RGB) JFIF-specifikationen (JPEG File Interchange Format, föreslagen 1991 av C-Cube Microsystems, och nu de facto-standarden) inbegriper användningen av RGB-> YCbCr-konvertering.
Efter RGB->YCbCr-konverteringen, för Cb- och Cr-bildkanalerna som ansvarar för färg, kan "decimering" (subsampling [4] ) utföras, vilket innebär att varje block med 4 pixlar (2x2) av Y-ljusstyrkakanalen tilldelas genomsnittliga Cb- och Cr-värden (decimeringsschema "4:2:0" [5] ). Samtidigt, för varje 2x2 block, istället för 12 värden (4 Y, 4 Cb och 4 Cr), används endast 6 (4 Y och en genomsnittlig Cb och Cr vardera). Om det finns högre krav på kvaliteten på bilden som återställs efter komprimering, kan förtunning endast utföras i en riktning - vertikalt ("4:4:0"-schema) eller horisontellt ("4:2:2"), eller inte utföras alls ("4:4:4").
Standarden tillåter också decimering med medelvärdesberäkning av Cb och Cr, inte för ett 2x2-block, utan för fyra på varandra följande (vertikalt eller horisontellt) pixlar, det vill säga för 1x4, 4x1-block ("4:1:1"-schema), samt 2x4 och 4x2 (schema "4:1:0"). Det är också möjligt att använda olika typer av decimering för Cb och Cr, men i praktiken används sådana scheman ytterst sällan.
Vidare är ljusstyrkekomponenten Y och komponenterna som ansvarar för färgen Cb och Cr uppdelade i block om 8x8 pixlar. Varje sådant block utsätts för en diskret cosinustransform (DCT) . De resulterande DCT-koefficienterna kvantiseras (olika kvantiseringsmatriser används vanligtvis för Y, Cb och Cr) och packas med användning av kör- och Huffman-koder . JPEG-standarden tillåter också användning av mycket effektivare aritmetisk kodning , men på grund av patentrestriktioner (patentet för den aritmetiska QM-kodaren som beskrivs i JPEG-standarden tillhör IBM ), i praktiken används den sällan. Det populära libjpeg- biblioteket i de senaste versionerna innehåller stöd för aritmetisk kodning, men att titta på bilder komprimerade med den här metoden kan vara problematiskt eftersom många tittare inte stöder avkodning av dem.
Matriserna som används för att kvantisera DCT-koefficienterna lagras i JPEG-filens rubrik. Vanligtvis är de byggda på ett sådant sätt att högfrekventa koefficienter utsätts för starkare kvantisering än lågfrekventa. Detta leder till förgrovning av fina detaljer i bilden. Ju högre kompressionsförhållande, desto starkare kvantisering av alla koefficienter.
När du sparar en bild som en JPEG-fil får kodaren en kvalitetsparameter i någon godtycklig enhet, såsom 1 till 100 eller 1 till 10. Ett högre antal betyder vanligtvis bättre kvalitet (och en större komprimerad fil). Det finns dock ingen sådan parameter i själva JPEG-filen, och kvaliteten på den rekonstruerade bilden bestäms av kvantiseringsmatriserna, typen av decimering av färgskillnadskomponenter och noggrannheten i matematiska operationer både på kodar- och avkodarsidan. I det här fallet, även när du använder högsta kvalitet (motsvarande en kvantiseringsmatris som endast består av enheter och frånvaron av decimering av färgskillnadskomponenter), kommer den rekonstruerade bilden inte exakt att matcha den ursprungliga, som är associerad både med den ändliga noggrannheten av DCT och med behovet av att avrunda värdena för Y , Cb, Cr och DCT-koefficienter till närmaste heltal. Lossless JPEG-komprimeringsläget, som inte använder DCT, ger en exakt matchning mellan de återställda och originalbilderna, men dess låga effektivitet (komprimeringsförhållandet överstiger sällan 2) och bristen på stöd från mjukvaruutvecklare bidrog inte till populariteten för Lossless JPEG.
JPEG-standarden tillhandahåller två huvudsakliga sätt att representera kodad data.
Det vanligaste, som stöds av de flesta av de tillgängliga codecs , är en sekventiell (sekventiell JPEG) datarepresentation, som involverar sekventiell genomgång av den kodade bilden med ett bitdjup på 8 bitar per komponent (eller 8 bitar per pixel för svartvit gråskala bilder) block för block från vänster till höger, uppifrån och ned. Ovan beskrivna operationer utförs på varje kodat bildblock, och kodningsresultaten placeras i utgångsströmmen i form av en enda "skanning", det vill säga en array av kodad data som motsvarar den sekventiellt skickade ("skannade") bild. Baslinje- eller "baslinje"-kodningsmoden tillåter endast en sådan representation (och Huffman-kodning av de kvantiserade DCT-koefficienterna). Det utökade (utökade) läget, tillsammans med det sekventiella, tillåter också progressiv (progressiv JPEG) datarepresentation, kodning av bilder med ett bitdjup på 12 bitar per komponent/pixel (komprimering av sådana bilder enligt JFIF-specifikationen stöds inte), och aritmetisk kodning av kvantiserade DCT-koefficienter.
I fallet med progressiv JPEG skrivs den komprimerade datan till utgångsströmmen som en uppsättning skanningar, som var och en beskriver hela bilden i ökande detalj. Detta uppnås antingen genom att i varje skanning inte registrera en komplett uppsättning DCT-koefficienter, utan bara några av dem: först - lågfrekvent, i nästa skanning - högfrekvent (metoden "spektralval", det vill säga spektrala sampel ), eller genom successiv, från scan till scan, förfining av DCT-koefficienter ("successive approximation"-metod, det vill säga successiva approximationer). Denna progressiva representation av data är särskilt användbar när du överför komprimerade bilder med låghastighetskommunikationskanaler, eftersom den låter dig se hela bilden efter att ha överfört en liten del av JPEG-filen.
Båda beskrivna scheman (både sekventiell och progressiv JPEG) är baserade på DCT och tillåter i grunden inte att erhålla en återställd bild som är absolut identisk med den ursprungliga. Standarden tillåter dock också komprimering som inte använder DCT, utan är byggd på basis av en linjär prediktor (förlustfri, det vill säga "förlustfri", JPEG), som garanterar en fullständig, bit-för-bit, matchning mellan original och återställda bilder. Samtidigt når komprimeringsförhållandet för fotografiska bilder sällan 2, men den garanterade frånvaron av distorsion i vissa fall är efterfrågad. Märkbart högre kompressionsförhållanden kan erhållas med JPEG-LS- kompressionsmetoden som beskrivs av ISO/IEC 14495-1 , som, trots likheten i namn, inte är direkt relaterad till JPEG ISO/IEC 10918-1 (ITU T.81 Recommendation) ) standard (ITU T.87 rekommendation).
En JPEG-fil innehåller en sekvens av markörer , som var och en börjar med en 0xFF-byte, som anger början av markören, och en identifierarbyte. Vissa markörer består endast av detta par av byte, medan andra innehåller ytterligare data som består av ett två-byte fält med längden på informationsdelen av markören (inklusive längden på detta fält, minus de två byten i början av markören 0xFF och identifierare) och själva data. Denna filstruktur låter dig snabbt hitta en markör med nödvändiga data (till exempel längden på linjen, antalet rader och antalet färgkomponenter i den komprimerade bilden).
Markör | bytes | Längd | Ändamål | Kommentarer |
---|---|---|---|---|
SÅ JAG | 0xFFD8 | Nej | Bildstart | |
SOF0 | 0xFFC0 | variabel storlek | Frame start (grundläggande, DCT) | Indikerar att bilden kodades i basläge med DCT- och Huffman-kod . Markören innehåller antalet rader och bildradens längd (tvåbytefält med en offset på 5 respektive 7 relativt markörens början), antalet komponenter (bytefält med en offset på 9 i förhållande till början av markören) är antalet bitar per komponent strikt 8 (bytefält med en offset på 4 i förhållande till startmarkören), liksom förhållandet mellan komponenter (till exempel 4:2:0) . |
SOF1 | 0xFFC1 | variabel storlek | Start av bildruta (utökad, DCT, Huffman-kod) | Indikerar att bilden kodades i utökat läge med DCT- och Huffman-kod. Markören innehåller antalet linjer och linjelängden på bilden, antalet komponenter, antalet bitar per komponent (8 eller 12) och förhållandet mellan komponenterna (t.ex. 4:2:0). |
SOF2 | 0xFFC2 | variabel storlek | Start av bildruta (progressiv, DCT, Huffman-kod) | Indikerar att bilden kodades i progressivt läge med hjälp av DCT- och Huffman-kod. Markören innehåller antalet linjer och linjelängden på bilden, antalet komponenter, antalet bitar per komponent (8 eller 12) och förhållandet mellan komponenterna (t.ex. 4:2:0). |
DHT | 0xFFC4 | variabel storlek | Innehåller Huffman-bord | Anger ett eller flera Huffman-bord. |
DQT | 0xFFDB | variabel storlek | Innehåller kvantiseringstabeller | Anger en eller flera kvantiseringstabeller. |
DRI | 0xFFDD | 4 bytes | Anger längden på omstartsintervallet | Anger avståndet mellan RST-markörer n i makroblock. I frånvaro av en DRI är förekomsten av RST-markörer n i den kodade dataströmmen olaglig och anses vara ett fel. Om RST-markörer n inte används under kodning, används DRI-markören antingen inte alls, eller så anges repetitionsintervallet i den som 0. |
SOS | 0xFFDA | variabel storlek | Starta skanning | Början av den första eller nästa skanningen av bilden med bypassriktningen från vänster till höger uppifrån och ned. Om grundläggande kodningsläge användes, används en skanning. Vid användning av progressiva lägen används flera skanningar. SOS-markören separerar mellan de informativa (huvudet) och kodade (faktiskt komprimerade data) delarna av bilden. |
RST n | 0xFFDn _ | Nej | omstart | Omstartsmarkörer används för att segmentera entropikodarkodad data. I varje segment avkodas data oberoende, vilket gör det möjligt att parallellisera avkodningsproceduren. Om den kodade datan skadas under överföring eller lagring av en JPEG-fil, tillåter användningen av omstartsmarkörer dig att begränsa förlusten (makroblock från oskadade segment kommer att återställas korrekt). Infogas vid varje r: te makroblock, där r är DRI-omstartsintervallet för markören. Används inte i frånvaro av DRI-markör. n , låg 3 bitar av kodmarkör, cykler 0 till 7. |
APP n | 0xFFen _ | variabel storlek | Ställs in efter applikation | Till exempel använder EXIF för en JPEG-fil APP1-markören för att lagra metadata i en TIFF -baserad struktur . |
COM | 0xFFFE | variabel storlek | Kommentar | Innehåller texten i kommentaren. |
EOI | 0xFFD9 | Nej | Slutet på den kodade delen av bilden. |
Nackdelarna med JPEG-komprimering inkluderar uppkomsten av karakteristiska artefakter på återställda bilder vid höga komprimeringsförhållanden : bilden är utspridda i block med storleken 8x8 pixlar (denna effekt är särskilt märkbar i bildområden med jämna ljusförändringar), i områden med hög rumslig frekvens (till exempel på kontrastkonturer och bildkanter) artefakter uppträder i form av brushalos. JPEG-standarden (ISO/IEC 10918-1, bilaga K, klausul K.8) tillhandahåller användning av speciella filter för att undertrycka blockartefakter, men i praktiken används sådana filter, trots sin höga effektivitet, praktiskt taget inte.
Men trots bristerna har JPEG blivit mycket utbredd på grund av det ganska höga (i förhållande till de alternativ som fanns vid tidpunkten för dess uppkomst) komprimeringsförhållandet, stöd för fullfärgsbildkomprimering och relativt låg beräkningskomplexitet .
För att påskynda komprimeringsprocessen enligt JPEG-standarden används traditionellt parallellisering av beräkningar, särskilt vid beräkning av DCT. Historiskt sett beskrevs ett av de första försöken att påskynda komprimeringsprocessen med detta tillvägagångssätt i en artikel från 1993 av Kasperovich och Babkin [7] , som föreslog en original DCT-approximation som möjliggör effektiv parallellisering av beräkningar med 32-bitars generella ändamål. register över Intel 80386-processorer . Mer kraftfulla datorsystem som dök upp senare använde SIMD- tillägg av x86-arkitekturprocessorinstruktionsuppsättningen . Betydligt bättre resultat kan uppnås genom system som använder datorkapaciteten hos grafikacceleratorer ( NVIDIA CUDA och AMD FireStream-teknologier ) för att organisera parallell beräkning inte bara för DCT utan också för andra stadier av JPEG-komprimering (färgrymdskonvertering, körnivå, statistisk kodning, etc.). ), och för varje block av 8x8 kodad eller avkodad bild. Artikeln [8] presenterade implementeringen av parallellisering av alla stadier av JPEG-algoritmen med hjälp av CUDA-teknik, vilket avsevärt ökade hastigheten för komprimering och avkodning enligt JPEG-standarden.
mediebehållare | |
---|---|
Video/ljud | |
Audio | |
musik |
|
Raster | |
Vektor | |
Komplex |