JPEG. Қысу алгоритмі

Тағы да сәлем! Мен бұл мақаланы 2019 жылдың мамыр айында жазылғанын таптым. Бұл WAVE және JPEG туралы мақалалар сериясының жалғасы, мұнда бірінші. Бұл жарияланым кескінді кодтау алгоритмі және тұтастай пішімнің өзі туралы ақпаратты қамтиды.

Бір шымшым тарих

Wikipedia мақаласының ас қасық:

JPEG (Joint Photographic Experts Group) - фотосуреттер мен ұқсас кескіндерді сақтау үшін пайдаланылатын танымал растрлық графика пішімдерінің бірі.

Бұл стандартты 1991 жылы бірлескен фотографиялық сарапшылар тобы кескінді тиімді қысу үшін әзірлеген.

Суреттер өңделмеген күйден JPEGге қалай ауысады?

Кейбір адамдар JPEG кескіндерін Хаффман әдісі арқылы қысылған шикі деректер деп ойлайды, бірақ бұл дұрыс емес. Басқаруды қысу алдында деректер ұзақ жол жүреді.

Біріншіден, түс үлгісі 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 (дискретті косинус түрлендіруі). Бұл бөлікте қажет емес нәрсенің бәрі суреттен алынады. DCT пайдалана отырып, берілген блок (8×8) кескіннің кез келген монотонды бөлігін сипаттайтынын түсіну керек: аспан, қабырға; немесе оның құрамында күрделі құрылым бар (шаш, символдар және т.б.). Ұқсас түстің 64 пикселін тек 1 арқылы сипаттауға болатыны қисынды, өйткені блок өлшемі бұрыннан белгілі. Қысу үшін соншалықты көп: 64-тен 1-ге дейін.

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

Кванттау

Бұл жерде қысу параметрлері әлдеқашан қолданылған. 8x8 матрицаларының әрқайсысындағы коэффициенттердің әрқайсысы белгілі бір санға бөлінеді. Егер сіз барлық өзгертулерден кейін кескін сапасын төмендетпесеңіз, онда бөлгіш бір болуы керек. Егер осы фотосуреттің жадысы сіз үшін маңыздырақ болса, онда бөлгіш 1-ден үлкен болады, ал бөлім дөңгелектенеді. Дөңгелектегеннен кейін көп нөлдермен аяқталады екен.

Кванттау одан да үлкен қысу мүмкіндігін жасау үшін жасалады. y = sin(x) графигін кванттау мысалын пайдалану мынандай көрінеді:

JPEG. Қысу алгоритмі

Қысу

Алдымен біз матрицадан зиг-заг үлгісінде өтеміз:

JPEG. Қысу алгоритмі

Біз сандары бар бір өлшемді массив аламыз. Біз онда нөлдердің көп екенін көреміз, оларды алып тастауға болады. Ол үшін көптеген нөлдер тізбегінің орнына 1 нөлді және одан кейін олардың қатардағы санын көрсететін санды енгіземіз. Осылайша сіз бүкіл массивтің 1/3 өлшеміне қалпына келтіре аласыз. Содан кейін біз Huffman әдісі арқылы бұл массивді жай ғана қысамыз және оны файлдың өзіне жазамыз.

Қайда қолдануға болады

Барлық жерде. PNG сияқты, JPEG камераларда, операциялық жүйелерде (компания логотиптері, қолданба белгішелері, нобайлар ретінде) және кескіндерді тиімді сақтауды қажет ететін барлық мүмкін аймақтарда қолданылады.

қорытынды

Қазіргі уақытта JPEG туралы білім тек білім беру мақсатында ғана құнды, өйткені ол қазірдің өзінде барлық жерде салынған және адамдардың үлкен топтары арқылы оңтайландырылған, бірақ ғылымның граниті әлі де дәмді.

Ақпарат көздері

Википедиядағы YCbCr туралы мақала
JPEG туралы Wikipedia мақаласы
Пикабу постынан PrEP туралы аздап
PrEP туралы Wikipedia мақаласы

Ақпарат көзі: www.habr.com

пікір қалдыру