JPEG. Компрессия алгоритми

Дагы бир жолу салам! Мен бул макаланы 2019-жылдын май айында жазылганын таптым. Бул WAVE жана JPEG жөнүндө бир катар макалалардын уландысы, бул жерде биринчи. Бул басылмада сүрөттү коддоо алгоритми жана бүтүндөй форматтын өзү жөнүндө маалымат камтылат.

Бир чымчым тарых

Wikipedia макаласынын бир аш кашык:

JPEG (Joint Photographic Experts Group) фотосүрөттөрдү жана окшош сүрөттөрдү сактоо үчүн колдонулган популярдуу растрдик графика форматтарынын бири.

Бул стандарт сүрөттөрдү эффективдүү кысуу үчүн 1991-жылы Биргелешкен Фотографиялык Эксперттер тобу тарабынан иштелип чыккан.

Сүрөттөр чийкиден JPEGге кантип өтөт?

Кээ бир адамдар JPEG сүрөттөрү Huffman ыкмасы менен кысылган чийки маалымат деп ойлошот, бирок бул туура эмес. Контролдук кысуудан мурун маалымат узак жолду басып өтөт.

Биринчиден, түс модели RGBден YCbCrге өзгөртүлөт. Бул үчүн атайын алгоритм да бар - бул жерде. Y тийбейт, анткени ал жарыктык үчүн жооптуу жана анын өзгөрүүсү байкалат.

Сүрөт менен эмне кылуу керек биринчи нерсе "суюруу" (кошумча үлгүлөрдү алуу). Түшүнүү оңой: пикселдердин 2x2 массиви алынат, андан кийин Cb жана Cr алынат - бул 4 пикселдин YCbCr компоненттеринин ар биринин орточо мааниси. Ошентип, биз 6 байт уттук, ордуна 4 Y, 4 Cb, 4 Cr 4 Y жана алардын ар бири үчүн бирдей Cb жана Cr алдык (4 + 4 + 4 = 12; 4 + 1 + 1 = 6; 12 - 6 = 6). Жада калса 2x2 масштабында 2:1 кысуу катышы менен жоготуулуу кысуу катуу угулат. Бул бүт сүрөткө тиешелүү. Ошентип, алар жарым өлчөмдү түшүрүштү. Жана биз түстү кабылдообуздун аркасында бул техниканы колдоно алабыз. Адам жарыктыктын айырмасын оңой эле байкайт, бирок түстө эмес, эгерде ал пикселдердин кичинекей блогу боюнча орточо алынган болсо. Ичкертүүнү сызыкта, туурасынан жана вертикалдуу 4 пиксельде да жасоого болот. Биринчи параметр көбүрөөк колдонулат. Сүрөттүн сапаты маанилүү болсо, анда дециминация такыр аткарылбайт.
Суюктукту визуалдык иллюстрация (Хабр мага gif киргизүүгө уруксат берген жок) - https://i.ibb.co/Rg5Th9H/150953010617579181.gif

даярдоо негизги бөлүгү

ПРЕП

Эми эң кыйын жана эң керектүү бөлүгү келди. Бүтүндөй сүрөт 8x8 блокторуна бөлүнгөн (толуктоо блок тараптын эселенген бөлүгү болбосо, колдонулат).

Эми ар бир блокко колдонулат DCT (Discrete Cosine Transform). Бул бөлүктө бардык керексиз нерселер сүрөттөн алынып салынат. DCT колдонуу менен, сиз берилген блок (8×8) сүрөттөлүштүн кандайдыр бир монотондуу бөлүгүн сүрөттөйт же жокпу, түшүнүү керек: асман, дубал; же ал татаал түзүлүштү камтыйт (чач, символдор ж.б.). Окшош түстөгү 64 пикселди 1 гана сүрөттөөгө болот, анткени логикалуу блок өлчөмү буга чейин белгилүү. Кысуу үчүн ушунчалык көп: 64кө 1.

DCT блокту спектрге айлантат, ал эми көрсөткүчтөр кескин өзгөргөн жерде коэффициент оң болуп, өтүү канчалык курч болсо, натыйжа ошончолук жогору болот. Коэффициент жогору болгон жерде, сүрөттө түстөгү жана жарыктыктын ачык өтүүлөрү, ал төмөн болгон жерде - блоктогу YCbCr компоненттеринин маанилериндеги алсыз (текшерүү) өзгөрүүлөр.

Кванттоо

Бул жерде кысуу жөндөөлөрү мурунтан эле колдонулган. 8x8 матрицалардын ар бириндеги коэффициенттердин ар бири белгилүү бир санга бөлүнөт. Эгерде сиз бардык өзгөртүүлөрдөн кийин сүрөттүн сапатын төмөндөтпөсөңүз, анда бөлүүчү бир болушу керек. Эгер бул сүрөт ээлеген эс тутум сиз үчүн маанилүүрөөк болсо, анда бөлүүчү 1ден чоң болуп, бөлүүчү тегеректелген болот. Көрсө, тегеректелгенден кийин сиз көп нөлгө ээ болосуз.

Кванттоо дагы көбүрөөк кысуу мүмкүнчүлүгүн түзүү үчүн жасалат. Бул y = sin(x) графигин кванттоо мисалында кандай көрүнөт:

JPEG. Компрессия алгоритми

Кысуу

Биринчиден, биз зиг-заг үлгүсүндө матрицадан өтөбүз:

JPEG. Компрессия алгоритми

Биз сандар менен бир өлчөмдүү массивди алабыз. Анда нөлдөрдүн көп экенин көрүп жатабыз, аларды алып салууга болот. Бул үчүн көптөгөн нөлдөрдүн ырааттуулугунун ордуна 1 нөлдү жана андан кийин алардын санын катардагы санды киргизебиз. Ушундай жол менен сиз бүт массивдин 1/3 өлчөмүнө кайра орното аласыз. Анан биз бул массивди Huffman ыкмасы менен кысып, файлдын өзүнө жазабыз.

Кайда колдонулат

Бардык жерде. PNG сыяктуу эле, JPEG камераларда, ОСларда (компаниянын логотиптери, тиркемелердин иконалары, эскиздери катары) жана сүрөттөрдү эффективдүү сактоо керек болгон бардык аймактарда колдонулат.

жыйынтыктоо

Учурда JPEG жөнүндөгү билим билим берүү максатында гана баалуу, анткени ал бардык жерде курулган жана адамдардын чоң топтору тарабынан оптимизацияланган, бирок илимдин гранити дагы деле даамдуу.

булактар

Wikipediaдагы YCbCr жөнүндө макала
JPEG боюнча Wikipedia макаласы
Пикабу постунан PrEP жөнүндө бир аз
PrEP боюнча Wikipedia макаласы

Source: www.habr.com

Комментарий кошуу