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

JPEG, JPEG2000, JPEG-LS. Kompresimi i imazhit me humbje dhe pa humbje

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 në madhësi se tjetri.

Imazhet gjithashtu ndryshojnë në cilësi. Unë mendoj se ju keni parë 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 foto identike, por njëra është e cilësisë më të mirë, dhe tjetra është e cilësisë 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 vijnë në një sërë formatesh. 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 befas 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 i njohur imazhi në internet. Ju mund t'i ruani ato në të pa humbur cilësinë, por me një numër të kufizuar ngjyrash - 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 është marrë madhësia e vogël 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ë shumë cilësi të mirë, pa kompresim Prandaj, madhësia e skedarëve të tillë është e madhe. TIFF përdoret kur cilësia ka një 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ë vendosni se cilin format të zgjidhni për imazhin. Madhësia dhe cilësia e saj do të varen nga kjo. Dhe për të përdorur imazhe madhësi më të vogël dhe pa humbur cilësi, 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),
  • vektor (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ë imazhet e 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ë faqet e internetit.

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 të imazhe të ndryshme Online. 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 kur krijoni banderola, butona, ikona 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

Është një format skedari vektorial i 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, të tilla si logot, elementët e dizajnit dhe kështu me radhë. Jo i përshtatshëm për fotografi.

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

WebP

Një format me burim të hapur 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, pavarësisht nga 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 tashmë e dini këtë 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ë bit 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 (22 = 4 ngjyra) CGA, gradim gri NeXTstation
    • 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 Unix të trashëguara, VGA me rezolucion të ulët, Super VGA, AGA
    • Ngjyra 12-bitësh (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ë aq e thjeshtë sa që shkrep vetëm JPEG dhe ju dëshironi të merrni cilësi maksimale, vendosni madhësinë maksimale dhe kompresimin minimal dhe mos e mundoni veten me faktin se 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 krijimin foto 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 profesionale ose skanerët me rezolucion të lartë, 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. Për algoritmet e kompresimit me humbje algoritmi i kundërt nuk ekziston. Ekziston një algoritëm që rikthen një imazh që nuk përputhet domosdoshmërisht saktësisht me atë origjinal. Algoritmet e kompresimit dhe rikuperimit zgjidhen 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, është futur kod të veçantë, që simbolizon inicializimin e tabelës me të gjithë zinxhirët e vetëm.
    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.



    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. Ne 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ëri 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ë.

Ë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ë, 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 zgjidhen 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.


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. Ne 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ëri 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. Këta hapa janë të rëndësishëm që koduesi të funksionojë në mënyrë efektive në hapin tjetër.

1.2. PREP

Si hap kyç i algoritmit të kompresimit, transformimi i kosinusit diskret (më tej i referuar si DCT) është një lloj transformimi Furier dhe, si ky i fundit, ka një transformim të anasjelltë (DCCT). Nëse e konsiderojmë një imazh si një grup valësh hapësinore, ku boshtet X dhe Y korrespondojnë me gjerësinë dhe lartësinë e figurës, dhe boshti Z shfaq vlerat e ngjyrave të pikselëve përkatës, atëherë mund të lëvizim nga hapësinor. përfaqësimi i figurës në të paraqitje spektrale dhe mbrapa. DCT konverton një matricë N x N pikselësh në një matricë të koeficientëve të frekuencës të madhësisë së duhur.



Oriz. 4.

Në matricën që rezulton, komponentët me frekuencë të ulët janë të vendosura më afër këndit të sipërm të majtë dhe komponentët me frekuencë më të lartë zhvendosen poshtë në të djathtë. Për shkak të faktit se pjesa kryesore e imazheve grafike në ekran përbëhet nga informacione me frekuencë të ulët, duke përdorur matricën që rezulton mund të hidhni më së paku në mënyrë diferenciale informacion i rendesishem me humbje minimale të shikimit. Kështu, DCT ju lejon të zgjidhni informacione që mund të hidhen në mënyrë të sigurtë pa futur shtrembërime serioze në figurë. Është e vështirë të imagjinohet se si mund të realizohet kjo detyrë në imazhin origjinal.

Nga formulat (Fig. 4) është e qartë se llogaritja e një elementi të matricës që rezulton kërkon kohë O(N 2), kështu që është pothuajse e pamundur të transformohet e gjithë matrica. Ekipi i zhvillimit JPEG propozoi zgjidhjen më të mirë për këtë problem: ndani matricën origjinale në katrorë madhësi standarde 8x8 dhe transformoni secilën prej tyre. Përdorimi i blloqeve më të mëdha do të përmirësojë cilësinë e kompresimit, por jo pafundësisht, pasi probabiliteti që pikat shumë të largëta të jenë të ngjashme me njëra-tjetrën është shumë e vogël.

Vlen të përmendet se gjatë llogaritjeve përdoren vetëm 32 vlera të kosinusit të parallogaritur, gjë që ju lejon të rritni ndjeshëm shpejtësinë e konvertimit. Kjo padyshim çon në humbje të pjesshme të informacionit, por vëllimet e tij janë relativisht të parëndësishme.

Një rritje e lehtë e performancës mund të arrihet nëse përdoret vetëm aritmetika e numrave të plotë në llogaritjet, e cila, megjithatë, është e rëndësishme vetëm për më të vjetrat. kompjuterët, pasi në kompjuterët modernë kostoja e operacioneve në numrat me pikë lundruese nuk është e ndryshme nga operacionet në numra të plotë. Gjithashtu, përdorimi i aritmetikës së numrave të plotë ndikon negativisht në cilësinë e imazhit të ngjeshur, gjë që e bën këtë metodë të papranueshme për kompjuterë modernë. Meqenëse DCT është një lloj transformimi Furier, këtu mund të përdoren të gjitha metodat për rritjen e performancës së transformimit Fourier.

1.3. Rrumbullakimi

Faza tjetër, ku ndodh humbja kryesore e informacionit, është rrumbullakimi ose kuantizimi. Siç mund ta shihni, DCT nuk kryen asnjë kompresim ose kodim. Detyra e tij kryesore është të transformojë imazhin origjinal në një formë të përshtatshme për operacionet e mëvonshme në të.

Rrumbullakimi është procesi i reduktimit të sasisë së informacionit të kërkuar për të ruajtur matricën DCT, me një humbje të pjesshme të saktësisë. Sipas standardit JPEG, për këtë përdoret një matricë rrumbullakimi (RO). Çdo element i matricës origjinale DCT korrespondon me një element MO. Matrica që rezulton fitohet duke pjesëtuar matricën origjinale me MO. Në këtë rast, vlerat me frekuencë të ulët në matricën DCT korrespondojnë me koeficientët më të vegjël MO, gjë që bën të mundur ruajtjen e informacionit më domethënës, me frekuencë të ulët dhe hedhjen e informacionit më pak të rëndësishëm me frekuencë të lartë. Për shkak të faktit se përbërësit me frekuencë të ulët janë të përqendruar në të majtë këndi i sipërm Matricat DCT, vlerat MO rriten nga e majta në të djathtë dhe nga lart poshtë.


3 5 7 9 11 13 15 17
5 7 9 11 13 15 17 19
7 9 11 13 15 17 19 21
9 11 13 15 17 19 21 23
11 13 15 17 19 21 23 25
13 15 17 19 21 23 25 27
15 17 19 21 23 25 27 29
17 19 21 23 25 27 29 31

Një shembull i një matrice rrumbullakimi me një faktor cilësie prej 2.

Rezultatet e rrumbullakimit dhe cilësia e imazhit të rindërtuar varen drejtpërdrejt nga matrica e zgjedhur e rrumbullakimit. Standardi JPEG ju lejon të përdorni çdo MO, por ISO, përmes testimit të gjerë eksperimental, ka zhvilluar një grup matricash që ju lejojnë të arrini rezultate optimale.

1.4. Kompresimi

Faza e fundit e algoritmit të kodimit JPEG është kompresimi. Pas përpunimit të matricës DCT duke përdorur MO, një numër i madh zerosh shfaqen në matricën që rezulton, veçanërisht në rajonin me frekuencë të lartë (këndi i poshtëm djathtas).

Hapi i parë është zëvendësimi i vlerës në këndin e sipërm të majtë të matricës që rezulton me një vlerë relative. Meqenëse blloqet e imazhit ngjitur janë të ngjashëm me njëri-tjetrin, kodimi i elementit tjetër (0,0) përmes ndryshimit me atë të mëparshëm do të jetë më efikas. Hapi i dytë është aplikimi i drejtpërdrejtë i algoritmit të kodimit të përsëritjes (LZW) në proces sasi e madhe zero të njëpasnjëshme. Testimi eksperimental ka treguar se rezultatet më të mira mund të arrihen nëse kaloni rreth matricës në një zigzag, siç tregohet në figurën më poshtë.

Oriz. 5.

Së fundi, në hapin e tretë dhe të fundit, rezultati që rezulton kompresohet si të dhëna normale duke përdorur algoritmin Huffman ose kodimin aritmetik në varësi të zbatimit. Kjo fazë quhet "kodimi i entropisë" (në terminologjinë JPEG).

1.5. Dekodimi

Meqenëse DCT është një transformim Furier, ekziston një transformim kosinus diskrete inversi (IDCT) për të. Algoritmi i dekodimit përsërit algoritmin e kodimit në rend të kundërt.

2.JPEG2000

Fillimisht, standardi i ri u zhvillua si bazë për standardin e ardhshëm të kompresimit pa humbje JPEG-LS, por më vonë u braktis për shkak të ardhjes së algoritmeve më efikase. Për shkak të zhvillimit të teknologjisë, standardi JPEG gradualisht humbi rëndësinë e tij. Zhvilluesit e JPEG2000 shpresonin të krijonin një standard që do të korrigjonte shumë nga gabimet në standardet ekzistuese. Ndër detyrat e tyre ishin:

  • Eliminimi nuk është kompresim efektiv në rajonin me frekuencë të ulët. Algoritmet ekzistuese bënë një punë të mirë për të kompresuar rajonet me frekuencë të mesme dhe të lartë, por ata treguan rezultate të dobëta në rajonin me frekuencë të ulët.
  • Kompresim me humbje dhe pa humbje. Në kohën e zhvillimit, nuk kishte asnjë standard që lejonte kompresimin me humbje dhe pa humbje në një rrjedhë të vetme kompresimi.
  • Përpunimi i madh i imazhit. Algoritmet ekzistuese nuk lejuan kompresim efikas të imazheve më të mëdha se 64Kx64K pa pllaka.
  • Struktura e unifikuar e algoritmit të kompresimit. Zbatimi aktual JPEG mbështeti 44 modifikime, shumica e të cilave ishin specifike për aplikacionin dhe nuk mbështeteshin nga shumica e dekoderëve.
  • Imuniteti ndaj zhurmës. Në kohën e zhvillimit të JPEG, teknologjitë e rrjetit nuk ishin ende mjaftueshëm të zhvilluara, dhe projektuesit JPEG nuk mendonin për imunitetin ndaj zhurmës kur transmetonin imazhe mbi kanale të pasigurta ose aftësinë për të rivendosur imazhin nëse ai dëmtohej si rezultat i transmetimit.
  • Imazhe të krijuara nga kompjuteri. Algoritmet origjinale funksionuan mirë në fotografitë dixhitale dhe imazhet e marra duke përdorur një aparat fotografik dixhital ose skaner, por nuk përpunuan në mënyrë efektive imazhet e krijuara në një kompjuter, për shembull, duke përdorur redaktuesit e imazheve.
  • Dokumentet komplekse. JPEG performoi shumë dobët gjatë përpunimit të imazheve komplekse 2D (në veçanti imazhet e tekstit).

Diagrami i mëposhtëm tregon hapat bazë të një koduesi JPEG2000.


Oriz. 6.


Oriz. 7.

Ndryshe nga JPEG, koduesi JPEG2000 nuk kërkon ndarjen e imazhit në blloqe të vogla katrore, pasi DWT (transformimi i valëzuar diskrete) i përdorur gjatë funksionimit të algoritmit funksionon në fragmente të çdo madhësie. Nga ana tjetër, ndonjëherë, nëse sasia e memories së disponueshme për të punuar me koduesin është më e vogël se sasia e memories që kërkohet për të koduar të gjithë imazhin, imazhi ndahet në pllaka katrore, të cilat kodohen në mënyrë të pavarur nga njëra-tjetra. Më pas, ne do të shqyrtojmë kodimin e një pllake. Hapat e mbetur janë të ngjashëm me JPEG.

Oriz. 8.

2.2. Fiberboard

JPEG2000 përdor Transformimin Diskret të valëve për të ndarë imazhin në rajone me frekuencë të lartë dhe me frekuencë të ulët. DWP përpunon çdo rresht dhe kolonë të imazhit burim duke përdorur filtri i frekuencës.

Oriz. 9.

Për shkak të faktit se çdo kalim duke përdorur një filtër frekuence në dalje dyfishon sasinë e informacionit, pas përpunimit madhësia e imazhit zvogëlohet përgjysmë. Pas një faze të përpunimit të pllakës së fortë, fragmenti i përpunuar ndahet në katër segmente:

  • LL - frekuencave të ulëta sipas rreshtave dhe kolonave
  • HL – frekuenca të larta në rreshta dhe frekuenca të ulëta në kolona
  • LH - frekuenca të ulëta në rreshta dhe frekuenca të larta në kolona
  • HH - frekuenca të larta në rreshta dhe kolona

Sipas standardit, numri i fazave mund të jetë nga 0 në 32. Për një imazh të rregullt, përdoren nga 4 në 8 faza. Në çdo fazë pasuese, përpunohet vetëm rajoni me frekuencë të ulët (LL), pasi rajonet me frekuencë të lartë zakonisht nuk përmbajnë informacion të rëndësishëm.


Oriz. 10.

Oriz. njëmbëdhjetë.

2.3. Rrumbullakimi

Për të rrumbullakosur koeficientët DWT, përdoret një kuantizues konstant me një zonë të vdekur. (Fig. 14) Për çdo fragment përdoret një vlerë konstante e hapit të rrumbullakosjes për të gjithë koeficientët e këtij fragmenti. Formula për llogaritjen e vlerave të rrumbullakosura është paraqitur në figurën 12. Këtu y është vlera fillestare e koeficientit, shenja (y) përcakton shenjën e koeficientit dhe Δb është vlera e hapit të rrumbullakimit. Zonë e vdekur Kuantizuesi është një interval me një interval prej 2Δb rreth zeros, ai jep një numër më të madh zerosh në dalje.

2.4. Kodimi

Kodimi i koeficientëve të rrumbullakosur që rezultojnë kryhet bllok pas blloku. Sipas standardit JPEG2000, menjëherë para kodimit, fragmentet ndahen në blloqe mjaft të vogla (për shembull, me madhësi 32x32 ose 64x64) në mënyrë që të gjitha blloqet e një fragmenti të kenë të njëjtën madhësi. Ndarja në blloqe kryhet për të zbatuar një organizim më fleksibël të informacionit të ngjeshur për të rritur imunitetin ndaj zhurmës etj.


Oriz. 16.

Në JPEG2000, çdo bllok është i koduar veçmas. Algoritmi i kodimit përshkon matricën e koeficientit të rrumbullakimit të çdo blloku në vija, siç tregohet në figurën 17. Blloqet ndahen në blloqe me një lartësi nominale prej 4. Shiritat më pas skanohen nga lart poshtë dhe kolonat në secilin rrip janë përshkohet nga e majta në të djathtë.


Oriz. 17.

Gjatë procesit të kodimit, koeficientët në një bllok përfaqësohen praktikisht si plane bit. Një nga këto plane përbëhet nga shenjat e koeficientëve; planet e mbetura korrespondojnë me shifra të ndryshme të vlerave të koeficientit (pozicioni i bitit në plan korrespondon me pozicionin e koeficientit në bllok). Kodimi kryhet me aeroplan: së pari kodohet rrafshi që korrespondon me shifrën më domethënëse të koeficientëve, pastaj rrafshi tjetër në rend zbritës, etj. Mund të ndodhë që rrafshet e biteve me prioritet më të lartë N (planet NPB) të mos përmbajnë të tillë. Në këtë rast, rrafshi i parë me radhë që përmban të paktën një njësi bëhet rrafshi NPB. Planet boshe që i paraprijnë hiqen gjatë kodimit dhe informacioni për numrin e tyre futet në kokën e bllokut.

Kodimi aritmetik bazohet në një model të ndjeshëm ndaj kontekstit. Konteksti formohet si funksion i vlerave të biteve që rrethojnë bitin që kodohet. Çdo plan bit, përveç NBP, zakonisht kodohet në tre kalime. Gjatë kalimit të kodit të parë, shpërndahet informacioni për rëndësinë e koeficientëve. Gjatë kodimit, çdo koeficienti në bllokun e koduar i caktohet një parametër i rëndësisë. Një koeficient quhet i rëndësishëm nëse në rrafshet e biteve të koduara tashmë për momentin, ekziston të paktën një bit jo zero i këtij koeficienti.

Për çdo bit të planit, nëse koeficienti përkatës nuk është ende i rëndësishëm, dhe nëse të paktën një koeficient fqinj është tashmë domethënës, kodohet fakti i rëndësisë për koeficientin aktual, domethënë vlera e këtij biti të rrymës së koduar. avioni është në të vërtetë i koduar. Nëse biti i koduar rezulton të jetë jo zero, menjëherë pas përpunimit të tij, kodohet biti përkatës i rrafshit të biteve të shenjave të koeficientit (kodimi i shenjave).

Gjatë kalimit të dytë, kodohen pjesët e koeficientëve që janë aktualisht domethënës, të paprekur në kalimin e parë. Ndryshe nga kalimi i mëparshëm, kur vendimi i kodimit u mor në bazë të informacionit për rëndësinë e koeficientëve fqinjë, gjatë këtij kalimi bitet kodohen pa dështuar.

Kalimi i tretë dhe i fundit përpunon ato bit që nuk janë përpunuar gjatë kalimit të parë dhe të dytë. Gjatë kësaj fazën përfundimtare kodimi aritmetik përdoret në lidhje me kodimin në grup.

Një detaj thelbësor i ofruar nga standardi është aftësia për të kapërcyer kalimet e kodit, që është një burim tjetër i përfitimeve të efikasitetit për shkak të humbjeve të informacionit (burimi i parë, më i dukshëm është kuantizimi). Ky funksion përdoret në mënyrë aktive për të kontrolluar shpejtësinë e gjenerimit të kodit.

2.5. Organizimi i të dhënave

Një avantazh i rëndësishëm i standardit në shqyrtim është aftësia për të hyrë në elementë individualë të imazhit pa deshifruar plotësisht paraqitjen e tij. Kjo mundësi sigurohet, së pari, duke e ndarë imazhin origjinal në zona që nuk mbivendosen (pllaka), të cilat janë të koduara si imazhe të veçanta, dhe së dyti, duke paraqitur kodin e një pllake individuale në formën e pjesëve (shtresave), secila prej i cili është një kod total i koeficientëve që korrespondojnë me një sipërfaqe të caktuar të tij (tjegull). Shtresat, nga ana tjetër, ndahen në të ashtuquajturat paketa që përmbajnë kodin e blloqeve të koeficientit për nivele të ndryshme dekompozimi. Për të deshifruar ndonjë zona e imazhit, mjafton të përcaktohet se cilës pllaka i përket dhe cilat shtresa që lidhen me këto pllaka përmbajnë kodin e blloqeve të koeficientit të nevojshëm për të rivendosur sipërfaqen e kërkuar.



Oriz. 20.

Natyrisht, një paraqitje "e përshtatshme" e imazhit mund të mos jetë e dobishme për sa i përket efikasitetit të kompresimit. Në të vërtetë, me një ulje të madhësisë së elementeve strukturorë (pllakat, sipërfaqet e pllakave që formojnë shtresa, etj.), Efikasiteti i ngjeshjes zvogëlohet disi. Standardi në këtë rast na lë me një zgjedhje: nga njëra anë, ne kemi mundësinë të marrim përfaqësime informacioni që na lejojnë të nxjerrim dhe modifikojmë shpejt pjesë të imazhit, nga ana tjetër, standardi nuk pengon krijimin e paraqitjet e informacionit që janë efikase në vëllim.

Për të siguruar imunitetin ndaj zhurmës dhe lehtësinë e aksesit në informacion, standardi JPEG2000 ofron një sistem shënuesish dhe segmentesh shënuesish. Segmentet e shënuesve përmbajnë parametra të pjesëve të informacionit të kufizuar nga shënuesit. Të dhënat që fillojnë me një shënues mund të interpretohen saktë pa asnjë informacion shtesë (kjo nuk do të thotë që e tëra mund të rindërtohet nga fragmente), gjë që bën të mundur rikthimin e pjesshëm të një imazhi, përfaqësimi i të cilit është dëmtuar. Futja e elementeve të imunitetit ndaj zhurmës i jep dritën jeshile përdorimit të standardit në të gjitha llojet e aplikacioneve të telekomunikacionit.

Arritja e kompresimit me cilësi të lartë ishte, natyrisht, një nga detyrat kryesore gjatë krijimit të standardit, dhe këtu zhvilluesit kanë bërë përparim të qartë. Standardi JPEG2000 është afërsisht 2 herë më efikas se standardi JPEG kur kompresohet me humbje dhe me 5-20% kur kompresohet pa humbje. Sigurisht, efikasiteti i kompresimit pa humbje në këtë rast nuk është aq i lartë sa, të themi, standardi JPEG-LS, por është mjaft i pranueshëm. Sa i përket efikasitetit të kompresimit me humbje, këtu standardi ju lejon të merrni rezultate që janë afër rezultateve më të mira për këtë lloj metodash sot.

3.JPEG-LS

Formati JPEG-LS bazohej në format LOCO-I(Ngjeshje pa humbje me kompleksitet të ulët për imazhet). Algoritmi i ngjeshjes pa humbje LOCO-I, i miratuar si bazë për zhvillimin e standardit JPEG-LS, për herë të parë siguroi jo vetëm modalitetin pa humbje, por edhe pothuajse pa humbje (ngjeshje me humbje të kufizuara, të përcaktuara nga përdoruesi). Ndryshe nga modaliteti JPEG2000 pa humbje, JPEG-LS doli të ishte vërtet i suksesshëm: me efikasitet më të madh të kompresimit, standardi i ri ofron shpejtësi të lartë kompresimi/dekompresimi dhe nuk është shumë kërkues për burimet e kompjuterit.

Është e rëndësishme të kuptohet se formati JPEG-LS:

  • nuk është një zgjerim ose modifikim i metodës JPEG;
  • nuk përdor as kodim DCT as aritmetik;
  • përdor kuantizimin e dobët vetëm në modalitetin "pothuajse pa humbje".

3.1. Prezantimi i koncepteve bazë dhe parimeve të funksionimit

Kompresimi i të dhënave pa humbje përbëhet nga dy pjesë të pavarura të veçanta: modelimi dhe kodimi. Le të përcaktojmë disa terma që do t'i përdorim në mënyrë aktive në të ardhmen:

Encoder është "përgjegjës" për procesin e kodimit, domethënë: ai merr si hyrje imazhin origjinal në formatin dixhital dhe të gjithë parametrat e nevojshëm të përcaktuar nga standardi, dhe duke përdorur një grup të veçantë procedurash krijon një grup të dhënash që përmbajnë imazhin e ngjeshur. Dekoderi "përgjigjet" për procesin e dekodimit dhe konvertimit të fragmenteve, përkatësisht: marrja e të dhënave me një imazh të ngjeshur dhe të gjithë parametrat e nevojshëm si hyrje, nxjerr një imazh të rindërtuar.

Dekoderi JPEG-LS ndryshon pak nga koduesi, kështu që ky algoritëm kompresimi mund të quhet pothuajse simetrik. Këtu është një diagram i thjeshtuar që tregon parimet e kodimit:



Oriz. 21.

Disa informacione rreth imazh origjinal: siç tregohet në diagramin më poshtë (Fig. 22), imazhi origjinal mund të përbëhet nga komponentë Nf. Çdo komponent Ci përmban një grup dy-dimensional pikselësh (mostrash) të kolonave x i dhe rreshtave y i. Madhësitë e komponentëve varen nga dy parametra: X dhe Y, ku X është maksimumi midis vlerave x i dhe Y është maksimumi midis vlerave y i të të gjithë komponentëve. (Në standardin JPEG-LS, një kapitull i tërë i kushtohet ndryshimeve në punën me imazhe me shumë komponentë në krahasim me imazhet me një komponent, por në këtë artikull do të përqendrohemi vetëm në punën me imazhe me një komponent).



Oriz. 22.

Figura tregon orientimin e secilit komponent: lart, poshtë, majtas dhe djathtas. Rendi në të cilin pikselët dorëzohen në procedurat e kodimit përcaktohet si më poshtë: nga e majta në të djathtë (nga e majta në të djathtë) dhe nga lart-poshtë (nga lart poshtë) sipas komponentit.

Pixelat e kontekstit a, b, c, d përdoren për të parashikuar pikselin aktual x. Në varësi të kontekstit, koduesi zgjedh një modalitet: serial (modaliteti i ekzekutimit) ose modaliteti i rregullt. Modë seriale zgjidhet nëse y dhe z ka të ngjarë të përkojnë, e rregullt- ndryshe. Le të bëjmë një shënim këtu në lidhje me praninë e opsionit "Pothuajse asnjë humbje": Kur ky opsion është i aktivizuar, modaliteti serial do të zgjidhet nëse y dhe z janë pothuajse identike sipas parametrit të tolerancës NEAR.

Në rastin e përdorimit të modës serike, fillojmë të shfletojmë linjë aktuale nga piksel x dhe gjeni gjatësinë më të madhe të një serie pikselësh që përputhen me pikselin kontekstual a. Kështu, brenda vijës aktuale marrim një seri pikselësh identikë që përkojnë në vlerë me pikselin e njohur a. Gjithçka që mbetet është të kodojmë gjatësinë e serisë. (Kjo bëhet duke përdorur një grup me 32 elemente J.) Mund ta keni menduar tashmë se me opsionin "pothuajse pa humbje" të aktivizuar, një seri pikselësh afër a zgjidhen duke përdorur parametrin NEAR.

Tani le të shohim veprimet tona në rastin e përdorimit të një regjimi të rregullt. Vlerat e pikselave a, b dhe c përdoren për të llogaritur parashikimin e pikselit x (Px). Pastaj llogaritet i ashtuquajturi gabim i parashikimit (Errval). Vlera e tij është e barabartë me diferencën midis vlerave të x dhe Px. Errval rregullohet nga një term i varur nga konteksti dhe më pas kodohet duke përdorur kodet Golomb. Kodi Golomb varet nga a, b, c, d dhe Errval të të njëjtëve pikselë, të cilët ruhen në grupe speciale A dhe N. Kur opsioni "pothuajse pa humbje" është i aktivizuar, gabimi i parashikimit kuantizohet më tej përpara kodimit.


Oriz. 23.

3.2. Enkoder

JPEG-LS përdoret kryesisht si një metodë e kompresimit të informacionit pa humbje, prandaj skedari i imazhit të rikuperuar është zakonisht identik me skedarin origjinal. Në një mënyrë pothuajse pa humbje, imazhi origjinal dhe imazhi i rindërtuar mund të ndryshojnë. Pixelin e rindërtuar do ta shënojmë me Rp dhe pikselin origjinal me p.

Në fazën e inicializimit, koduesi kryen veprimet e mëposhtme:

  • Parametrat janë llogaritur RANGE = dysheme ((MAXVAL + 2 * AFËR) / (2 * AFËR + 1)) + 1, qbpp = tavan (varg log), bpp = max (2, tavan (log (MAXVAL + 1)) ), LIMIT = 2 * (bpp + max(8, bpp)) . (Në rast kodimi pa humbje, AFËR = 0, RANGE = MAXVAL + 1. Nëse modaliteti "pothuajse pa humbje" është i aktivizuar, AFËR > 0). MAXVAL dhe NEAR janë parametra të vendosur nga aplikacioni që zbaton algoritmin.
  • Vargjet e indeksit N, A, B dhe C janë inicializuar. Le të shpjegojmë qëllimin e tyre: N përdoret për të ruajtur frekuencën e shfaqjes së secilit kontekst, A - për të grumbulluar vlerën e gabimit të parashikimit, B - për të llogaritur devijimin sistematik, C - për të ruajtur vlerat e korrigjimit të gabimi i parashikimit.
  • Variablat për modalitetin e ekzekutimit janë inicializuar RUNindex=0 dhe J = (0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 5 , 5, 6, 6, 7, 7, 8, 9,10,11,12,13,14,15) .
  • Dy variabla ndihmëse Nn janë inicializuar, Nn=0 për të koduar pikselin e shpërthimit.

Le të prezantojmë disa funksione dhe variabla që do të përdoren më vonë:

Funksioni GetNextSample(): Merr informacion për pikselin tjetër të imazhit burimor dhe vendos vlerat përkatëse të variablave x, a, b, c, d, Ix, Ra, Rb, Rc, Rd. Nëse leximi i pikselit është në fund të rreshtit, atëherë GetNextSample() vendos EOLine = 1. Në të gjitha rastet e tjera, EOLline = 0. Vlerat Ra, Rb, Rc, Rd trashëgojnë vlerat e tyre nga vlera e llogaritur më parë Rx. Ndryshorja EOLine Global: e vendosur nga funksioni GetNextSample(): e barabartë me 1 nëse piksel aktual është i fundit në rresht, i barabartë me 0 ndryshe. Funksioni AppendToBitStream(a,b): Shton një numër jonegativ në formë binare në rrjedhën e koduar të biteve duke përdorur bit b. Së pari shtohen pjesët më të rëndësishme. Funksioni Quantize(a): Përdoret për të kuantizuar gabimin e parashikimit në modalitetin "pothuajse pa humbje". Funksioni ComputeRx(): Rikthen vlerën e rindërtuar Rx për pikselin aktual (përdor "gabimin e parashikimit" të kuantizuar).

Nga imazhi i mësipërm (Fig. 23) është e qartë se pikselët a, b, c dhe d luajnë një rol të rëndësishëm në kodimin e pikselit x. Le të përpiqemi të kuptojmë se çfarë ndodh kur mungojnë këto piksele. Pra, kur kodoni vijën e sipërme, pikselët e kontekstit c, b dhe d mungojnë, kështu që vlerat e tyre konsiderohen zero. Nëse piksel aktual është në fillim ose në fund të rreshtit, atëherë pikselët a, c ose d janë të papërcaktuar. Në këtë rast, a dhe d përdorin vlerën e rindërtuar Rb të pikselit b (ose zero për vijën e sipërme), dhe c përdor vlerën e rindërtuar të a kur kodon karakterin e parë të rreshtit të mëparshëm. Kështu, koduesi duhet të bëjë një pjesë të punës së dekoderit duke rindërtuar disa pikselë.

Enkoderi fillon me tre hapat e mëposhtëm:

Pas vendosjes së kontekstit Q, koduesi parashikon pikselin x. Së pari, parashikimi Px llogaritet duke përdorur të ashtuquajturin "parashikues i zbulimit të skajeve":

nëse (Rc > = max(Ra, Rb)) Px = min(Ra, Rb);
tjeter(
nëse (Rc<= min(Ra, Rb))
Px= max(Ra, Rb);
tjetër
Px = Ra + Rb - Rc;
}

Le të shpjegojmë thelbin e "rregullit të skajit". Për ta bërë këtë, merrni parasysh rastin b< а. При этом условии «правило края» выбирает b в качестве прогноза х во многих случаях, когда вертикальный край изображения находится непосредственно слева от х. Аналогично, пиксель а выбирается в качестве прогноза х во многих случаях, когда горизонтальный край находится непосредственно над х. Если край не обнаруживается, то «правило края» вычисляет прогноз в виде а + b - с, что имеет простую геометрическую интерпретацию. Если каждый пиксель является точкой трехмерного пространства, то прогноз а + b - с помещает Рх на ту же плоскость, что и точки а, b и с.

Hapi tjetër është korrigjimi i parashikimit nga paragjykimi duke përdorur numrin SIGN (në varësi të tre numrave të zonave Qi), vlerat e korrigjimit C(Q) (që rrjedhin nga paragjykimet sistematike dhe nuk diskutohen këtu) dhe parametrin MAXVAL.

nëse (SHENJA == +1)
Px = Px + C(Q);
tjetër
Px = Px - C(Q);

Nëse (Px > MAXVAL)
Px = MAXVAL;
ndryshe nëse (px< 0)
Px = 0;

Pasi të gjendet parashikimi Px, koduesi llogarit gabimin e parashikimit Errval si diferencë x - Px, por ndryshon shenjën nëse vlera SIGN është negative.

Në një mënyrë pothuajse pa humbje, gabimi kuantizohet dhe koduesi përdor këtë vlerë të rindërtuar Rx të pikselit x në të njëjtën mënyrë si një dekoder. Hapi themelor i kuantizimit është si më poshtë:

nëse (Errval > 0)
Errval = (Errval + AFËR) / (2 * AFËR + 1);
tjetër
Errval = - (Errval - AFËR) / (2 * AFËR + 1);

Kjo përdor parametrin NEAR, por ka disa detaje që nuk shfaqen këtu. Hapi kryesor i rindërtimit është gjetja e Rx = Px + SIGN * Errval * (2 * AFËR + 1) .

Gabimi i parashikimit (pas kuantizimit të mundshëm) pëson një reduktim të modulit. (Pas kësaj, është gati për hapin kryesor të kodimit).

nëse (Errval< 0)
Errval = Errval + RANGE;
nëse (Errval >= ((VARGA + 1) / 2))
Errval = Errval - GAME;

Kodet Golomb (parametri kryesor u shënua me b). Në JPEG-LS ky parametër emërtohet m. Nëse numri m është zgjedhur tashmë, atëherë kodi Golomb i një numri të plotë jo negativ n përbëhet nga dy pjesë: kodi unar i pjesës së plotë të numrit n/m dhe paraqitje binare n mod m. Ky kod është ideal për numrat e plotë që kanë një shpërndarje gjeometrike (d.m.th., kur probabiliteti i numrit n është (1 - r) * r n , 0< r < 1) . Для каждого геометрического распределения найдется такое число m, что код Голомба, построенный по m, имеет наименьшую возможную среднюю длину. Rasti më i thjeshtë, kur m është një fuqi prej 2 (m = 2 k), çon në operacione të thjeshta kodimi/dekodimi. Kodi i numrit n në këtë rast përbëhet nga k shifrat e rendit të ulët të numrit n, të paraprirë nga kodi unar i numrit të përbërë nga shifrat e mbetura të rendit të lartë të numrit n. Ky kod i veçantë Golomb shënohet me G(k) .

Për shembull, le të llogarisim kodin G(2) të numrit n = 19 = 10011 2 . Meqenëse k = 2, atëherë m = 4. Le të fillojmë me dy shifrat më pak të rëndësishme, 11 2, të numrit n. Ato janë të barabarta me 3, që është e njëjtë me n mod m (3 = 19 mod 4). Shifrat e mbetura më domethënëse, 100 2, do të japin numrin 4, i cili është i barabartë me pjesën e plotë n/m (19/4 = 4,75). Kodi unar i 4 është 00001, kështu që kodi G(2) i n = 19 është 00001|11.

Në praktikë, ekziston gjithmonë një numër i kufizuar i numrave të plotë jo negativë. Le të shënojmë numrin më të madh me I. Gjatësia më e madhe e G(0) është I + 1, dhe meqë unë mund të jem i madh, është e dëshirueshme të kufizohet madhësia e kodit Golomb. Kjo bëhet duke përdorur një kod të veçantë Golomb LG(k, glim) që varet nga dy parametra k dhe glim. Së pari, duhet të formoni numrin q nga shifrat më domethënëse të numrit n. Nëse q< glimit- - 1 , то код LG(k, glimit) совпадает с кодом LG(k]. В противном случае, приготавливается унарный код числа glimit - ceil(log I) - 1 (то есть, glimit - ceil(log I) - 1 нулей, за которыми стоит единственная 1). Это действует как код esc, после которого стоит двоичный код n - 1 из ceil(log I) бит.

Gabimet e parashikimit nuk janë domosdoshmërisht numra pozitivë. Ato janë të barabarta me disa dallime, të cilat mund të jenë zero ose negative. Sidoqoftë, kodet Golomb u ndërtuan për numra pozitiv. Prandaj, përpara kodimit, vlerat e gabimit negativ duhet të pasqyrohen në një grup numrash jo negativë. Për ta bërë këtë, përdorni hartën e mëposhtme:
MErrval =
2 * Errval nëse Errval >= 0,
2 * |Errval| nëse Errval< 0.

Ky ekran alternon vlerat negative dhe pozitive në sekuencën 0, -1, +1, -2, +2, -3,... .

Tabela më poshtë rendit disa nga gabimet e parashikimit, vlerat e shfaqura dhe kodet e tyre LG(2, 32), duke supozuar se alfabeti është madhësia 256 (d.m.th., I = 255 dhe tavani (log I) = 8).

Tabela: gabimet e parashikimit, ekranet dhe kodet LG (2, 32)

Gabim parashikimi Vlera e shfaqur Kodi
0 0 1 00
-1 1 1 01
1 2 1 10
-2 3 1 11
2 4 01 00
-3 5 01 01
3 6 01 10
-4 7 01 11
4 8 001 00
-5 9 001 01
5 10 001 10
-6 11 001 11
6 12 0001 00
...
50 100 000000000000
000000000001
01100011

Tani duhet të diskutojmë zgjedhjen e parametrit k për kodet Golomb. Kjo bëhet në mënyrë adaptive. Parametri k varet nga konteksti dhe vlera e tij përditësohet sa herë që gjendet një piksel me atë kontekst. Llogaritja e k mund të shprehet në një vijë të thjeshtë:
për (k=0; (N[Q]<ku A dhe N janë vargje indeksesh nga 0 në 364. Kjo formulë përdor kontekstin Q si indeks të dy vargjeve. Në fillim, k inicializohet në zero dhe më pas ekzekutohet cikli. Në çdo përsëritje të ciklit, një element i grupit N[Q] zhvendoset majtas me k bit dhe krahasohet me A[Q]. Nëse vlera e zhvendosur N[Q] është më e madhe ose e barabartë me A[Q], atëherë zgjidhet vlera aktuale k. Përndryshe, k rritet me 1 dhe testi përsëritet.

Pas gjetjes së numrit k, gabimi i parashikimit Errval konvertohet në numrin MErrval, i cili kodohet duke përdorur kodin LG(k, LIMIT). Numri LIMIT është një parametër. Përditësimi i grupeve A dhe N (së bashku me grupin ndihmës B) ilustrohet nga fragmenti i kodit të mëposhtëm (parametri RESET vendoset nga aplikacioni):

B[Q] = B[Q] + Errval * (2 * AFËR + 1);
A[Q] = A[Q] + abs(Errval);
nëse (N[Q] == RISET) (
A[Q] = A[Q]>>1;
B[Q] = B[Q]>> 1;
N[Q] = N[Q]>>1;
}
N[Q] = N[Q] + 1;

Tani le të flasim për llogaritjen e devijimit sistematik të parashikimit. Vlera e korrigjimit të parashikimit C[Q] duhet të përditësohet në fund të kodimit të pikselit x. Kjo kërkon dy variabla - B[Q] dhe N[Q]. N[Q] është numri i dukurive të kontekstit Q që nga fillimi. B[Q] është një devijim sistematik që lejon që vlera e C[Q] të përditësohet më së shumti një herë për përsëritje. Pra, vlera parashikuese C[Q] llogaritet sipas kodit të mëposhtëm:

nëse (B[Q]<= -N[Q]) {
B[Q] = B[Q] + N[Q];
nëse (C[Q] > MIN_C)
C[Q] = C[Q] - 1;
nëse (B[Q]<= -N[Q])
B[Q] = -N[Q] + 1;
}
ndryshe nëse (B[Q] > 0) (
B[Q] = B[Q] - N[Q];
nëse (C[Q]< MAX_C)
C[Q] = C[Q] + 1;
nëse (B[Q] > 0)
B[Q] = 0;
}

Konstantat MIN_C dhe MAX_C janë minimumi dhe maksimumi kuptimi i mundshëm grupi i indeksit C, i barabartë me -128 dhe 127, respektivisht.

Kodimi në modalitetin serik bëhet ndryshe. Kujtoni që koduesi zgjedh këtë modalitet kur zbulon pikselë të njëpasnjëshëm x vlerat e të cilëve Ix përputhen dhe janë të barabarta me vlerën e rindërtuar Ra të pikselit të kontekstit a. Për opsionin "pothuajse pa humbje", pikselët në seri duhet të kenë vlera Ix që plotësojnë pabarazinë |Ix - Ra|<= NEAR . Серия не должна выходить за пределы текущей строки. Длина серии кодируется (сам пиксель кодировать не нужно, поскольку он равен Ra), и если конец серии находится раньше конца строки, то после ее закодированной длины будет сразу записан код следующего пикселя (который прерывает серию). Две основные задачи кодера в этой моде состоят

  1. në gjurmimin e një serie dhe kodimin e gjatësisë së saj;
  2. në kodimin e pikselit që ndërpreu serinë.

Seriali mund të ndiqet si më poshtë:

RUNval = Ra;
RUNcnt = 0;
ndërsa (abs (Ix - RUNval)<= NEAR) {
RUNcnt = RUNcnt + 1;
Rx = RUNval;
nëse (EOLline == 1)
pushim;
tjetër
GetNextSample();
}

Le të shpjegojmë disa nga vlerat e prezantuara: RUNcnt është numërimi i pikselëve përsëritës (për modalitetin serial), dhe RUNval është vlera aktuale e pikselit përsëritës të rindërtuar.

Le të përshkruajmë procesin e kodimit të serive. Fragmenti i parë i kodit përshkruan kodimin për segmentet e ekzekutimit me gjatësi rm:

ndërsa (RUNcnt >= (1<AppendToBitStream(1, 1);
RUNcnt = RUNcnt - (1<nëse (RUNindex< 31))
RUNindex = RUNindex + 1;
}

Kodi i mëposhtëm ilustron kodimin për segmentet e ekzekutimit me gjatësi më të vogël se rm:

nëse (EOLline == 0) (
AppendToBitStream(0, 1);
AppendToBitStream (RUNcnt, J);
nëse (RUNindex > 0)) (
RUNindex = RUNindex - 1;
}
ndryshe nëse (RUNcnt > 0)
AppendToBitStream(1, 1);

Këtu koduesi përdor tabelën J, e cila përbëhet nga 32 hyrje, të shënuara me rk. J inicializohet me vlera
0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 9, 10, 11, 12, 13, 14, 15 .

Për çdo vlerë të rk shënojmë rm = 2 rk. Numrat rm (gjithsej janë 32) quhen renditja e kodit. 4 vlerat e para rk kanë rm = 2 0 = 1. Për katërfishin e dytë rm = 2 1 = 2, dhe për katërfishin tjetër rm = 2 2 = 4. Për numrin e fundit rm = 2 15 = 32768. encoder kryen procedurën e përshkruar për gjetjen e gjatësisë së ekzekutimit, e cila ruhet në variablin RUNlen. Kjo variabël më pas kodohet duke e ndarë atë në terma vlerat e të cilave janë të barabarta me numrat e njëpasnjëshëm rm. Për shembull, nëse RUNlen=6, atëherë ai përfaqësohet si 6 = 1 + 1 + 1 + 1 + 2 duke përdorur pesë numrat e parë rm. Është koduar duke përdorur 5 bit. Regjistrimi kryhet duke përdorur instruksionin AppendToBitStream(l,l). Sa herë që shkruhet një 1, vlera përkatëse rm zbritet nga RUNlen. Nëse RUNlen ishte e barabartë me 6 në fillim, atëherë zvogëlohet me radhë në 5, 4, 3, 2 dhe 0.

Mund të ndodhë që gjatësia e serisë RUNlen të mos jetë e barabartë me shumën e plotë të numrave rm. Për shembull, RUNlen = 7. Në këtë rast, pesë bit 1 shkruhen si kod, pasuar nga një bit prefiks dhe pjesa e mbetur e RUNlen (në shembullin tonë është 1), i cili shkruhet në skedar si një numër bitash rk (vlera aktuale e rk në shembullin tonë është 2). Ky operacion i fundit kryhet duke thirrur procedurën AppendToBitStream(RUNcnt, J). Biti i prefiksit është 0 nëse seria ndërpritet nga një piksel tjetër në linjë. Nëse seria shkon në fund të rreshtit, atëherë biti i prefiksit është 1.

Detyra e dytë kryesore e koduesit, që është kodimi i pikselit të shpërthimit, bëhet në mënyrë të ngjashme me kodimin e pikselit aktual. Le të diskutojmë detajet e zbatimit të tij.

Konsideroni një situatë ku përparimi i kodimit ndërpritet nga fundi i një vargu pikselësh: si do të kodohet pikeli i ri që shkakton ndërprerjen? Kjo çështje zgjidhet duke koduar diferencën midis vlerës së Ix në pozicionin aktual x dhe vlerës së rindërtuar të pikselëve a ose b (kujtoni se këto janë pikselë fqinjë në lidhje me x - shih Fig. 23). Në këtë rast konsiderohen dy situata të ndryshme: së pari, kur abs(Ra - Rb)<= NEAR , вторая - в противном случае. По сути кодирование пикселя прерывания серии происходит теми же методами, что и кодирование нового пикселя в регулярной моде с тем лишь дополнением, что Ix должно отличаться от Ra на величину большую NEAR, иначе ход кодирования будет продолжен. Опишем операции, которые должны быть выполнены:

nëse (abs (Ra - Rb)<= NEAR)
Lloji RI = 1;
tjetër
Lloji RI = 0;
nëse (RIlloj == 1)
Px = Ra;
tjetër
Px = Rb;
Errval = Ix - Rb;

Pjesa e kodit e mësipërme përcakton indeksin RItype dhe gabimin e parashikimit për pikselin x. Pastaj, nëse është e nevojshme, ndryshoni shenjën e Errval, dhe për opsionin "pothuajse pa humbje", kuantizoni edhe gabimin e parashikimit:

nëse ((RIlloj == 0) && (Ra > Rb)) (
Errval = -Errval;
SHENJA = -1;
tjetër
SHENJA = 1;
nëse (Afër > 0) (
Errval = Kuantizoj(Errval);
Rx = KompjuterRx();
}
tjetër
Rx = Ix;
Errval = ModRange(Errval, RANGE);

Tani le të llogarisim variablin ndihmës TEMP, i cili do të përdoret për të llogaritur parametrin k në kodet Golomb.

nëse (RIlloj == 0)
TEMP = A;
tjetër
TEMP = A + (N>>1);

Le të vendosim Q = RItype + 365. Ne do të llogarisim parametrin k për kodet Golomb si më poshtë: për (k=0; (N[Q]<

nëse (Errval< 0) {
Nn[Q] = Nn[Q] + 1;
A[Q] = A[Q] + ((EMERrval + 1 -RIlloj)>>1);
nëse (N[Q] == RISET) (
A[Q] = A[Q]>>1;
N[Q] = N[Q]>>1;
Nn[Q] = Nn[Q]>>1;
}
N[Q] = N[Q] + 1;

Kjo përfundon përshkrimin e koduesit JPEG-LS. Vini re se sigurisht që është i paplotë, por ne nuk i kemi vendosur vetes synimin për të kopjuar standardin e kësaj metode. Të gjitha detajet e anashkaluara mund të gjenden në standard. Tani le të kalojmë në një përshkrim të shkurtër të parimeve të funksionimit të dekoderit.

3.3. Dekoder

Siç u përmend më herët, metoda JPEG-LS është pothuajse simetrike, kështu që ne nuk do të kopjojmë përshkrimin e koduesit me ndryshime të vogla - ky informacion mund të lexohet në standard. Le të ndalemi vetëm në mënyrën se si ndodh dekodimi në modalitetin serik. Pasi të jenë llogaritur të gjitha vlerat për pikselin aktual, lexoni copë e re R nga rrjedha e biteve. Nëse është e barabartë me 1, atëherë:

  1. Imazhi plotësohet me 2 J|RUNindex| piksele me vlerë Ra.
  2. Nëse në hapin e mëparshëm imazhi ishte plotësuar tashmë me 2 J|RUNindex| piksele dhe RUNindex< 31, то RUNindex увеличивается на 1. Если последний пиксель в строке ещё не декодирован, то мы снова считываем биты, в противном случае переходим к вычислению всех требуемых величин.

Nëse biti është 0, atëherë:

  1. Lexon J|RUNindex| bit nga rrjedha e biteve dhe konvertohet në një numër, dhe imazhi plotësohet me pikselë me vlera Ra në një sasi që korrespondon me numrin e llogaritur.
  2. Nëse RUNindex > 0, atëherë RUNindex zvogëlohet me 1.
  3. Pikseli i ndërprerjes së serisë deshifrohet dhe llogaritja e të gjitha sasive të nevojshme fillon përsëri.

3.4. Formati i skedarit

Skedar i kompresuar përbëhet nga:

  • nga segmentet e të dhënave që përmbajnë kode Golomb dhe gjatësi të ekzekutimit;
  • nga segmentet e shënuesve (informacionet e nevojshme për dekoderin);
  • nga segmenti i shënuesve "pushimi" (disa shënues të rezervuar JPEG).

Këtu ne e quajmë një shënues një bajt të tyre, i ndjekur nga një kod i veçantë që sinjalizon fillimin e një segmenti të ri. Nëse një shenjë pasohet nga një bajt, biti më i rëndësishëm i të cilit është 1, atëherë ai bajt është fillimi i segmentit të tokenit. Përndryshe, segmenti i të dhënave fillon.

3.5. Kodet e Golombit

Ne kemi përmendur tashmë kodet Golomb më shumë se një herë. Çfarë është ajo? Kodi Golomb i një numri të plotë jo negativ "mund të jetë një kod efikas Huffman". Varet nga zgjedhja e disa parametrave b. Parimi i kodimit është si më poshtë:

  • llogariten dy sasi
    q = dysheme((n - 1) / b) dhe
    r = n - qb - 1 ;
  • kodi është i ndërtuar në dy pjesë: pjesa e parë është q në kodin unar, pjesa e dytë është një shprehje binare për r, e përbërë nga bit dysheme (log 2 b) për mbetjet e vogla dhe tavan (log 2 b) për ato të mëdha .

Ne nuk japim një justifikim matematikor për përdorimin e kodeve Golomb në JPEG-LS, vërejmë vetëm se nëse rrjedha e të dhënave hyrëse përbëhet nga numra të plotë, dhe probabiliteti i numrit n është i barabartë me P(n) = (1 - p ) n - 1 p (0<= p <= 1) , то коды Голомба будут оптимальными кодами для этого потока данных, если выбрать параметр b следующим образом:
(1 - p) b + (1 - p) b + 1<= 1 <= (1 - p) b - 1 + (1 - p) b .

3.6. konkluzioni

Formati JPEG-LS u zhvillua kryesisht për ruajtjen e imazheve për qëllime mjekësore, domethënë për ato raste kur është e rëndësishme të keni një imazh të madh pa humbjen më të vogël të cilësisë. Siç u përmend tashmë, formati LOCO-I, i zhvilluar brenda mureve të HP Labs, u mor si bazë. Më pas u zhvillua më tej përmes përpjekjeve të përbashkëta të HP dhe Mitsubishi. Të dyja kompanitë lejuan që patentat e tyre në këtë format të përdoren pa paguar licencë, kështu që JPEG-LS mund të gjendet edhe në programet e rregullta të PC.

Më lejoni të shpjegoj me shembullin tim. Ndoshta ju mund të më ndihmoni të kuptoj disa gjëra. Detyra e vendosur para meje nga unë është e mëposhtme. Transferoni një kornizë (me komandë) nga kamera WEB në kujtesën e një celulari me transferim të mëvonshëm në një celular tjetër. Nga artikulli juaj nuk është e qartë se në çfarë formati duhet të bazohet, disponueshmëria e algoritmit. Tjetra - transformimi i kosinusit - vetëm një interpretim sipërfaqësor, dhe ku mund të shikoj një algoritëm të detajuar me një shembull specifik (të themi, të studiojmë analizën matematikore, por edhe atje pothuajse nuk ka shembuj specifikë, dhe nëse ka, atëherë seksione të tëra të Llogaritjet mungojnë, prandaj referojuni Struktura e organizimit të skedarëve dhe lidhjet nuk u treguan as "Në matricën që rezulton, përbërësit me frekuencë të ulët janë të vendosura më afër këndit të sipërm të majtë , dhe ato me frekuencë më të lartë zhvendosen djathtas”, më duket se kështu bëhet, por nuk funksionon (ndoshta e kam gabim!).

Pyetje: si të kapni, për shembull, vetëm informacionin e nevojshëm nga një kornizë JPG për dekodim të mëtejshëm në rezolucionin e ekranit të telefonit, pa përdorur një PC, duke përdorur një MK. Një version bardh e zi i kornizës është i mjaftueshëm. Cilit FFxx duhet t'i kushtoni vëmendje dhe të regjistroni vetëm atë informacion. Ku mund ta marr strukturën e kornizës së kamerës WEB? E kuptoj që çështja është komplekse dhe e shumëanshme. Për shembull, në MK është e pamundur të deshifrosh kornizën dhe më pas ta ngjeshësh me rezolucionin e kërkuar, por ndoshta është e mundur të pritet të paktën këndi i sipërm me formatin e kërkuar.

Do të isha mirënjohës për informacionin.

Çfarë mund të bëj = program në VB, MK. Zhvillimi i pavarur operativ interaktiv i kontrollit nëpërmjet telefonit celular me disa rele, kontroll audio duke përdorur një celular.

>> Hapi i dytë është të aplikoni drejtpërdrejt algoritmin e kodimit të përsëritur >> (LZW)

ndoshta RLE?

Sigurisht, në këtë hap JPEG (shih kontekstin) është RLE. Faleminderit për identifikimin e gabimit.

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