Si të konfiguroni telefonat inteligjentë dhe PC. Portali informativ

Zbatoni kompresimin e imazhit duke përdorur jpeg c. JPEG, JPEG2000, JPEG-LS

Fotografitë dhe fotografitë ndryshojnë nga njëra-tjetra jo vetëm në përmbajtje, por edhe në karakteristika të tjera "kompjuterike". Për shembull, sipas madhësisë.

Ndodh që duket se ka dy vizatime identike, por njëri është tre herë më i madh se tjetri.

Imazhet gjithashtu ndryshojnë në cilësi. Unë mendoj se ju keni hasur në foto me cilësi jashtëzakonisht të dobët më shumë se një herë. Kjo është e dukshme me sy të lirë. Për shembull, dy fotografi identike, por njëra është me cilësi më të mirë dhe tjetra është me cilësi më të keqe.

Dhe ndodh që vizatimit të duket se i mungojnë ngjyrat. Ja një shembull.

Dhe formati ose lloji i skedarit është përgjegjës për të gjithë këtë.

Në fakt, imazhet mund të jenë më formate të ndryshme. Dhe ka shumë, shumë prej tyre. Ne nuk do t'i konsiderojmë të gjitha, por do të flasim për ato më të zakonshmet. Këto janë formate të tilla si bmp, gif, jpg, png, tiff.

Ato ndryshojnë nga njëri-tjetri, para së gjithash, në cilësi. Dhe cilësia ndryshon në numrin (ngopjen) e ngjyrave.

Për shembull, unë pikturoj një foto duke përdorur ngjyra të ndryshme. Dhe pastaj papritmas disa prej tyre mbarojnë, dhe ju duhet të përfundoni pikturën me atë që keni. Sigurisht, do të përpiqem të bëj gjithçka që është e mundur në mënyrë që kjo të mos ndikojë shumë në rezultatin, por prapë fotografia nuk do të dalë ashtu siç do të doja - më e zbehur, e paqartë.

Kështu është me formatet e imazhit. Disa i lënë të gjitha ngjyrat, ndërsa të tjerët i presin disa. Dhe ndonjëherë kjo bën që fotografia të përkeqësohet.

Ky është një shembull mjaft i përafërt. Në fakt, gjithçka është disi më e ndërlikuar, por mendoj se e keni kuptuar pikën kryesore.

Formatet e zakonshme të imazhit

BMP është një format për vizatimet e bëra në programin Paint. Mund të përdoret për të ruajtur fotografitë e vizatuara në kompjuterin tuaj. Por ky lloj skedari nuk përdoret në internet për shkak të madhësisë së tij të madhe. Pra, nëse doni të publikoni një fotografi të vizatuar në Paint në një blog ose rrjet social, ajo duhet të jetë e një lloji tjetër - gif, jpg ose png.

GIF është një format imazhi popullor në internet. Ju mund t'i ruani ato në të pa humbje të cilësisë, por me sasi e kufizuar ngjyra - 256. GIF ka fituar popullaritet të veçantë për faktin se mund të krijojë fotografi të vogla të animuara (lëvizëse).

JPG është një format për fotografi dhe piktura me një numër të madh ngjyrash. Ju mund të ruani një imazh në të si pa humbje të cilësisë ashtu edhe me humbje.

PNG është një format fotografik modern. Ky lloj imazhi nuk merret madhësia e madhe dhe pa humbje të cilësisë. Shumë i përshtatshëm: skedari është i vogël dhe cilësia është e mirë. Ai gjithashtu mbështet transparencën.

TIFF - imazhet janë të një cilësie shumë të mirë, pa kompresim, prandaj madhësia e skedarëve të tillë është e madhe. TIFF përdoret kur cilësia është rëndësi të madhe. Për shembull, kur krijoni karta biznesi, broshura, kopertina reviste.

Cilin format të zgjidhni

  • BMP - nëse ky është një vizatim i bërë në Paint dhe do ta mbani vetëm në kompjuter.
  • GIF - nëse një animacion ose vizatim me një numër të vogël ngjyrash për publikim në internet.
  • PNG - nëse kjo është një foto që ka shumë ngjyra ose disa pjesë transparente.
  • JPG (jpeg) - nëse është një fotografi.
  • TIFF - imazh për printim (kartela biznesi, broshura, postera, etj.).

Pershendetje te dashur miq. Sot do të flasim se cili format imazhi është më i mirë për t'u përdorur në sit, cilat formate skedarësh grafikë janë të disponueshëm për faqen sot dhe nëse është e nevojshme të ndiqni formate të reja grafike.

Kam mjaft pyetje si kjo; shumë nga studentët e mi pyesin nëse mund të përdorin formatet e reja SVG dhe WebP dhe ku është vendi më i mirë për t'i përdorur këto imazhe. Sigurisht, mund të përdorni formate të reja, thjesht duhet të kuptoni se cili format është më i përshtatshëm për çfarë.

Sot, imazhet në një faqe interneti janë një pjesë integrale. Duke filluar nga dizajn grafik dhe ngarkimi i imazheve në artikuj, grafikët shoqërojnë shumicën e faqeve në rrjet. Por bukuria ka një çmim

Imazhet e pa optimizuara janë një nga faktorët që ngadalësojnë një faqe interneti, siç tregohet nga shërbimet e verifikimit.

Prandaj, gjithmonë do të duhet të zgjidhni cilin format të zgjidhni për imazhin. Madhësia dhe cilësia e tij do të varen nga kjo. Dhe për të përdorur imazhe më të vogla pa humbur cilësinë, duhet të dini disa gjëra.

Çfarë imazhesh për faqet e internetit përdor sot?

Të gjitha imazhet për faqet e internetit ndahen në:

  • raster (shembull - JPG, JPEG, GIF, PNG),
  • vektori (shembull - SVG).

Raster Imazhet përbëhen nga pikselë që ruajnë vlerat e ngjyrave dhe transparencës. Këto formate përfshijnë imazhe në artikuj, butona, ikona dhe elementë dizajni. Këto imazhe janë të njohura në mesin e zhvilluesve dhe pronarëve të faqeve të internetit. Disavantazhi kryesor i imazheve raster është se ato nuk shkallëzohen mirë.

Kjo do të thotë, kur madhësia e imazhit rritet, ka një humbje të cilësisë.

Vektor imazhet përbëhen nga vija dhe pika. Informacioni i imazhit ruhet në udhëzimet e paraqitjes matematikore, gjë që lejon që imazhe të tilla të shkallëzohen aq sa dëshironi pa humbje të cilësisë.

Të gjitha këto imazhe mund dhe përdoren në faqet moderne të internetit. Thjesht duhet të kuptoni se përpara se të ngarkoni në sit, !

Përshkrimi i formateve të njohura të imazhit për sitin

Nga përshkrimi i këtyre formateve, do të kuptoni se ku dhe cili format përdoret më mirë në faqe.

JPEG

JPEG ose JPG është një nga formatet më të njohura të imazhit për faqet e internetit. Formati mbështet miliona ngjyra, gjë që i jep një pozitë udhëheqëse në prezantimin e fotografive dhe fotove në faqe.

Imazhet në këtë format janë optimizuar mjaft mirë, praktikisht pa humbje të cilësisë, gjë që ju lejon të merrni një skedar më të vogël pa humbje vizuale të cilësisë. Duhet mbajtur mend se çdo optimizim i mëpasshëm zvogëlon cilësinë.

Skedarët e këtij formati mbështeten nga të gjitha pajisjet dhe shfletuesit, gjë që konfirmon edhe një herë popullaritetin e saj dhe ju lejon të mos shqetësoheni për problemet me shfaqjen në faqe.

Disavantazhi i madh i këtij formati është mungesa e transparencës. Kjo do të thotë, nuk do të jetë e mundur të kombinohen imazhet në këtë format. Për detyra të tilla është më mirë të përdorni formatin e mëposhtëm.

PNG

Ky format përdor një algoritëm kompresimi pa humbje. Për sa i përket numrit të ngjyrave dhe nivelit të transparencës, ai disponohet në dy lloje: 8 dhe 24-bit. Të dyja mbështesin transparencën.

8-bit nuk është shumë popullor, por 24-bit përdoret gjerësisht për imazhe të ndryshme në faqe. Për shkak të transparencës, ju lejon të krijoni imazhe të kombinuara. Shpesh përdoret për të krijuar butona dhe ikona të animuara ku nevojitet një efekt transparence.

Imazhet në formatin PNG mund të optimizohen dhe modifikohen shumë herë - do të ruajnë cilësinë origjinale.

Formati mbështetet gjithashtu nga të gjithë shfletuesit dhe pajisjet, duke siguruar që ai të mund të shfaqet në çdo ekran.

Cilësia e imazheve duket më e mirë se JPG, por pesha e skedarit do të jetë më e madhe. Kjo duhet të merret parasysh kur vendosni skedarë në sit.

GIF

Është një format 8-bit që mbështet 256 ngjyra, transparencë dhe animacion. Për shkak të mbështetjes së një numri të vogël ngjyrash, pesha e skedarit është gjithashtu minimale.

Formati nuk është i përshtatshëm për fotografi dhe imazhe me gamë të gjerë ngjyrat.

Por përdoret gjerësisht në krijimin e banderolave, butonave, ikonave etj.

Në faqet moderne të internetit ky format përdoret gjithnjë e më pak.

Më tej, le të flasim për formatet relativisht të fundit SVG dhe WebP, të cilat nuk janë aq të njohura, por po fitojnë popullaritet dhe mbështetje, dhe janë të përshtatshme për kërkesat e shpejtësisë së ngarkimit dhe përshtatshmërisë së faqes në internet.

SVG

Ky është një format skedari vektorial i aktivizuar bazuar në XML. Formati filloi të fitojë popullaritet mjaft kohët e fundit, pasi më parë ai mbështetej dobët në shfletues. Dhe për shkak të problemeve të ekranit, askush nuk nxitonte ta përdorte atë.

Sot, SVG mbështetet nga të gjithë shfletuesit modernë. Por problemet me ekranin ende ndodhin.

Ky format përdoret më shpesh për imazhe të thjeshta si logot, elementët e dizajnit etj. Jo i përshtatshëm për fotografi.

Formati SVG është i lehtë, shumë i shkallëzuar, ofron imazhe të qarta në çdo rezolucion të ekranit, mbështet animacionin, mund të kontrollohet nëpërmjet CSS dhe të vendoset në HTML, duke reduktuar numrin e kërkesave.

WebP

Formati i hapur Kodi i burimit, i zhvilluar nga Google posaçërisht për internetin. Sot, YouTube përdor konvertimin e fotografive të videove në WebP.

Formati ofron kompresim superior dhe mbështet transparencën. Ai kombinon përfitimet e formateve JPG dhe PNG pa rritur madhësinë e skedarit.

Por, megjithë avantazhet e formatit, ai nuk mbështetet nga të gjithë shfletuesit, për shembull, IE, Edge, Firefox dhe Safari.

Ka mënyra për të shmangur këto kufizime, por ato parandalojnë që formati të përdoret kudo.

konkluzioni

Miq, shpresoj se kam shpjeguar gjithçka në mënyrë të qartë, dhe ju tani e dini se cili format imazhi është më i mirë për t'u përdorur në sit, dhe pse nuk insistoj në përdorimin e një formati të veçantë, por rekomandoj një qasje të integruar.

Ndoshta kur WebP të fitojë mbështetje të gjerë, ne të gjithë do të kalojmë tek ajo dhe do të zëvendësojmë jpg dhe png në sajtet tona.

Le të diskutojmë në komente se çfarë formatesh përdorni në faqet tuaja, çfarë ju pëlqen dhe çfarë nuk ju pëlqen.

Kaq per sot, pres komentet tuaja.

Përshëndetje, Maxim Zaitsev.

    ME Tre formatet më të njohura të skedarëve janë JPEG, RAW, TIFF. Ndonjëherë mund të dëgjoni mosmarrëveshje midis fotografëve - cili format skedari është më i mirë për fotografinë, në cilin format është më mirë të bëni fotografi, sepse kamerat moderne ju lejojnë të bëni fotografitografi në cilindo nga këto formate, dhe ndonjëherë në disa në të njëjtën kohë!

    Formati i skedarit në të cilin ruhet një imazh është në thelb një kompromis midis cilësisë së figurës dhe madhësisë së skedarit.

    Ju ndoshta e dini tashmë se një imazh raster përbëhet nga pikselë. Mënyra se si është organizuar një skedar raster dhe në çfarë forme ruhet informacioni rreth pikselëve në të, përcakton formatin e skedarit. Cilësia e imazhit të një skedari raster përcaktohet nga dy parametra kryesorë: madhësia e pikselit (d.m.th., numri i përgjithshëm i pikselëve) dhe saktësia e ngjyrës së pikselit në përfaqësimin e ngjyrës aktuale.Me madhësinë e pikselit është e qartë - sa më shumë piksel (ose sa më "i vogël" piksel), aq më mirë.Dhe saktësia e riprodhimit të ngjyrave varet nga numri i ngjyrave për piksel ose thellësia e ngjyrës.

    Thellësia e ngjyrave (cilësia e paraqitjes së ngjyrave, thellësia e bitit të imazhit) - sasia e kujtesës në numrin e biteve të përdorura për të ruajtur dhe paraqitur ngjyrën kur kodoni një piksel grafika raster ose imazhe video. Numri i biteve tregon numrin e gradimeve (hapat e tonit) në çdo komponent të ngjyrave ose, thjesht, numrin e ngjyrave. Shtimi i 1 bit do të thotë shtim i një biti tjetër në kodin binar të ngjyrave.

    • Ngjyra binare 1-bit (21 = 2 ngjyra), më së shpeshti e përfaqësuar nga bardh e zi (ose e zezë dhe jeshile)
    • Ngjyra 2-bitësh (22 = 4 ngjyra) CGA, NeXTstation shkallë gri
    • 3-bit me ngjyra (23 = 8 ngjyra) shumë kompjuterë personalë të vjetër me dalje televizive
    • Ngjyra 4-bit (24 = 16 ngjyra) njihet si EGA dhe në një masë më të vogël si standardi VGA me rezolucion të lartë
    • Ngjyra 5-bitëshe (25 = 32 ngjyra) Çipa origjinale Amiga
    • Ngjyra 6-bitëshe (26 = 64 ngjyra) Çipa origjinale Amiga
    • Ngjyra 8-bitëshe (28 = 256 ngjyra) Stacione pune të trashëguara Unix, VGA me rezolucion të ulët, Super VGA, AGA
    • Ngjyra 12-bit (212 = 4096 ngjyra) në disa sisteme Silicon Graphics, sisteme NeXTstation dhe sisteme të modalitetit Amiga HAM.

    Për shembull, ne punojmë në hapësirën e ngjyrave RGB. Kjo do të thotë se ekzistojnë tre kanale nga të cilat formohet ngjyra përfundimtare e pikselit: kanali i kuq (Rad), kanali jeshil (Green) dhe kanali blu (Blu). Le të supozojmë se kanalet janë katër-bit. Kjo do të thotë se çdo kanal ka aftësinë për të shfaqur 16 ngjyra. Si rezultat, i gjithë RGB do të jetë 12-bit dhe do të jetë në gjendje të shfaqet

    C=16x16x16=4096 ngjyra

    Thellësia e ngjyrës në këtë rast është 12 bit.

    Kur njerëzit flasin për RGB 24-bitësh, ata nënkuptojnë kanale 8-bitësh (256 ngjyra secila) me një numër total opsionesh ngjyrash për piksel

    C=256x256x256=16777216 ngjyra.

    Shifra është mbresëlënëse. Ky numër ngjyrash për çdo piksel plotëson kërkesat e fotografit më kërkues.

    Pak për vetë formatet.

    Formati TIFF

    TIFF do të thotë Formati i skedarit të imazhit të etiketuar dhe është një standard për industrinë e printimit dhe printimit.

    Si rezultat, kjo është ajo që ndodh:

    1. Nëse kamera juaj është kaq e thjeshtë sa që shkrep vetëm JPEG, dhe dëshironi cilësi maksimale, vendosni madhësinë maksimale dhe kompresimin minimal dhe mos u mundoni nga fakti që nuk keni formate të tjera. Në shumicën e rasteve, një imazh RAW i përpunuar me kujdes përputhet me JPEG të kapur automatikisht nga kamera.

    2. Ju ndoshta nuk duhet të bëni fotografi në TIFF. Regjistrimi në këtë format është më i vështirë, por nuk ka dallim të dukshëm në krahasim me JPEG me cilësi të lartë.

    3. Nëse keni mundësi të bëni fotografi në , punoni me të. Do ta ndjeni veten nëse është e duhura për ju. Në disa raste, vetëm RAW bën të mundur marrjen e një fotografie unike për zmadhim të lartë gjatë printimit.

    Mbetet një zgjidhje tjetër, mund të thuhet universale. Ekziston një modalitet që ju lejon të merrni korniza në dy formate njëkohësisht: RAW+ JPEG. Regjistroni skena të rëndësishme në këtë modalitet. Ruajtja moderne e informacionit dixhital - si kartat e kujtesës ashtu edhe disqet e ngurtë - e bëjnë të mundur këtë. Në këtë rast, ju merrni një JPEG për të përdorur foton menjëherë, pa shpenzuar kohë për rishikim. Dhe, nëse keni nevojë për këtë, besojini skedarin RAW një specialisti për përpunim.

    Foto. Formatet e skedarëve.

    Është e lehtë të llogaritet se një imazh i pakompresuar me ngjyra të plota me një madhësi prej 2000 * 1000 piksele do të ketë një madhësi prej rreth 6 megabajt. Nëse flasim për imazhe të marra nga kamerat apo skanerët profesionistë rezolucion të lartë, atëherë madhësia e tyre mund të jetë edhe më e madhe. Megjithë rritjen e shpejtë të kapacitetit të pajisjeve të ruajtjes, algoritme të ndryshme të kompresimit të imazhit janë ende shumë të rëndësishme.
    Të gjithë algoritmet ekzistuese mund të ndahen në dy klasa të mëdha:

    • Algoritmet e kompresimit pa humbje;
    • Algoritmet e kompresimit me humbje.
    Kur flasim për kompresim pa humbje, nënkuptojmë se ekziston një algoritëm i kundërt me algoritmin e kompresimit që ju lejon të rivendosni me saktësi imazhin origjinal. Nuk ka asnjë algoritëm invers për algoritmet e kompresimit me humbje. Ekziston një algoritëm që rikthen një imazh që nuk përputhet domosdoshmërisht saktësisht me atë origjinal. Algoritmet e kompresimit dhe rikuperimit janë zgjedhur për të arritur një raport të lartë kompresimi duke ruajtur cilësinë vizuale të imazhit.

    Algoritmet e kompresimit pa humbje

    Algoritmi RLE
    Të gjitha algoritmet Seria RLE bazohen në një ide shumë të thjeshtë: grupet përsëritëse të elementeve zëvendësohen me një çift (numri i përsëritjeve, elementi përsëritës). Le të shqyrtojmë këtë algoritëm duke përdorur shembullin e një sekuence bitash. Kjo sekuencë do të alternojë grupet e zerove dhe njësheve. Për më tepër, grupet shpesh do të kenë më shumë se një element. Pastaj sekuenca 11111 000000 11111111 00 do të korrespondojë me grupin e mëposhtëm të numrave 5 6 8 2. Këta numra tregojnë numrin e përsëritjeve (numërimi fillon nga njësh), por edhe këta numra duhet të kodohen. Ne do të supozojmë se numri i përsëritjeve qëndron në intervalin nga 0 në 7 (d.m.th., 3 bit janë të mjaftueshëm që ne të kodojmë numrin e përsëritjeve). Pastaj sekuenca e konsideruar më sipër është koduar nga sekuenca e mëposhtme e numrave 5 6 7 0 1 2. Është e lehtë të llogaritet se 21 bit janë të nevojshëm për të koduar sekuencën origjinale, dhe në të ngjeshur Metoda RLE Në formë, kjo sekuencë merr 18 bit.
    Edhe pse ky algoritëm është shumë i thjeshtë, efikasiteti i tij është relativisht i ulët. Për më tepër, në disa raste, përdorimi i këtij algoritmi nuk çon në një ulje, por në një rritje të gjatësisë së sekuencës. Për shembull, merrni parasysh sekuencën e mëposhtme 111 0000 11111111 00. Sekuenca përkatëse RL duket kështu: 3 4 7 0 1 2. Gjatësia e sekuencës origjinale është 17 bit, gjatësia e sekuencës së ngjeshur është 18 bit.
    Ky algoritëm është më efektiv për imazhet bardh e zi. Gjithashtu përdoret shpesh si një nga fazat e ndërmjetme të kompresimit të algoritmeve më komplekse.

    Algoritmet e fjalorit

    Ideja prapa algoritmeve të fjalorit është që zinxhirët e elementeve të sekuencës origjinale janë të koduara. Ky kodim përdor një fjalor të veçantë, i cili merret bazuar në sekuencën origjinale.
    Ekziston një familje e tërë e algoritmeve të fjalorit, por ne do të shikojmë algoritmin më të zakonshëm LZW, të quajtur sipas zhvilluesve të tij Lepel, Ziv dhe Welch.
    Fjalori në këtë algoritëm është një tabelë që është e mbushur me zinxhirë kodues ndërsa algoritmi funksionon. Kur kodi i ngjeshur deshifrohet, fjalori rikthehet automatikisht, kështu që nuk ka nevojë të transmetohet fjalori së bashku me kodin e ngjeshur.
    Fjalori inicializohet me të gjitha vargjet e vetme, d.m.th. rreshtat e parë të fjalorit paraqesin alfabetin në të cilin kodojmë. Gjatë kompresimit, bëhet një kërkim për zinxhirin më të gjatë të regjistruar tashmë në fjalor. Sa herë që haset një zinxhir që nuk është shkruar ende në fjalor, ai shtohet aty dhe del një kod i ngjeshur që korrespondon me zinxhirin e shkruar tashmë në fjalor. Në teori, nuk vendosen kufizime në madhësinë e fjalorit, por në praktikë ka kuptim të kufizohet kjo madhësi, pasi me kalimin e kohës fillojnë të shfaqen zinxhirë që nuk gjenden më në tekst. Përveç kësaj, kur dyfishojmë madhësinë e tabelës, duhet të ndajmë një bit shtesë për të ruajtur kodet e ngjeshur. Për të parandaluar situata të tilla, futet një kod i veçantë, që simbolizon inicializimin e tabelës me të gjithë zinxhirët me një element.
    Le të shohim një shembull të një algoritmi kompresimi. Do të ngjeshim vijën cuckoocuckoocuckoohood. Le të supozojmë se fjalori do të përmbajë 32 pozicione, që do të thotë se secili prej kodeve të tij do të zërë 5 bit. Fillimisht fjalori plotësohet si më poshtë:

    Kjo tabelë ekziston si në anën e atij që ngjesh informacionin ashtu edhe në anën e atij që e dekompreson atë. Tani do të shikojmë procesin e kompresimit.


    Tabela tregon procesin e plotësimit të fjalorit. Është e lehtë të llogaritet se kodi i ngjeshur që rezulton merr 105 bit, dhe teksti origjinal (duke supozuar se kemi shpenzuar 4 bit duke koduar një karakter) merr 116 bit.
    Në thelb, procesi i dekodimit zbret në dekodimin e drejtpërdrejtë të kodeve dhe është e rëndësishme që tabela të inicializohet në të njëjtën mënyrë si gjatë kodimit. Tani le të shohim algoritmin e deshifrimit.



    Ne mund të përcaktojmë plotësisht vargun e shtuar në fjalor në hapin e i-të vetëm në i+1. Natyrisht, rreshti i-të duhet të përfundojë me karakterin e parë të rreshtit i+1. Se. Sapo kuptuam se si të rivendosim një fjalor. Me njëfarë interesi është situata kur një sekuencë e formës cScSc është e koduar, ku c është një karakter dhe S është një varg, dhe fjala cS është tashmë në fjalor. Në pamje të parë mund të duket se dekoderi nuk do të jetë në gjendje ta zgjidhë këtë situatë, por në fakt të gjitha linjat e këtij lloji duhet të përfundojnë gjithmonë me të njëjtin karakter me të cilin fillojnë.

    Algoritmet e kodimit statistikor
    Algoritmet në këtë seri caktojnë kodin më të shkurtër të ngjeshur për elementët më të shpeshtë të sekuencave. Ato. sekuencat me të njëjtën gjatësi janë të koduara me kode të ngjeshur me gjatësi të ndryshme. Për më tepër, sa më shpesh të ndodhë një sekuencë, aq më i shkurtër është kodi përkatës i ngjeshur.
    Algoritmi Huffman
    Algoritmi Huffman ju lejon të ndërtoni kode prefikse. Ne mund të mendojmë për kodet e parashtesave si shtigje në një pemë binare: kalimi nga një nyje në fëmijën e saj të majtë korrespondon me një 0 në kod, dhe tek fëmija i saj i djathtë korrespondon me një 1. Nëse etiketojmë gjethet e pemës me simbolet për t'u koduar, marrim paraqitjen kodi i prefiksit në formën e një peme binare.
    Le të përshkruajmë algoritmin për ndërtimin e një peme Huffman dhe marrjen e kodeve Huffman.
  1. Karakteret e alfabetit të hyrjes formojnë një listë të nyjeve të lira. Çdo fletë ka një peshë që është e barabartë me shpeshtësinë e shfaqjes së simbolit
  2. Përzgjidhen dy nyje pemësh të lira me peshën më të vogël
  3. Prindi i tyre krijohet me një peshë të barabartë me peshën e tyre totale
  4. Prindi i shtohet listës së nyjeve të lira dhe dy fëmijët e tij hiqen nga kjo listë
  5. Njërit hark që largohet nga prindi i caktohet biti 1, tjetrit i caktohet biti 0
  6. Hapat që fillojnë nga e dyta përsëriten derisa të mbetet vetëm një nyje e lirë në listën e nyjeve të lira. Kjo do të konsiderohet rrënja e pemës.
Duke përdorur këtë algoritëm, ne mund të marrim kodet Huffman për një alfabet të caktuar, duke marrë parasysh shpeshtësinë e shfaqjes së karaktereve.
Kodimi aritmetik
Algoritmet e kodimit aritmetik kodojnë vargjet e elementeve në një fraksion. Në këtë rast, merret parasysh shpërndarja e frekuencës së elementeve. Për momentin, algoritmet e kodimit aritmetik mbrohen nga patenta, kështu që ne do të shikojmë vetëm idenë bazë.
  • Tutorial

UPD. U detyrova të hiqja formatimin monospace. Një ditë të bukur, habraparser ndaloi së pranuari formatimin brenda etiketave para dhe kodike. I gjithë teksti u shndërrua në mush. Administrata e Habrit nuk mund të më ndihmonte. Tani është e pabarabartë, por të paktën është e lexueshme.

A keni dashur ndonjëherë të dini se si funksionon një skedar jpg? Le ta kuptojmë tani! Ngrohni përpiluesin tuaj të preferuar dhe redaktorin hex, ne do ta deshifrojmë këtë:

Kam marrë qëllimisht një vizatim më të vogël. Ky është një favicon i njohur, por shumë i ngjeshur i Google:

Ju paralajmëroj menjëherë se përshkrimi është thjeshtuar dhe informacioni i dhënë nuk është i plotë, por më pas do të jetë e lehtë për të kuptuar specifikimin më vonë.

Edhe pa e ditur se si ndodh kodimi, ne tashmë mund të nxjerrim diçka nga skedari.
- shënuesi i fillimit. Është gjithmonë në fillim të të gjithë skedarëve jpg.
Më pas vijnë bajtet . Ky është një shënues që tregon fillimin e një seksioni komentesh. 2 bajtet e ardhshme - gjatësia e seksionit (duke përfshirë këto 2 bajt). Pra, në dy të ardhshme - vetë komenti. Këto janë kodet e karaktereve ":" dhe ")", d.m.th. një emoticon i rregullt. Mund ta shihni në rreshtin e parë në anën e djathtë të redaktorit hex.

Pak teori

Shkurtimisht hap pas hapi:
Le të mendojmë për rendin në të cilin mund të kodohen këto të dhëna. Le të themi se kanali Y është plotësisht i koduar për të gjithë imazhin, pastaj Cb, pastaj Cr. Të gjithë e mbajnë mend ngarkimin e fotografive në dial-up. Nëse ato do të kodoheshin në këtë mënyrë, do të duhej të prisnim që i gjithë imazhi të ngarkohej përpara se të shfaqej në ekran. Do të jetë gjithashtu e pakëndshme nëse fundi i skedarit humbet. Ndoshta ka arsye të tjera të mira. Prandaj, të dhënat e koduara renditen një nga një, në pjesë të vogla.

Më lejoni t'ju kujtoj se çdo bllok Y ij , Cb ij , Cr ij është një matricë e koeficientëve DCT të koduar me kodet Huffman. Në dosje ato janë renditur në këtë mënyrë: Y 00 Y 10 Y 01 Y 11 Cb 00 Cr 00 Y 20

Leximi i një skedari

Pasi të kemi nxjerrë komentin, do të jetë e lehtë të kuptohet se:
  • Skedari ndahet në sektorë të paraprirë nga shënuesit.
  • Shënuesit janë 2 bajt të gjatë, me bajtin e parë .
  • Pothuajse të gjithë sektorët e ruajnë gjatësinë e tyre në 2 bajt të ardhshëm pas shënuesit.
Për lehtësi, le të theksojmë shënuesit:
FF D8 FF FE 00 04 3A 29 FF DB 00 43 00 A0 6E 78



FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF DB 00
43 01 AA B4 B4 F0 D2 F0 FF FF FF FF FF FF FF FF FF FF
FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
FF FF FF C0 00 11 08 00 10 00 10 03 01 22 00 02
11 01 03 11 01 FF C4 00 15 00 01 01 00 00 00 00
00 00 00 00 00 00 00 00 00 00 03 02 FF C4 00 1A
10 01 00 02 03 01 00 00 00 00 00 00 00 00 00 00
00 01 00 12 02 11 31 21 FF C4 00 15 01 01 01 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 FF
C4 00 16 11 01 01 01 00 00 00 00 00 00 00 00 00
00 00 00 00 11 00 01 FF DA 00 0C 03 01 00 02 11
03 11 00 3F 00 AE E7 61 F2 1B D5 22 85 5D 04 3C
82 C8 48 B1 DC BF FF D9

Shënues: DQT - tabela e kuantizimit.

FF DB 00 43 00 A0 6E 78
8C 78 64 A0 8C 82 8C B4 AA A0 BE F0 FF FF F0 DC
DC F0 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF

Kreu i seksionit merr gjithmonë 3 bajt. Në rastin tonë është. Kreu përbëhet nga:
Gjatësia: 0x43 = 67 bajt
Gjatësia e vlerave në tabelë: 0 (0 - 1 bajt, 1 - 2 bajt)
[_0] ID e tabelës: 0
64 bajtet e mbetura duhet të plotësojnë tabelën 8x8.



Shikoni më nga afër rendin në të cilin plotësohen vlerat e tabelës. Ky rend quhet rend zigzag:

Shënuesi: SOF0 - DCT bazë

Ky shënues quhet SOF0 dhe do të thotë që imazhi është i koduar duke përdorur metodën bazë. Është shumë e zakonshme. Por jo më pak e popullarizuar në internet është metoda e njohur progresive, kur një imazh ngarkohet për herë të parë nga rezolucion të ulët, dhe më pas një foto normale. Kjo ju lejon të kuptoni se çfarë tregohet atje pa pritur shkarkimin e plotë. Specifikimi përcakton disa metoda të tjera, siç më duket mua, jo shumë të zakonshme.

FF C0 00 11 08 00 10 00 10 03 01 22 00 02
11 01 03 11 01

Gjatësia: 17 bajt.
Saktësia: 8 bit. Në metodën bazë është gjithmonë 8. Siç e kuptoj unë, kjo është thellësia bit e vlerave të kanalit.
Lartësia e figurës: 0x10 = 16
Gjerësia e figurës: 0x10 = 16
Numri i komponentëve: 3. Më shpesh këto janë Y, Cb, Cr.

Komponenti i parë:
ID: 1
Hollimi horizontal (H 1): 2
[_2] Hollimi vertikal (V 1): 2
ID e tabelës së kuantizimit: 0

Komponenti i dytë:
ID: 2
Hollimi horizontal (H 2): 1
[_1] Hollimi vertikal (V 2): 1

Komponenti i tretë:
ID: 3
Hollimi horizontal (H 3): 1
[_1] Hollimi vertikal (V 3): 1
ID e tabelës së kuantizimit: 1

Tani shikoni se si të përcaktoni se sa i hollë është një imazh. Gjejmë H max =2 dhe V max =2. Kanali i do të hollohet me H max /H i herë horizontalisht dhe V max /V i herë vertikalisht.

Shënues: DHT (Tabela Huffman)

Ky seksion ruan kodet dhe vlerat e marra nga kodimi Huffman.

FF C4 00 15 00 01 01 00 00 00 00
00 00 00 00 00 00 00 00 00 00 03 02

gjatësia: 21 bajt.
klasa: 0 (0 - tabela e koeficientëve DC, 1 - tabela e koeficientëve AC).
[_0] ID e tabelës: 0
Gjatësia e kodit Huffman: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
Numri i kodeve:
Numri i kodeve nënkupton numrin e kodeve të asaj gjatësi. Ju lutemi vini re se seksioni ruan vetëm gjatësinë e kodeve, jo vetë kodet. Ne duhet t'i gjejmë vetë kodet. Pra, kemi një kod me gjatësi 1 dhe një me gjatësi 2. Gjithsej 2 kode, nuk ka më kode në këtë tabelë.
Çdo kod ka një vlerë të lidhur me të, dhe ato janë të listuara në skedar si më poshtë. Vlerat janë me një bajt, kështu që ne lexojmë 2 bajt.
- vlera e kodit të parë.
- vlera e kodit të dytë.

Ndërtimi i një peme të kodit Huffman

Ne duhet të ndërtojmë një pemë binare nga tabela që kemi marrë në seksionin DHT. Dhe nga kjo pemë ne njohim çdo kod. Ne i shtojmë vlerat në rendin në të cilin ato tregohen në tabelë. Algoritmi është i thjeshtë: pa marrë parasysh se në cilën nyje jemi, ne gjithmonë përpiqemi të shtojmë një vlerë në degën e majtë. Dhe nëse ajo është e zënë, atëherë në të djathtë. Dhe nëse nuk ka vend atje, atëherë kthehemi në një nivel më të lartë dhe provojmë nga atje. Duhet të ndaleni në një nivel të barabartë me gjatësinë e kodit. Degët e majta korrespondojnë me vlerën 0, ato të djathta - 1.
Koment:
Ju nuk duhet të filloni nga lart çdo herë. Shtuar një vlerë - kthehu në një nivel më të lartë. A ekziston dega e duhur? Nëse po, ngjituni përsëri. Nëse jo, krijoni një degë të duhur dhe shkoni atje. Pastaj, nga kjo pikë, filloni të kërkoni për të shtuar vlerën tjetër.

Pemë për të gjitha tabelat në këtë shembull:


UPD (faleminderit): Nyjet e pemës së parë (DC, id =0) duhet të kenë vlera 0x03 dhe 0x02

Në rrathë janë kuptimet e kodeve, nën rrathë janë vetë kodet (më lejoni të shpjegoj se i kemi marrë duke kaluar nëpër shtegun nga lart në secilën nyje). Pikërisht me këto kode (të kësaj dhe tabelave të tjera) kodohet vetë përmbajtja e figurës.

Shënuesi: SOS (Fillimi i Skanimit)

Bajt në shënues do të thotë "PO! Më në fund, ne kaluam drejtpërdrejt në analizimin e seksionit të imazhit të koduar!” Megjithatë, seksioni quhet simbolikisht SOS.

  FF DA 00 0C 03 01 00 02 11
03 11 00 3F 00

Gjatësia e pjesës së kokës (jo i gjithë seksionit): 12 bajt.
Numri i komponentëve të skanimit. Kemi 3, nga një për Y, Cb, Cr.

Komponenti i parë:
Numri i komponentit të imazhit: 1 (Y)
ID e tabelës Huffman për koeficientët DC: 0
[_0] ID e tabelës Huffman për koeficientët AC: 0

Komponenti i dytë:
Numri i komponentit të figurës: 2 (Cb)

[_1]

Komponenti i tretë:
Numri i komponentit të imazhit: 3 (Cr)
ID e tabelës Huffman për koeficientët DC: 1
[_1] ID e tabelës Huffman për koeficientët AC: 1

Këta komponentë alternojnë në mënyrë ciklike.

Këtu përfundon pjesa e kokës, nga këtu deri në fund (shënuesi) janë të dhënat e koduara.


0

Gjetja e koeficientit DC.
1. Leximi i një sekuence bitash (nëse hasim 2 bajt, atëherë ky nuk është një shënues, por vetëm një bajt). Pas çdo bit, ne lëvizim përgjatë pemës Huffman (me identifikuesin përkatës) përgjatë degës 0 ose 1, në varësi të bitit të lexuar. Ne ndalemi nëse e gjejmë veten në nyjen përfundimtare.
10 1011101110011101100001111100100

2. Marrim vlerën e nyjës. Nëse është e barabartë me 0, atëherë koeficienti është i barabartë me 0, e shkruajmë në tabelë dhe vazhdojmë me leximin e koeficientëve të tjerë. Në rastin tonë - 02. Kjo vlerë është gjatësia e koeficientit në bit. Kjo do të thotë, ne lexojmë 2 bitet e ardhshme, ky do të jetë koeficienti.
10 10 11101110011101100001111100100

3. Nëse shifra e parë e vlerës në paraqitjen binar është 1, atëherë e lëmë atë siç është: DC_coef = vlera. Përndryshe, ne transformojmë: DC_coef = vlera-2 vlerë gjatësi +1 . Ne shkruajmë koeficientin në tabelë në fillim të zigzagut - këndi i sipërm i majtë.

Gjetja e koeficientëve AC.
1. Ngjashëm me hapin 1, gjetja e koeficientit DC. Ne vazhdojmë të lexojmë sekuencën:
10 10 1110 1110011101100001111100100

2. Marrim vlerën e nyjës. Nëse është 0, kjo do të thotë që vlerat e mbetura të matricës duhet të plotësohen me zero. Pastaj matrica tjetër është e koduar. Të parët që lexojnë deri këtu dhe më shkruajnë për këtë në një mesazh personal do të marrin një plus në karma. Në rastin tonë, vlera e nyjës është 0x31.
Thithja e parë: 0x3 - kjo është saktësisht sa zero duhet të shtojmë në matricë. Këta janë 3 koeficientë zero.
Thithja e dytë: 0x1 - gjatësia e koeficientit në bit. Lexoni pjesën tjetër.
10 10 1110 1 110011101100001111100100

3. Ngjashëm me hapin 3 të gjetjes së koeficientit DC.

Siç e kuptoni tashmë, ju duhet të lexoni koeficientët AC derisa të hasim një vlerë të kodit zero, ose derisa matrica të plotësohet.
Në rastin tonë do të marrim:
10 10 1110 1 1100 11 101 10 0 0 0 1 11110 0 100
dhe matrica:





A keni vënë re se vlerat janë të mbushura në të njëjtin model zigzag?
Arsyeja e përdorimit të këtij rendi është e thjeshtë - pasi sa më të mëdha të jenë vlerat e v dhe u, aq më pak i rëndësishëm është koeficienti S vu në transformimin e kosinusit diskret. Prandaj, në shkallë të lartë të kompresimit, koeficientët e parëndësishëm vendosen në zero, duke zvogëluar kështu madhësinë e skedarit.

[-4 1 1 1 0 0 0 0] [ 5 -1 1 0 0 0 0 0]
[ 0 0 1 0 0 0 0 0] [-1 -2 -1 0 0 0 0 0]
[ 0 -1 0 0 0 0 0 0] [ 0 -1 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0] [-1 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0] [ 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0] [ 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0] [ 0 0 0 0 0 0 0 0]

[-4 2 2 1 0 0 0 0]
[-1 0 -1 0 0 0 0 0]
[-1 -1 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0]

Oh, harrova të them se koeficientët e koduar DC nuk janë vetë koeficientët DC, por dallimet e tyre midis koeficientëve të tabelës së mëparshme (i njëjti kanal)! Matricat duhet të korrigjohen:
DC për të 2-tën: 2 + (-4) = -2
DC për të tretën: -2 + 5 = 3
DC për të katërtën: 3 + (-4) = -1

[-2 1 1 1 0 0 0 0] [ 3 -1 1 0 0 0 0 0] [-1 2 2 1 0 0 0 0]
………

Tani gjithçka është në rregull. Ky rregull vlen deri në fund të skedarit.

... dhe sipas matricës për Cb dhe Cr:

[-1 0 0 0 0 0 0 0]
[ 1 1 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0]

Meqenëse ka vetëm një matricë, koeficientët DC mund të lihen të paprekur.

Llogaritjet

Kuantizimi

A ju kujtohet se matrica kalon në një fazë kuantizimi? Elementet e matricës duhet të shumëzohen term pas termi me elementët e matricës së kuantizimit. Mbetet vetëm të zgjidhni atë që ju nevojitet. Ne fillimisht skanuam komponentin e parë, komponentin e tij të imazhit = 1. Komponenti i imazhit me këtë ID përdor një matricë kuantizimi prej 0 (e jona është e para nga dy). Pra, pas shumëzimit:


[ 0 120 280 0 0 0 0 0]
[ 0 -130 -160 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0]

Në mënyrë të ngjashme, marrim 3 matrica të tjera të kanalit Y...

[-320 110 100 160 0 0 0 0] [ 480 -110 100 0 0 0 0 0]
[ 0 0 140 0 0 0 0 0] [-120 -240 -140 0 0 0 0 0]
[ 0 -130 0 0 0 0 0 0] [ 0 -130 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0] [-140 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0] [ 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0] [ 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0] [ 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0] [ 0 0 0 0 0 0 0 0]

[-160 220 200 160 0 0 0 0]
[-120 0 -140 0 0 0 0 0]
[-140 -130 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0]

...dhe sipas matricës për Cb dhe Cr.

[-170 0 0 0 0 0 0 0] [ 0 0 0 0 0 0 0 0]
[ 180 210 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0] [ 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0] [ 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0] [ 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0] [ 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0] [ 0 0 0 0 0 0 0 0]

Transformimi i kosinusit diskret i anasjelltë

Formula nuk duhet të jetë e vështirë*. S vu është matrica jonë e koeficientit që rezulton. u - kolonë, v - rresht. s yx - drejtpërdrejt vlerat e kanalit.

* Në përgjithësi, kjo nuk është plotësisht e vërtetë. Kur arrita të deshifroja dhe shfaqja imazhin 16x16 në ekran, mora imazhin 600x600 (meqë ra fjala, ky ishte kopertina e albumit të preferuar të Mind.In.A.Box - Lost Alone). Nuk funksionoi menjëherë - u shfaqën defekte të ndryshme. Së shpejti mund të admiroja foton e ngarkuar saktë. E vetmja gjë që më shqetësoi vërtet ishte shpejtësia e shkarkimit. E mbaj mend akoma se u deshën 7 sekonda. Por kjo nuk është për t'u habitur, nëse përdorni pa menduar formulën e mësipërme, atëherë për të llogaritur një kanal prej një piksel, do t'ju duhet të gjeni 128 kosinus, 768 shumëzime dhe disa shtesa. Thjesht mendoni për këtë - pothuajse një mijë operacione të vështira në vetëm një kanal të një piksel! Për fat të mirë, ka vend për optimizim (pas shumë eksperimentesh, e reduktova kohën e ngarkimit në kufirin e saktësisë së kohëmatësit prej 15 ms, dhe pas kësaj e ndryshova imazhin në një foto me një sipërfaqe 25 herë më të madhe. Ndoshta do të shkruaj për këtë në një artikull më vete).

Do të shkruaj rezultatin e llogaritjes vetëm të matricës së parë të kanalit Y (vlerat janë të rrumbullakosura):


[ 87 72 50 36 37 55 79 95]
[-10 5 31 56 71 73 68 62]
[-87 -50 6 56 79 72 48 29]

Dhe 2 të tjerat:
Cb Cr
[ 60 52 38 20 0 -18 -32 -40] [ 19 27 41 60 80 99 113 120]
[ 48 41 29 13 -3 -19 -31 -37] [ 0 6 18 34 51 66 78 85]
[ 25 20 12 2 -9 -19 -27 -32] [-27 -22 -14 -4 7 17 25 30]
[ -4 -6 -9 -13 -17 -20 -23 -25] [-43 -41 -38 -34 -30 -27 -24 -22]
[ -37 -35 -33 -29 -25 -21 -18 -17] [-35 -36 -39 -43 -47 -51 -53 -55]
[ -67 -63 -55 -44 -33 -22 -14 -10] [ -5 -9 -17 -28 -39 -50 -58 -62]
[ -90 -84 -71 -56 -39 -23 -11 -4] [ 32 26 14 -1 -18 -34 -46 -53]
[-102 -95 -81 -62 -42 -23 -9 -1] [ 58 50 36 18 -2 -20 -34 -42]

  1. Oh, do të shkoj të ha!
  2. Po, nuk hyj fare, për çfarë po flasim.
  3. Pasi të jenë marrë vlerat e ngjyrave YCbCr, mbetet vetëm t'i konvertojmë ato në RGB, si kjo: YCbCrToRGB(Y ij, Cb ij, Cr ij), Y ij, Cb ij, Cr ij - matricat tona rezultuese.
  4. 4 matrica Y dhe nga një Cb dhe Cr secila, pasi holluam kanalet dhe 4 piksel Y korrespondojnë me një Cb dhe Cr. Prandaj, llogaritni kështu: YCbCrToRGB(Y ij , Cb , Cr )
Nëse keni zgjedhur 1 dhe 4, atëherë jam i lumtur për ju. Ose e keni kuptuar mirë, ose së shpejti do të shijoni ushqimin tuaj.

YCbCr në RGB

R = Y + 1,402 * Kr
G = Y - 0,34414 * Cb - 0,71414 * Cr
B = Y + 1,772 * Cb
Mos harroni të shtoni 128. Nëse vlerat shkojnë përtej intervalit, atëherë caktoni vlerat kufitare. Formula është e thjeshtë, por gjithashtu konsumon një pjesë të kohës së procesorit.

Këtu janë tabelat që rezultojnë për kanalet R, G, B për katrorin e sipërm majtas 8x8 të shembullit tonë:
255 248 194 148 169 215 255 255
255 238 172 115 130 178 255 255
255 208 127 59 64 112 208 255
255 223 143 74 77 120 211 255
237 192 133 83 85 118 184 222
177 161 146 132 145 162 201 217
56 73 101 126 144 147 147 141
0 17 76 126 153 146 127 108

231 185 117 72 67 113 171 217
229 175 95 39 28 76 139 189
254 192 100 31 15 63 131 185
255 207 115 46 28 71 134 185
255 241 175 125 112 145 193 230
226 210 187 173 172 189 209 225
149 166 191 216 229 232 225 220
72 110 166 216 238 231 206 186

255 255 249 203 178 224 255 255
255 255 226 170 140 187 224 255
255 255 192 123 91 138 184 238
255 255 208 139 103 146 188 239
255 255 202 152 128 161 194 232
255 244 215 200 188 205 210 227
108 125 148 172 182 184 172 167
31 69 122 172 191 183 153 134

fund

Në përgjithësi, unë nuk jam një specialist JPEG, kështu që vështirë se mund t'u përgjigjem të gjitha pyetjeve. Thjesht, kur shkruaja dekoderin tim, shpesh më duhej të merresha me të ndryshme probleme të pakuptueshme. Dhe kur imazhi u shfaq gabimisht, nuk e dija se ku bëra një gabim. Ndoshta ai i ka interpretuar gabimet pjesët, ose ndoshta ka përdorur gabimisht DCT-në. Më mungonte vërtet një shembull hap pas hapi, kështu që shpresoj se ky artikull do të ndihmojë kur shkruaj një dekoder. Mendoj se mbulon përshkrimin e metodës bazë, por prapëseprapë nuk mund ta bësh vetëm. Unë ju ofroj lidhje që më ndihmuan:

Është e lehtë të llogaritet se një imazh i pakompresuar me ngjyra të plota me një madhësi prej 2000 * 1000 piksele do të ketë një madhësi prej rreth 6 megabajt. Nëse flasim për imazhe të marra nga kamerat profesionale ose skanerët me rezolucion të lartë, atëherë madhësia e tyre mund të jetë edhe më e madhe. Megjithë rritjen e shpejtë të kapacitetit të pajisjeve të ruajtjes, algoritme të ndryshme të kompresimit të imazhit janë ende shumë të rëndësishme.
Të gjithë algoritmet ekzistuese mund të ndahen në dy klasa të mëdha:

  • Algoritmet e kompresimit pa humbje;
  • Algoritmet e kompresimit me humbje.
Kur flasim për kompresim pa humbje, nënkuptojmë se ekziston një algoritëm i kundërt me algoritmin e kompresimit që ju lejon të rivendosni me saktësi imazhin origjinal. Nuk ka asnjë algoritëm invers për algoritmet e kompresimit me humbje. Ekziston një algoritëm që rikthen një imazh që nuk përputhet domosdoshmërisht saktësisht me atë origjinal. Algoritmet e kompresimit dhe rikuperimit janë zgjedhur për të arritur një raport të lartë kompresimi duke ruajtur cilësinë vizuale të imazhit.

Algoritmet e kompresimit pa humbje

Algoritmi RLE
Të gjitha algoritmet e serive RLE bazohen në një ide shumë të thjeshtë: grupet e përsëritura të elementeve zëvendësohen nga një çift (numri i përsëritjeve, elementi përsëritës). Le të shqyrtojmë këtë algoritëm duke përdorur shembullin e një sekuence bitash. Kjo sekuencë do të alternojë grupet e zerove dhe njësheve. Për më tepër, grupet shpesh do të kenë më shumë se një element. Pastaj sekuenca 11111 000000 11111111 00 do të korrespondojë me grupin e mëposhtëm të numrave 5 6 8 2. Këta numra tregojnë numrin e përsëritjeve (numërimi fillon nga njësh), por edhe këta numra duhet të kodohen. Ne do të supozojmë se numri i përsëritjeve qëndron në intervalin nga 0 në 7 (d.m.th., 3 bit janë të mjaftueshëm që ne të kodojmë numrin e përsëritjeve). Pastaj sekuenca e diskutuar më sipër kodohet nga sekuenca e mëposhtme e numrave 5 6 7 0 1 2. Është e lehtë të llogaritet se kodimi i sekuencës origjinale kërkon 21 bit, dhe në formën e ngjeshur RLE kjo sekuencë merr 18 bit.
Edhe pse ky algoritëm është shumë i thjeshtë, efikasiteti i tij është relativisht i ulët. Për më tepër, në disa raste, përdorimi i këtij algoritmi nuk çon në një ulje, por në një rritje të gjatësisë së sekuencës. Për shembull, merrni parasysh sekuencën e mëposhtme 111 0000 11111111 00. Sekuenca përkatëse RL duket kështu: 3 4 7 0 1 2. Gjatësia e sekuencës origjinale është 17 bit, gjatësia e sekuencës së ngjeshur është 18 bit.
Ky algoritëm është më efektiv për imazhet bardh e zi. Gjithashtu përdoret shpesh si një nga fazat e ndërmjetme të kompresimit të algoritmeve më komplekse.

Algoritmet e fjalorit

Ideja prapa algoritmeve të fjalorit është që zinxhirët e elementeve të sekuencës origjinale janë të koduara. Ky kodim përdor një fjalor të veçantë, i cili merret bazuar në sekuencën origjinale.
Ekziston një familje e tërë e algoritmeve të fjalorit, por ne do të shikojmë algoritmin më të zakonshëm LZW, të quajtur sipas zhvilluesve të tij Lepel, Ziv dhe Welch.
Fjalori në këtë algoritëm është një tabelë që është e mbushur me zinxhirë kodues ndërsa algoritmi funksionon. Kur kodi i ngjeshur deshifrohet, fjalori rikthehet automatikisht, kështu që nuk ka nevojë të transmetohet fjalori së bashku me kodin e ngjeshur.
Fjalori inicializohet me të gjitha vargjet e vetme, d.m.th. rreshtat e parë të fjalorit paraqesin alfabetin në të cilin kodojmë. Gjatë kompresimit, bëhet një kërkim për zinxhirin më të gjatë të regjistruar tashmë në fjalor. Sa herë që haset një zinxhir që nuk është shkruar ende në fjalor, ai shtohet aty dhe del një kod i ngjeshur që korrespondon me zinxhirin e shkruar tashmë në fjalor. Në teori, nuk vendosen kufizime në madhësinë e fjalorit, por në praktikë ka kuptim të kufizohet kjo madhësi, pasi me kalimin e kohës fillojnë të shfaqen zinxhirë që nuk gjenden më në tekst. Përveç kësaj, kur dyfishojmë madhësinë e tabelës, duhet të ndajmë një bit shtesë për të ruajtur kodet e ngjeshur. Për të parandaluar situata të tilla, futet një kod i veçantë, që simbolizon inicializimin e tabelës me të gjithë zinxhirët me një element.
Le të shohim një shembull të një algoritmi kompresimi. Do të ngjeshim vijën cuckoocuckoocuckoohood. Le të supozojmë se fjalori do të përmbajë 32 pozicione, që do të thotë se secili prej kodeve të tij do të zërë 5 bit. Fillimisht fjalori plotësohet si më poshtë:

Kjo tabelë ekziston si në anën e atij që ngjesh informacionin ashtu edhe në anën e atij që e dekompreson atë. Tani do të shikojmë procesin e kompresimit.

Tabela tregon procesin e plotësimit të fjalorit. Është e lehtë të llogaritet se kodi i ngjeshur që rezulton merr 105 bit, dhe teksti origjinal (duke supozuar se kemi shpenzuar 4 bit duke koduar një karakter) merr 116 bit.
Në thelb, procesi i dekodimit zbret në dekodimin e drejtpërdrejtë të kodeve dhe është e rëndësishme që tabela të inicializohet në të njëjtën mënyrë si gjatë kodimit. Tani le të shohim algoritmin e deshifrimit.


Ne mund të përcaktojmë plotësisht vargun e shtuar në fjalor në hapin e i-të vetëm në i+1. Natyrisht, rreshti i-të duhet të përfundojë me karakterin e parë të rreshtit i+1. Se. Sapo kuptuam se si të rivendosim një fjalor. Me njëfarë interesi është situata kur një sekuencë e formës cScSc është e koduar, ku c është një karakter dhe S është një varg, dhe fjala cS është tashmë në fjalor. Në pamje të parë mund të duket se dekoderi nuk do të jetë në gjendje ta zgjidhë këtë situatë, por në fakt të gjitha linjat e këtij lloji duhet të përfundojnë gjithmonë me të njëjtin karakter me të cilin fillojnë.

Algoritmet e kodimit statistikor
Algoritmet në këtë seri caktojnë kodin më të shkurtër të ngjeshur për elementët më të shpeshtë të sekuencave. Ato. sekuencat me të njëjtën gjatësi janë të koduara me kode të ngjeshur me gjatësi të ndryshme. Për më tepër, sa më shpesh të ndodhë një sekuencë, aq më i shkurtër është kodi përkatës i ngjeshur.
Algoritmi Huffman
Algoritmi Huffman ju lejon të ndërtoni kode prefikse. Ne mund të mendojmë për kodet e parashtesave si shtigje në një pemë binare: kalimi nga një nyje në fëmijën e saj të majtë korrespondon me një 0 në kod, dhe tek fëmija i saj i djathtë korrespondon me një 1. Nëse etiketojmë gjethet e pemës me simbolet për t'u koduar, marrim një paraqitje binar të pemës së kodit të prefiksit.
Le të përshkruajmë algoritmin për ndërtimin e një peme Huffman dhe marrjen e kodeve Huffman.
  1. Karakteret e alfabetit të hyrjes formojnë një listë të nyjeve të lira. Çdo fletë ka një peshë që është e barabartë me shpeshtësinë e shfaqjes së simbolit
  2. Përzgjidhen dy nyje pemësh të lira me peshën më të vogël
  3. Prindi i tyre krijohet me një peshë të barabartë me peshën e tyre totale
  4. Prindi i shtohet listës së nyjeve të lira dhe dy fëmijët e tij hiqen nga kjo listë
  5. Njërit hark që largohet nga prindi i caktohet biti 1, tjetrit i caktohet biti 0
  6. Hapat që fillojnë nga e dyta përsëriten derisa të mbetet vetëm një nyje e lirë në listën e nyjeve të lira. Kjo do të konsiderohet rrënja e pemës.
Duke përdorur këtë algoritëm, ne mund të marrim kodet Huffman për një alfabet të caktuar, duke marrë parasysh shpeshtësinë e shfaqjes së karaktereve.
Kodimi aritmetik
Algoritmet e kodimit aritmetik kodojnë vargjet e elementeve në një fraksion. Në këtë rast, merret parasysh shpërndarja e frekuencës së elementeve. Për momentin, algoritmet e kodimit aritmetik mbrohen nga patenta, kështu që ne do të shikojmë vetëm idenë bazë.
Le të përbëhet alfabeti ynë nga N simbole a1,...,aN, dhe frekuencat e tyre të shfaqjes p1,...,pN, përkatësisht. Le të ndajmë gjysmën e intervalit)

Artikujt më të mirë mbi këtë temë