JPEG. Algoritmi i kompresimit

Pershendetje perseri! E gjeta këtë artikull të shkruar në maj 2019. Ky është një vazhdim i një serie artikujsh rreth WAVE dhe JPEG, këtu i parë. Ky publikim do të përfshijë informacion në lidhje me algoritmin e kodimit të imazhit dhe vetë formatin në tërësi.

Një majë historie

Një lugë gjelle artikulli në Wikipedia:

JPEG (Joint Photographic Experts Group) është një nga formatet e njohura të grafikës raster që përdoret për ruajtjen e fotografive dhe imazheve të ngjashme.

Ky standard u zhvillua nga Grupi i Përbashkët i Ekspertëve të Fotografisë në vitin 1991 për kompresim efikas të imazhit.

Si kalojnë imazhet nga të papërpunuara në JPEG?

Disa njerëz mendojnë se imazhet JPEG janë të dhëna të papërpunuara të kompresuara duke përdorur metodën Huffman, por kjo nuk është e vërtetë. Para kompresimit të kontrollit, të dhënat udhëtojnë shumë.

Së pari, modeli i ngjyrave ndryshohet nga RGB në YCbCr. Ekziston edhe një algoritëm i veçantë për këtë - këtu. Y nuk preket, pasi është përgjegjës për shkëlqimin dhe ndryshimi i tij do të jetë i dukshëm.

Gjëja e parë që duhet bërë me imazhin është "hollim" (nënmostrim). Është e lehtë për t'u kuptuar: merret një grup pikselësh 2x2, pastaj merren Cb dhe Cr - vlerat mesatare të secilit prej përbërësve YCbCr të këtyre 4 pikselave. Kështu që, fituam 6 bajt, në vend të 4 Y, 4 Cb, 4 Cr kemi marrë 4 Y dhe të njëjtat Cb dhe Cr për secilën prej tyre (4 + 4 + 4 = 12; 4 + 1 + 1 = 6; 12 - 6 = 6). Edhe në shkallën 2x2, kompresimi me humbje me një raport ngjeshjeje 2:1 tingëllon i fortë. Kjo vlen për të gjithë imazhin. Dhe kështu - ata ranë gjysmë madhësie. Dhe ne mund ta përdorim këtë teknikë falë perceptimit tonë të ngjyrave. Një person do të vërejë lehtësisht një ndryshim në shkëlqim, por jo në ngjyrë, nëse ai mesatarizohet mbi një bllok të vogël pikselësh. Hollimi mund të bëhet edhe në një vijë, 4 piksele horizontalisht dhe vertikalisht. Opsioni i parë përdoret më shpesh. Nëse cilësia e figurës është e rëndësishme, atëherë decimi nuk kryhet fare.
Një ilustrim vizual i rrallimit (Habr nuk më lejoi të fus një gif) - https://i.ibb.co/Rg5Th9H/150953010617579181.gif

Pjesa kryesore e përgatitjes

VKM

Tani vjen pjesa më e vështirë dhe më e nevojshme. I gjithë imazhi është i ndarë në blloqe 8x8 (mbushja përdoret nëse rezolucioni nuk është shumëfish i anës së bllokut).

Tani aplikoni për çdo bllok DCT (Transformimi diskret i kosinusit). Në këtë pjesë çdo gjë e panevojshme është nxjerrë jashtë pamjes. Duke përdorur DCT, duhet të kuptoni nëse një bllok i caktuar (8×8) përshkruan ndonjë pjesë monotone të imazhit: qiellin, murin; ose përmban strukturë komplekse (flokë, simbole, etj.). Është logjike që 64 piksele me ngjyrë të ngjashme mund të përshkruhen me vetëm 1, sepse madhësia e bllokut tashmë dihet. Kaq shumë për kompresimin: 64 me 1.

DCT e kthen bllokun në një spektër dhe aty ku leximet ndryshojnë ndjeshëm, koeficienti bëhet pozitiv dhe sa më i mprehtë të jetë tranzicioni, aq më i lartë do të jetë prodhimi. Aty ku koeficienti është më i lartë, fotografia tregon tranzicione të qarta në ngjyrë dhe shkëlqim, ku është më i ulët - ndryshime të dobëta (të lëmuara) në vlerat e përbërësve YCbCr në bllok.

Kuantizimi

Cilësimet e kompresimit janë aplikuar tashmë këtu. Secili nga koeficientët në secilën nga matricat 8x8 ndahet me një numër të caktuar. Nëse nuk do të zvogëloni cilësinë e figurës pas të gjitha modifikimeve të tij, atëherë pjesëtuesi duhet të jetë një. Nëse kujtesa e zënë nga kjo foto është më e rëndësishme për ju, atëherë pjesëtuesi do të jetë më i madh se 1 dhe koeficienti do të rrumbullakoset. Rezulton se pas rrumbullakosjes shpesh përfundoni me shumë zero.

Kuantizimi bëhet për të krijuar mundësinë e ngjeshjes edhe më të madhe. Ja si duket duke përdorur shembullin e kuantizimit të grafikut y = sin(x):

JPEG. Algoritmi i kompresimit

Ngjeshja

Së pari kalojmë matricën në një model zig-zag:

JPEG. Algoritmi i kompresimit

Marrim një grup njëdimensional me numra. Ne shohim që ka shumë zero në të, ato mund të hiqen. Për ta bërë këtë, në vend të një sekuence me shumë zero, ne futim 1 zero dhe pas tij një numër që tregon numrin e tyre në sekuencë. Në këtë mënyrë mund të rivendosni në 1/3 e madhësisë së të gjithë grupit. Dhe pastaj ne thjesht e kompresojmë këtë grup duke përdorur metodën Huffman dhe e shkruajmë atë në vetë skedarin.

Ku përdoret

Kudo. Ashtu si PNG, JPEG përdoret në kamera, OS (si logot e kompanive, ikona të aplikacioneve, figurat e vogla) dhe në të gjitha zonat e mundshme ku imazhet duhet të ruhen në mënyrë efikase.

Prodhim

Për momentin, njohuritë për JPEG tani janë të vlefshme vetëm për qëllime edukative, sepse ajo tashmë është ndërtuar kudo dhe e optimizuar nga grupe të mëdha njerëzish, por graniti i shkencës është ende i shijshëm.

burime

Artikull rreth YCbCr në Wikipedia
Artikull Wikipedia mbi JPEG
Pak rreth PrEP nga postimi i Pikabu
Artikull Wikipedia mbi PrEP

Burimi: www.habr.com

Shto një koment