Ինչպես է աշխատում JPEG ձևաչափը

JPEG պատկերներն ամենուր տարածված են մեր թվային կյանքում, սակայն այս երևակայության հետևում ալգորիթմներ կան, որոնք հեռացնում են մարդու աչքին աննկատելի մանրամասները: Արդյունքն ամենաբարձր տեսողական որակն է ամենափոքր ֆայլի չափով, բայց ինչպե՞ս է այդ ամենը աշխատում: Եկեք տեսնենք, թե կոնկրետ ինչ չեն տեսնում մեր աչքերը:

Ինչպես է աշխատում JPEG ձևաչափը

Հեշտ է ընդունել ընկերոջը լուսանկար ուղարկելու հնարավորությունը և չանհանգստանալ, թե ինչ սարք, բրաուզեր կամ օպերացիոն համակարգ են նրանք օգտագործում, բայց դա միշտ չէ, որ այդպես է եղել: 1980-ականների սկզբին համակարգիչները կարող էին պահել և ցուցադրել թվային պատկերներ, սակայն կային բազմաթիվ մրցակցային գաղափարներ դա անելու լավագույն միջոցի վերաբերյալ: Դուք չեք կարող պարզապես պատկեր ուղարկել մի համակարգչից մյուսին և հուսալ, որ այն կաշխատի:

Այս խնդիրը լուծելու համար 1986 թվականին ամբողջ աշխարհից փորձագետների հանձնաժողով է հավաքվել, որը կոչվում է «Լուսանկարչության փորձագետների միացյալ խումբ» (Joint Photographic Experts Group, JPEG), որը հիմնադրվել է Ստանդարտացման միջազգային կազմակերպության (ISO) և Միջազգային էլեկտրատեխնիկական հանձնաժողովի (IEC) միջև՝ երկու միջազգային ստանդարտների կազմակերպությունների, որոնց կենտրոնակայանը գտնվում է Ժնևում, Շվեյցարիա:

JPEG կոչվող մարդկանց խումբը ստեղծեց JPEG թվային պատկերի սեղմման ստանդարտը 1992 թվականին։ Ցանկացած ոք, ով օգտվել է ինտերնետից, հավանաբար հանդիպել է JPEG կոդավորված պատկերների: Սա պատկերների կոդավորման, ուղարկելու և պահելու ամենատարածված եղանակն է: Վեբ էջերից մինչև էլեկտրոնային փոստ և սոցիալական մեդիա JPEG-ն օգտագործվում է օրական միլիարդավոր անգամներ՝ գրեթե ամեն անգամ, երբ մենք առցանց պատկեր ենք դիտում կամ ուղարկում: Առանց JPEG-ի, համացանցը կլիներ ավելի քիչ գունեղ, ավելի դանդաղ և հավանաբար կունենար ավելի քիչ կատուների նկարներ:

Այս հոդվածը վերաբերում է, թե ինչպես վերծանել JPEG պատկերը: Այլ կերպ ասած, ինչ է պահանջվում համակարգչում պահվող սեղմված տվյալները էկրանին հայտնվող պատկերի վերածելու համար։ Սա արժե իմանալ ոչ միայն այն պատճառով, որ կարևոր է հասկանալ այն տեխնոլոգիան, որը մենք օգտագործում ենք ամեն օր, այլ նաև այն պատճառով, որ սեղմման մակարդակները բացելով՝ մենք ավելին ենք սովորում ընկալման և տեսողության մասին, և թե ինչ մանրամասների նկատմամբ են մեր աչքերը առավել զգայուն:

Բացի այդ, այս կերպ պատկերների հետ խաղալը շատ հետաքրքիր է։

Ինչպես է աշխատում JPEG ձևաչափը

Նայելով JPEG-ի ներսում

Համակարգչում ամեն ինչ պահվում է որպես երկուական թվերի հաջորդականություն: Սովորաբար այս բիթերը՝ զրոները և միավորները, խմբավորված են ութ հոգանոց խմբերում՝ բայթեր կազմելու համար: Երբ դուք բացում եք JPEG պատկերը համակարգչում, ինչ-որ բան (զննարկիչ, օպերացիոն համակարգ, այլ բան) պետք է վերծանի բայթերը՝ վերականգնելով սկզբնական պատկերը որպես գույների ցանկ, որոնք կարող են ցուցադրվել:

Եթե ​​ներբեռնեք այս քաղցրավենիք կատվի լուսանկար և բացեք այն տեքստային խմբագրիչում, կտեսնեք անհամապատասխան նիշերի փունջ:

Ինչպես է աշխատում JPEG ձևաչափը
Այստեղ ես օգտագործում եմ Notepad++ ֆայլի բովանդակությունը ուսումնասիրելու համար, քանի որ Windows-ի Notepad-ի նման սովորական տեքստային խմբագրիչները պահպանելուց հետո կփչացնեն երկուական ֆայլը և այն այլևս չի բավարարի JPEG ձևաչափը:

Բառի պրոցեսորում պատկեր բացելը շփոթեցնում է համակարգիչը, ճիշտ այնպես, ինչպես դուք շփոթում եք ձեր ուղեղը, երբ շփում եք ձեր աչքերը և սկսում տեսնել գունավոր բծեր:

Այս բծերը, որոնք դուք տեսնում եք, հայտնի են որպես ֆոսֆեններ, և չեն հանդիսանում մտքի կողմից առաջացած լույսի խթանման կամ հալյուցինացիայի արդյունք: Դրանք առաջանում են այն պատճառով, որ ձեր ուղեղը կարծում է, որ օպտիկական նյարդերի ցանկացած էլեկտրական ազդանշան փոխանցում է լույսի մասին տեղեկատվություն: Ուղեղը պետք է անի այս ենթադրությունները, քանի որ ոչ մի միջոց չկա իմանալու՝ ազդանշանը ձայն է, տեսլական, թե այլ բան: Մարմնի բոլոր նյարդերը փոխանցում են ճիշտ նույն էլեկտրական իմպուլսները: Ձեր աչքերի վրա ճնշում գործադրելով՝ դուք ազդանշաններ եք ուղարկում, որոնք տեսողական չեն, բայց ակտիվացնում են աչքի ընկալիչները, որոնք ձեր ուղեղը մեկնաբանում է, այս դեպքում, սխալ՝ որպես տեսողական բան: Դուք կարող եք բառացիորեն տեսնել ճնշումը:

Ծիծաղելի է մտածել այն մասին, թե որքանով են համակարգիչները նման ուղեղին, բայց դա նաև օգտակար անալոգիա է՝ ցույց տալու համար, թե որքանով է տվյալների մեկնաբանումը կախված այն բանից, թե որքանով են դրանք մեկնաբանվում՝ անկախ նրանից՝ նյարդերի միջոցով փոխանցվող կամ համակարգչում պահվող տվյալների նշանակությունը: Բոլոր երկուական տվյալները կազմված են XNUMX-ներից և XNUMX-երից՝ հիմնական բաղադրիչները, որոնք կարող են ցանկացած տեսակի տեղեկատվություն փոխանցել: Ձեր համակարգիչը հաճախ պարզում է, թե ինչպես դրանք մեկնաբանել՝ օգտագործելով այնպիսի հուշումներ, ինչպիսիք են ֆայլերի ընդլայնումները: Այժմ մենք նրան ստիպում ենք մեկնաբանել դրանք որպես տեքստ, քանի որ հենց դա է ակնկալում տեքստային խմբագրիչը։

Հասկանալու համար, թե ինչպես կարելի է վերծանել JPEG-ը, մենք պետք է տեսնենք բնօրինակ ազդանշանները՝ երկուական տվյալները: Դա կարելի է անել վեցանկյուն խմբագրիչի միջոցով կամ ուղղակիորեն հոդվածի բնօրինակ վեբ էջ! Կա պատկեր, որի կողքին տեքստային դաշտում նրա բոլոր բայթերն են (բացի վերնագրից)՝ ներկայացված տասնորդական տեսքով։ Դուք կարող եք փոխել դրանք, և սցենարը նորից կոդավորվի և կստեղծի նոր պատկեր անմիջապես:

Ինչպես է աշխատում JPEG ձևաչափը

Դուք կարող եք շատ բան սովորել՝ պարզապես խաղալով այս խմբագրի հետ: Օրինակ, կարո՞ղ եք ասել, թե ինչ հերթականությամբ են պահվում պիքսելները:

Այս օրինակի տարօրինակն այն է, որ որոշ թվեր փոխելը բնավ չի ազդում պատկերի վրա, բայց, օրինակ, եթե առաջին տողում 17 թիվը փոխարինեք 0-ով, լուսանկարն ամբողջությամբ կփչանա։

Ինչպես է աշխատում JPEG ձևաչափը

Այլ փոփոխություններ, ինչպիսիք են 7-ի 1988-ի փոխարինումը 254 թվով, փոխում է գույնը, բայց միայն հետագա պիքսելների:

Ինչպես է աշխատում JPEG ձևաչափը

Ամենատարօրինակն այն է, որ որոշ թվեր փոխում են ոչ միայն գույնը, այլև պատկերի ձևը։ Փոխեք 70-ը 12-րդ տողում 2-ին և նայեք պատկերի վերին շարքին՝ տեսնելու, թե ինչ նկատի ունեմ:

Ինչպես է աշխատում JPEG ձևաչափը

Եվ անկախ նրանից, թե ինչ JPEG պատկեր եք օգտագործում, դուք միշտ կգտնեք այս առեղծվածային շախմատային նախշերը բայթերը խմբագրելիս:

Խմբագրի հետ խաղալիս դժվար է հասկանալ, թե ինչպես է լուսանկարը վերստեղծվում այս բայթերից, քանի որ JPEG սեղմումը բաղկացած է երեք տարբեր տեխնոլոգիաներից, որոնք հաջորդաբար կիրառվում են մակարդակներում: Մենք կուսումնասիրենք յուրաքանչյուրը առանձին՝ բացահայտելու առեղծվածային վարքագիծը, որը մենք տեսնում ենք:

JPEG սեղմման երեք մակարդակ.

  1. Գունավոր ենթանմուշառում.
  2. Դիսկրետ կոսինուսի փոխակերպում և նմուշառում.
  3. Գործարկման երկարության կոդավորումը, դելտա и Հաֆման

Սեղմման մեծության մասին պատկերացում տալու համար նշեք, որ վերևի պատկերը ներկայացնում է 79 թվեր կամ մոտ 819 ԿԲ: Եթե ​​մենք այն պահեինք առանց սեղմման, ապա յուրաքանչյուր պիքսել կպահանջեր երեք թիվ՝ կարմիր, կանաչ և կապույտ բաղադրիչների համար: Սա կկազմի 79 թիվ կամ մոտ. 917 ԿԲ: JPEG սեղմման արդյունքում վերջնական ֆայլը կրճատվել է ավելի քան 700 անգամ:

Փաստորեն, այս պատկերը կարող է շատ ավելի սեղմվել: Ստորև բերված են երկու պատկեր կողք կողքի. աջ կողմում գտնվող լուսանկարը սեղմվել է մինչև 16 ԿԲ, այսինքն՝ 57 անգամ փոքր, քան չսեղմված տարբերակը:

Ինչպես է աշխատում JPEG ձևաչափը

Եթե ​​ուշադիր նայեք, կտեսնեք, որ այս պատկերները նույնական չեն։ Երկուսն էլ JPEG սեղմումով պատկերներ են, բայց ճիշտը ծավալով շատ ավելի փոքր է։ Այն նաև մի փոքր ավելի վատ տեսք ունի (նայեք ֆոնի գույնի քառակուսիներին): Ահա թե ինչու JPEG-ը կոչվում է նաև կորուստներով սեղմում; Սեղմման գործընթացում պատկերը փոխվում է և կորցնում որոշ մանրամասներ։

1. Գունավոր ենթանմուշառում

Ահա մի պատկեր, որտեղ կիրառվում է սեղմման միայն առաջին մակարդակը:

Ինչպես է աշխատում JPEG ձևաչափը
(Ինտերակտիվ տարբերակ - մուտք օրիգինալ հոդվածներ): Մեկ համարի հեռացումը ոչնչացնում է բոլոր գույները: Այնուամենայնիվ, եթե ճիշտ վեց թվեր հեռացվեն, դա գործնականում ոչ մի ազդեցություն չի թողնում պատկերի վրա:

Այժմ թվերը մի փոքր ավելի հեշտ է վերծանել։ Սա գույների գրեթե պարզ ցուցակ է, որում յուրաքանչյուր բայտը փոխում է ուղիղ մեկ պիքսել, բայց միևնույն ժամանակ այն արդեն կիսով չափ չսեղմված պատկերի չափն է (որը կզբաղեցնի մոտ 300 ԿԲ այս փոքրացված չափով): Կարո՞ղ եք գուշակել, թե ինչու։

Դուք կարող եք տեսնել, որ այս թվերը չեն ներկայացնում ստանդարտ կարմիր, կանաչ և կապույտ բաղադրիչները, քանի որ եթե բոլոր թվերը փոխարինենք զրոներով, ապա կստանանք կանաչ պատկեր (ոչ թե սպիտակ):

Ինչպես է աշխատում JPEG ձևաչափը

Դա պայմանավորված է նրանով, որ այս բայթերը նշանակում են Y (պայծառություն),

Ինչպես է աշխատում JPEG ձևաչափը

Cb (հարաբերական կապույտ),

Ինչպես է աշխատում JPEG ձևաչափը

և Cr (հարաբերական կարմրություն) նկարներ:

Ինչպես է աշխատում JPEG ձևաչափը

Ինչու չօգտագործել RGB: Ի վերջո, այսպես են աշխատում ժամանակակից էկրանների մեծ մասը։ Ձեր մոնիտորը կարող է ցուցադրել ցանկացած գույն, ներառյալ կարմիր, կանաչ և կապույտ, տարբեր ինտենսիվությամբ յուրաքանչյուր պիքսելի համար: Սպիտակը ձեռք է բերվում երեքն էլ լրիվ պայծառությամբ միացնելով, իսկ սևը՝ անջատելով։

Ինչպես է աշխատում JPEG ձևաչափը

Սա նույնպես շատ նման է այն բանին, թե ինչպես է աշխատում մարդու աչքը: Մեր աչքերի գույնի ընկալիչները կոչվում են «կոններև բաժանվում են երեք տեսակի, որոնցից յուրաքանչյուրն ավելի զգայուն է կամ կարմիր, կանաչ կամ կապույտ գույների նկատմամբ [S-տիպի կոնները զգայուն են մանուշակագույն-կապույտում (S-ն անգլերենի կարճ ալիքի սպեկտրից), M. -տիպ - կանաչ-դեղին (M-ից անգլերեն Medium - միջին ալիք), և L- տիպ - դեղին-կարմիր (L-ից անգլերեն Long - երկար ալիք) սպեկտրի մասերում: Այս երեք տեսակի կոնների առկայությունը (և ձողերը, որոնք զգայուն են սպեկտրի զմրուխտ կանաչ հատվածում) մարդուն տալիս են գունավոր տեսողություն։ / մոտ. թարգմ.]։ Ձողիկներ, մեր աչքերի մեկ այլ տեսակի ֆոտոընկալիչ, ի վիճակի է հայտնաբերել պայծառության փոփոխությունները, բայց շատ ավելի զգայուն է գույնի նկատմամբ: Մեր աչքերն ունեն մոտ 120 միլիոն ձող և ընդամենը 6 միլիոն կոն:

Ահա թե ինչու մեր աչքերը շատ ավելի լավ են հայտնաբերում պայծառության փոփոխությունները, քան գույնի փոփոխությունները: Եթե ​​գույնը առանձնացնեք պայծառությունից, կարող եք մի փոքր գույն հեռացնել, և ոչ ոք ոչինչ չի նկատի: Chroma subsampling-ը պատկերի գունային բաղադրիչները ավելի ցածր լուծաչափով ներկայացնելու գործընթաց է, քան լուսավորության բաղադրիչները: Վերոնշյալ օրինակում յուրաքանչյուր պիքսել ունի ճիշտ մեկ Y բաղադրիչ, և չորս պիքսելներից բաղկացած յուրաքանչյուր առանձին խումբ ունի ուղիղ մեկ Cb և մեկ Cr բաղադրիչ: Հետեւաբար, պատկերը պարունակում է չորս անգամ ավելի քիչ գունային տեղեկատվություն, քան բնօրինակը:

YCbCr գունային տարածությունն օգտագործվում է ոչ միայն JPEG-ում: Այն ի սկզբանե հորինվել է 1938 թվականին հեռուստատեսային հաղորդումների համար։ Ոչ բոլորն ունեն գունավոր հեռուստացույց, ուստի գույնի և պայծառության տարանջատումը թույլ տվեց բոլորին ստանալ նույն ազդանշանը, իսկ առանց գույնի հեռուստացույցները պարզապես օգտագործում էին միայն պայծառության բաղադրիչը:

Այսպիսով, խմբագրիչից մեկ համար հեռացնելը ամբողջովին փչացնում է բոլոր գույները: Բաղադրիչները պահվում են YYYY Cb Cr ձևով (իրականում, պարտադիր չէ, որ այդ հերթականությամբ. պահպանման կարգը նշված է ֆայլի վերնագրում): Առաջին համարի հեռացումը կհանգեցնի նրան, որ Cb-ի առաջին արժեքը կընկալվի որպես Y, Cr-ը որպես Cb, և ընդհանուր առմամբ դուք կունենաք դոմինոյի էֆեկտ, որը փոխում է նկարի բոլոր գույները:

JPEG ճշգրտումը չի ստիպում ձեզ օգտագործել YCbCr: Բայց ֆայլերի մեծամասնությունն այն օգտագործում է, քանի որ այն արտադրում է ավելի լավ իջեցված նմուշներ, քան RGB-ն: Բայց դուք չպետք է ընդունեք իմ խոսքը: Ինքներդ տեսեք ստորև բերված աղյուսակում, թե ինչ տեսք կունենա յուրաքանչյուր առանձին բաղադրիչի ենթամեկուսիչները և՛ RGB-ում, և՛ YCbCr-ում:

Ինչպես է աշխատում JPEG ձևաչափը
(Ինտերակտիվ տարբերակ - մուտք օրիգինալ հոդվածներ):

Կապույտի հեռացումը այնքան էլ նկատելի չէ, որքան կարմիրը կամ կանաչը: Դա պայմանավորված է ձեր աչքերի վեց միլիոն կոնների պատճառով, մոտ 64% -ը զգայուն է կարմիրի, 32% -ը կանաչի և 2% -ը կապույտի նկատմամբ:

Y բաղադրիչի (ներքևի ձախ) նմուշառումը լավագույնս երևում է: Անգամ փոքր փոփոխությունը նկատելի է։

Պատկերը RGB-ից YCbCr-ի վերափոխելը չի ​​նվազեցնում ֆայլի չափը, սակայն այն հեշտացնում է ավելի քիչ տեսանելի մանրամասներ գտնելը, որոնք կարելի է հեռացնել: Կորստի սեղմումը տեղի է ունենում երկրորդ փուլում: Այն հիմնված է տվյալների ավելի սեղմելի ձևով ներկայացնելու գաղափարի վրա։

2. Դիսկրետ կոսինուսային փոխակերպում և նմուշառում

Սեղմման այս մակարդակը, մեծ մասամբ, JPEG-ի մասին է: Գույները YCbCr-ի վերածելուց հետո բաղադրիչները սեղմվում են առանձին, այնպես որ մենք կարող ենք կենտրոնանալ միայն Y բաղադրիչի վրա: Եվ ահա թե ինչպիսի տեսք ունեն Y բաղադրիչի բայթերը այս շերտը կիրառելուց հետո:

Ինչպես է աշխատում JPEG ձևաչափը
(Ինտերակտիվ տարբերակ - մուտք օրիգինալ հոդվածներ): Ինտերակտիվ տարբերակում, պիքսելի վրա սեղմելով, խմբագրիչը պտտվում է այն գծի վրա, որը ներկայացնում է այն: Փորձեք վերջից հեռացնել թվերը կամ որոշակի թվին մի քանի զրո ավելացնել:

Առաջին հայացքից թվում է, թե շատ վատ սեղմում է: Պատկերում կա 100 պիքսել, և դրա պայծառությունը ներկայացնելու համար պահանջվում է 000 թիվ, ինչը ավելի վատ է, քան ընդհանրապես ոչինչ սեղմելը:

Այնուամենայնիվ, նշեք, որ այս թվերի մեծ մասը զրո է: Ավելին, բոլոր այդ զրոները տողերի վերջում կարելի է հեռացնել առանց պատկերը փոխելու։ Մնացել է մոտ 26 համար, և սա գրեթե 000 անգամ պակաս է:

Այս մակարդակը պարունակում է շախմատային նախշերի գաղտնիքը։ Ի տարբերություն մեր տեսած այլ էֆեկտների, այս օրինաչափությունների տեսքը անսարքություն չէ: Դրանք ամբողջ պատկերի կառուցման բլոկներն են: Խմբագրի յուրաքանչյուր տող պարունակում է ուղիղ 64 թվեր, դիսկրետ կոսինուսի փոխակերպման (DCT) գործակիցներ, որոնք համապատասխանում են 64 եզակի օրինաչափությունների ինտենսիվությանը:

Այս օրինաչափությունները ձևավորվում են կոսինուսի սյուժեի հիման վրա: Ահա թե ինչ տեսք ունեն դրանցից մի քանիսը.

Ինչպես է աշխատում JPEG ձևաչափը
8-ից 64-ը

Ստորև ներկայացված է պատկեր, որը ցույց է տալիս բոլոր 64 նախշերը:

Ինչպես է աշխատում JPEG ձևաչափը
(Ինտերակտիվ տարբերակ - մուտք օրիգինալ հոդվածներ):

Այս նախշերը առանձնահատուկ նշանակություն ունեն, քանի որ դրանք կազմում են 8x8 պատկերների հիմքը: Եթե ​​դուք ծանոթ չեք գծային հանրահաշիվին, դա նշանակում է, որ այս 8 օրինաչափություններից կարելի է պատրաստել ցանկացած 8x64 պատկեր: DCT-ն պատկերները 8x8 բլոկների բաժանելու և յուրաքանչյուր բլոկը այս 64 գործակիցների համակցության վերածելու գործընթաց է:

Կարծես կախարդական է, որ ցանկացած պատկեր կարող է կազմված լինել 64 կոնկրետ նախշերով: Այնուամենայնիվ, սա նույնն է, ինչ ասենք, որ Երկրի վրա ցանկացած վայր կարելի է նկարագրել երկու թվով` լայնություն և երկայնություն [նշելով կիսագնդերը / մոտ. թարգմ.]։ Մենք հաճախ Երկրի մակերեսը համարում ենք երկչափ, ուստի մեզ միայն երկու թիվ է անհրաժեշտ: 8x8 պատկերն ունի 64 չափս, ուստի մեզ անհրաժեշտ է 64 թիվ:

Դեռ պարզ չէ, թե դա ինչպես է մեզ օգնում սեղմման առումով։ Եթե ​​64x8 պատկերը ներկայացնելու համար մեզ անհրաժեշտ է 8 թիվ, ինչո՞ւ դա ավելի լավ կլիներ, քան պարզապես 64 պայծառության բաղադրիչ պահելը: Մենք դա անում ենք նույն պատճառով, որ երեք RGB համարները վերածեցինք երեք YCbCr թվերի. այն թույլ է տալիս մեզ հեռացնել նուրբ մանրամասները:

Դժվար է տեսնել, թե կոնկրետ ինչ դետալ է հեռացվել այս փուլում, քանի որ JPEG-ը կիրառում է DCT 8x8 բլոկների վրա: Սակայն ոչ ոք մեզ չի արգելում դա կիրառել ամբողջ պատկերի վրա։ Ահա, թե ինչպիսին է DCT-ն ամբողջ պատկերի վրա կիրառվող Y բաղադրիչի համար.

Ինչպես է աշխատում JPEG ձևաչափը

Ավելի քան 60 թվեր կարելի է հեռացնել վերջից՝ լուսանկարում գործնականում նկատելի փոփոխություններ չունենալով:

Ինչպես է աշխատում JPEG ձևաչափը

Այնուամենայնիվ, նկատի ունեցեք, որ եթե առաջին հինգ թվերը զրոյացնենք, տարբերությունն ակնհայտ կլինի։

Ինչպես է աշխատում JPEG ձևաչափը

Սկզբում թվերը ներկայացնում են պատկերի ցածր հաճախականության փոփոխությունները, որոնք մեր աչքերը լավագույնս ընկալում են: Վերջում գտնվող թվերը ցույց են տալիս բարձր հաճախականությունների փոփոխություններ, որոնք ավելի դժվար է նկատել: «Տեսնելու այն, ինչ աչքը չի կարող տեսնել», մենք կարող ենք մեկուսացնել այս բարձր հաճախականության մանրամասները՝ զրոյացնելով առաջին 5000 թվերը:

Ինչպես է աշխատում JPEG ձևաչափը

Մենք տեսնում ենք պատկերի բոլոր այն հատվածները, որտեղ ամենամեծ փոփոխությունը տեղի է ունենում պիքսելից պիքսել: Առանձնանում են կատվի աչքերը, բեղերը, տերրի վերմակը և ներքևի ձախ անկյունում գտնվող ստվերները։ Դուք կարող եք ավելի հեռուն գնալ՝ զրոյացնելով առաջին 10 համարները.

Ինչպես է աշխատում JPEG ձևաչափը

20 000:

Ինչպես է աշխատում JPEG ձևաչափը

40 000:

Ինչպես է աշխատում JPEG ձևաչափը

60 000:

Ինչպես է աշխատում JPEG ձևաչափը

Այս բարձր հաճախականության մանրամասները ջնջվում են JPEG-ով սեղմման փուլում: Գույները DCT գործակիցների փոխակերպման մեջ կորուստ չկա: Կորուստը տեղի է ունենում նմուշառման քայլում, որտեղ բարձր հաճախականության կամ մոտ զրոյական արժեքները հանվում են: Երբ իջեցնում եք JPEG խնայողության որակը, ծրագիրը մեծացնում է հեռացված արժեքների քանակի շեմը, ինչը նվազեցնում է ֆայլի չափը, բայց նկարը դարձնում է ավելի պիքսելային: Այդ իսկ պատճառով առաջին հատվածի պատկերը, որը 57 անգամ փոքր էր, այսպիսի տեսք ուներ. Յուրաքանչյուր 8x8 բլոկ ներկայացված էր շատ ավելի քիչ DCT գործակիցներով՝ համեմատած ավելի բարձր որակի տարբերակի:

Դուք կարող եք ստեղծել այնպիսի զով էֆեկտ, ինչպիսին է պատկերների աստիճանական հոսքը: Դուք կարող եք ցուցադրել մշուշոտ նկար, որն ավելի ու ավելի մանրամասն է դառնում, քանի որ ավելի ու ավելի շատ գործակիցներ են ներբեռնվում:

Ահա, պարզապես զվարճանալու համար, այն է, ինչ դուք ստանում եք՝ օգտագործելով ընդամենը 24 թվեր.

Ինչպես է աշխատում JPEG ձևաչափը

Կամ ընդամենը 5000:

Ինչպես է աշխատում JPEG ձևաչափը

Շատ մշուշոտ, բայց ինչ-որ կերպ ճանաչելի:

3. Run երկարության կոդավորումը, delta և Huffman

Մինչ այժմ սեղմման բոլոր փուլերը կորուստներով են եղել: Վերջին փուլը, ընդհակառակը, ընթանում է առանց կորուստների։ Այն չի ջնջում տեղեկատվությունը, բայց զգալիորեն նվազեցնում է ֆայլի չափը:

Ինչպե՞ս կարող եք ինչ-որ բան սեղմել՝ առանց տեղեկատվությունը դեն նետելու: Պատկերացրեք, թե ինչպես մենք նկարագրում ենք պարզ սև ուղղանկյուն 700 x 437:

JPEG-ը դրա համար օգտագործում է 5000 թվեր, բայց շատ ավելի լավ արդյունքների կարելի է հասնել: Պատկերացնու՞մ եք կոդավորման սխեման, որը նկարագրի նման պատկերը հնարավորինս քիչ բայթերով:

Նվազագույն սխեման, որը ես կարող էի ստեղծել, օգտագործում է չորսը՝ երեքը՝ գույնը ներկայացնելու համար, և չորրորդը՝ ցույց տալու համար, թե քանի պիքսել ունի այդ գույնը: Կրկնվող արժեքները այս խտացված ձևով ներկայացնելու գաղափարը կոչվում է վազքի երկարության կոդավորում: Այն անկորուստ է, քանի որ մենք կարող ենք վերականգնել կոդավորված տվյալները իրենց սկզբնական տեսքով:

Սև ուղղանկյունով JPEG ֆայլը շատ ավելի մեծ է, քան 4 բայթ. հիշեք, որ DCT մակարդակում սեղմումը կիրառվում է 8x8 պիքսելային բլոկների վրա: Հետևաբար, մեզ անհրաժեշտ է նվազագույնը մեկ DCT գործակից յուրաքանչյուր 64 պիքսելի համար: Մեզ պետք է մեկը, քանի որ մեկ DCT գործակիցը պահելու փոխարեն, որին հաջորդում է 63 զրո, գործարկման երկարության կոդավորումը թույլ է տալիս մեզ պահել մեկ թիվ և նշել, որ «բոլոր մնացածները զրո են»:

Դելտա կոդավորումը տեխնիկա է, որտեղ յուրաքանչյուր բայթ պարունակում է տարբերություն ինչ-որ արժեքից, այլ ոչ թե բացարձակ արժեք: Հետևաբար, որոշ բայթերի խմբագրումը փոխում է մնացած բոլոր պիքսելների գույնը: Օրինակ՝ պահեստավորման փոխարեն

12 13 14 14 14 13 13 14

Մենք կարող ենք սկսել 12-ից, ապա պարզապես նշել, թե որքան պետք է գումարենք կամ հանենք հաջորդ թիվը ստանալու համար: Եվ դելտա կոդավորման այս հաջորդականությունը ստանում է ձևը.

12 1 1 0 0 -1 0 1

Փոխարկված տվյալները սկզբնական տվյալներից փոքր չեն, բայց ավելի հեշտ է սեղմել դրանք։ Գործարկման երկարության կոդավորումից առաջ դելտա կոդավորման կիրառումը կարող է շատ օգնել՝ միաժամանակ լինելով անկորուստ սեղմում:

Դելտա կոդավորումը 8x8 բլոկներից դուրս օգտագործվող մի քանի տեխնիկաներից մեկն է: 64 DCT գործակիցներից մեկը պարզապես հաստատուն ալիքային ֆունկցիա է (պինդ գույն): Այն ներկայացնում է յուրաքանչյուր բլոկի միջին պայծառությունը luma բաղադրիչների համար կամ միջին կապույտությունը Cb բաղադրիչների համար և այլն: Յուրաքանչյուր DCT բլոկի առաջին արժեքը կոչվում է DC արժեք, իսկ յուրաքանչյուր DC արժեք՝ նախորդների նկատմամբ կոդավորված դելտա: Հետեւաբար, առաջին բլոկի պայծառությունը փոխելը կազդի բոլոր բլոկների վրա:

Վերջին առեղծվածը մնում է. ինչպե՞ս է եզակի թվի փոփոխությունն ամբողջությամբ փչացնում ամբողջ պատկերը: Մինչ այժմ սեղմման մակարդակները նման հատկություններ չեն ունեցել: Պատասխանը JPEG վերնագրում է: Առաջին 500 բայթը պարունակում է պատկերի վերաբերյալ մետատվյալներ՝ լայնություն, բարձրություն և այլն, և մենք դեռ չենք աշխատել դրանց հետ։

Առանց վերնագրի JPEG-ի վերծանումը գրեթե անհնար է (կամ շատ դժվար): Թվում է, թե ես փորձում եմ նկարագրել նկարը ձեզ, և սկսում եմ բառեր հորինել, որպեսզի փոխանցեմ իմ տպավորությունը։ Նկարագրությունը, հավանաբար, բավականին խտացված կլինի, քանի որ ես կարող եմ բառեր հորինել հենց այն իմաստով, որ ուզում եմ փոխանցել, բայց մնացած բոլորի համար դրանք իմաստ չեն ունենա։

Հիմարություն է թվում, բայց դա հենց այն է, ինչ տեղի է ունենում: Յուրաքանչյուր JPEG պատկեր սեղմված է իրեն հատուկ կոդերով: Կոդի բառարանը պահվում է վերնագրում: Այս տեխնիկան կոչվում է Huffman code, իսկ բառապաշարը՝ Huffman table: Վերնագրում աղյուսակը նշվում է երկու բայթով՝ 255 և հետո 196։ Յուրաքանչյուր գունային բաղադրիչ կարող է ունենալ իր աղյուսակը։

Աղյուսակների փոփոխություններն արմատապես կազդեն ցանկացած պատկերի վրա: Լավ օրինակ է 15-րդ տողը 1-ի փոխելը:

Ինչպես է աշխատում JPEG ձևաչափը

Դա տեղի է ունենում, քանի որ աղյուսակները նշում են, թե ինչպես պետք է կարդալ առանձին բիթերը: Մինչ այժմ մենք աշխատել ենք միայն երկուական թվերի հետ տասնորդական ձևով: Բայց սա մեզնից թաքցնում է այն փաստը, որ եթե ցանկանում եք 1 թիվը պահել բայթում, ապա այն կունենա 00000001, քանի որ յուրաքանչյուր բայթ պետք է ունենա ուղիղ ութ բիթ, նույնիսկ եթե դրանցից միայն մեկն է անհրաժեշտ:

Սա պոտենցիալ տարածքի մեծ վատնում է, եթե դուք ունեք շատ փոքր թվեր: Հաֆմանի կոդը տեխնիկա է, որը թույլ է տալիս մեզ հանգստացնել այս պահանջը, որ յուրաքանչյուր թիվ պետք է զբաղեցնի ութ բիթ: Սա նշանակում է, որ եթե տեսնում եք երկու բայթ.

234 115

Այնուհետև, կախված Հաֆմանի աղյուսակից, դրանք կարող են լինել երեք թվեր: Դրանք հանելու համար նախ անհրաժեշտ է դրանք բաժանել առանձին բիթերի.

11101010 01110011

Այնուհետև մենք նայում ենք աղյուսակին՝ պարզելու, թե ինչպես դրանք խմբավորել: Օրինակ, սա կարող է լինել առաջին վեց բիթերը (111010) կամ 58-ը տասնորդականով, որին հաջորդում են հինգ բիթ (10011) կամ 19, և վերջապես վերջին չորս բիթերը (0011) կամ 3:

Հետեւաբար, սեղմման այս փուլում շատ դժվար է հասկանալ բայթերը: Բայթերը չեն ներկայացնում այն, ինչ թվում է: Այս հոդվածում ես չեմ խորանա աղյուսակի հետ աշխատելու մանրամասների մեջ, բայց նյութեր այս հարցի վերաբերյալ առցանց բավարար է.

Հետաքրքիր հնարքներից մեկը, որը դուք կարող եք անել այս գիտելիքներով, վերնագիրն առանձնացնելն է JPEG-ից և այն առանձին պահել: Փաստորեն, պարզվում է, որ միայն դուք կարող եք կարդալ ֆայլը: Facebook-ը դա անում է ֆայլերն էլ ավելի փոքրացնելու համար:

Ուրիշ ինչ կարելի է անել Հաֆմանի աղյուսակը բավականին փոխելն է: Մյուսների համար դա կարծես կոտրված նկար լինի: Եվ միայն դուք կիմանաք այն ուղղելու կախարդական միջոցը։

Եկեք ամփոփենք. ուրեմն ի՞նչ է անհրաժեշտ JPEG-ը վերծանելու համար: Անհրաժեշտ:

  1. Հեռացրեք Huffman աղյուսակը (ներ)ը վերնագրից և վերծանեք բիթերը:
  2. Հանեք դիսկրետ կոսինուսի փոխակերպման գործակիցները յուրաքանչյուր գույնի և պայծառության բաղադրիչի համար յուրաքանչյուր 8x8 բլոկի համար՝ կատարելով հակադարձ վազքի երկարության և դելտա կոդավորման փոխակերպումներ:
  3. Միավորել կոսինուսները՝ հիմնված գործակիցների վրա՝ յուրաքանչյուր 8x8 բլոկի համար պիքսելային արժեքներ ստանալու համար:
  4. Սանդղակավորեք գունային բաղադրիչները, եթե կատարվել է ենթանմուշ (այս տեղեկատվությունը վերնագրում է):
  5. Յուրաքանչյուր պիքսելի համար ստացված YCbCr արժեքները փոխարկեք RGB-ի:
  6. Ցուցադրել պատկերը էկրանին:

Լուրջ աշխատանք պարզապես կատվի հետ լուսանկար դիտելու համար: Այնուամենայնիվ, այն, ինչ ինձ դուր է գալիս, այն է, որ այն ցույց է տալիս, թե որքան մարդակենտրոն JPEG տեխնոլոգիան է: Այն հիմնված է մեր ընկալման առանձնահատկությունների վրա, ինչը թույլ է տալիս մեզ հասնել շատ ավելի լավ սեղմման, քան սովորական տեխնոլոգիաները: Եվ հիմա, երբ մենք հասկանում ենք, թե ինչպես է աշխատում JPEG-ը, կարող ենք պատկերացնել, թե ինչպես կարող են այդ տեխնոլոգիաները տեղափոխվել այլ ոլորտներ: Օրինակ, տեսանյութում դելտա կոդավորումը կարող է ապահովել ֆայլի չափի զգալի կրճատում, քանի որ հաճախ կան ամբողջ տարածքներ, որոնք չեն փոխվում շրջանակից կադր (օրինակ՝ ֆոն):

Հոդվածում օգտագործված կոդը, բաց է և պարունակում է հրահանգներ, թե ինչպես փոխարինել նկարները ձեր նկարներով:

Source: www.habr.com

Добавить комментарий