JPEG. Siqish algoritmi

Yana bir bor salom! Men ushbu maqolani 2019 yil may oyida yozilganligini topdim. Bu WAVE va JPEG haqidagi bir qator maqolalarning davomi bu yerda birinchi. Ushbu nashr tasvirni kodlash algoritmi va umuman formatning o'zi haqida ma'lumotni o'z ichiga oladi.

Bir chimdim tarix

Bir osh qoshiq Vikipediya maqolasi:

JPEG (Joint Photographic Experts Group) fotosuratlar va shunga o'xshash tasvirlarni saqlash uchun ishlatiladigan mashhur rastr grafik formatlaridan biridir.

Ushbu standart rasmni samarali siqish uchun 1991 yilda Qo'shma Fotografik Ekspertlar Guruhi tomonidan ishlab chiqilgan.

Tasvirlar raw dan JPEG ga qanday o'tadi?

Ba'zi odamlar JPEG rasmlarni Huffman usuli yordamida siqilgan xom ma'lumot deb o'ylashadi, ammo bu to'g'ri emas. Boshqaruvni siqishdan oldin ma'lumotlar uzoq yo'lni bosib o'tadi.

Birinchidan, rang modeli RGB dan YCbCr ga o'zgartiriladi. Buning uchun hatto maxsus algoritm mavjud - shu yerda. Y tegilmaydi, chunki u yorqinlik uchun javobgardir va uning o'zgarishi sezilarli bo'ladi.

Tasvir bilan qilish kerak bo'lgan birinchi narsa "noziklash" (quyi namuna olish). Buni tushunish oson: 2x2 piksellar qatori olinadi, keyin Cb va Cr olinadi - bu 4 pikselning YCbCr komponentlarining har birining o'rtacha qiymatlari. Shunday qilib, biz 6 baytni qo'lga kiritdik, 4 Y, 4 Cb, 4 Cr o'rniga biz 4 Y va ularning har biri uchun bir xil Cb va Cr ni oldik (4 + 4 + 4 = 12; 4 + 1 + 1 = 6; 12 - 6 = 6). Hatto 2x2 miqyosda ham 2:1 siqish nisbati bilan yo'qotilgan siqilish qattiq eshitiladi. Bu butun tasvir uchun amal qiladi. Va shunday qilib - ular yarim o'lchamga tushib ketishdi. Va biz rangni idrok etishimiz tufayli ushbu texnikadan foydalanishimiz mumkin. Biror kishi yorug'likdagi farqni osongina sezadi, lekin rangda emas, agar u kichik piksellar blokida o'rtacha hisoblansa. Yupqalashtirish ham chiziqda, gorizontal va vertikal ravishda 4 pikselda amalga oshirilishi mumkin. Birinchi variant tez-tez ishlatiladi. Agar tasvir sifati muhim bo'lsa, unda kesish umuman amalga oshirilmaydi.
Yupqalashning vizual tasviri (Habr menga gif qo'shishga ruxsat bermadi) - https://i.ibb.co/Rg5Th9H/150953010617579181.gif

Tayyorgarlikning asosiy qismi

PREEP

Endi eng qiyin va eng kerakli qism keladi. Butun rasm 8x8 bloklarga bo'linadi (agar o'lchamlari blok tomonining ko'pligi bo'lmasa, to'ldirish qo'llaniladi).

Endi har bir blok uchun amal qiling DCT (diskret kosinus transformatsiyasi). Ushbu qismda keraksiz hamma narsa rasmdan chiqariladi. DCT dan foydalanib, siz berilgan blok (8Γ—8) tasvirning har qanday monoton qismini tasvirlashini tushunishingiz kerak: osmon, devor; yoki u murakkab tuzilishga ega (sochlar, belgilar va boshqalar). Shu kabi rangdagi 64 pikselni faqat 1 ta bilan tasvirlash mantiqan to'g'ri, chunki blok hajmi allaqachon ma'lum. Siqish uchun juda ko'p: 64 dan 1 gacha.

DCT blokni spektrga aylantiradi va o'qishlar keskin o'zgargan joyda koeffitsient ijobiy bo'ladi va o'tish qanchalik keskin bo'lsa, chiqish shunchalik yuqori bo'ladi. Koeffitsient yuqori bo'lgan joyda rasmda rang va yorqinlikdagi aniq o'tishlar ko'rsatilgan, u pastroq bo'lgan joyda - blokdagi YCbCr komponentlarining qiymatlaridagi zaif (silliq) o'zgarishlar.

Kvantlash

Siqish sozlamalari allaqachon bu erda qo'llaniladi. 8x8 matritsalarning har biridagi koeffitsientlarning har biri ma'lum bir raqamga bo'linadi. Agar siz barcha o'zgarishlardan keyin tasvir sifatini pasaytirmasangiz, bo'linuvchi bitta bo'lishi kerak. Agar ushbu fotosurat egallagan xotira siz uchun muhimroq bo'lsa, bo'linuvchi 1 dan katta bo'ladi va qism yaxlitlanadi. Ma'lum bo'lishicha, yaxlitlashdan keyin siz ko'pincha juda ko'p nolga ega bo'lasiz.

Kvantlash yanada kattaroq siqilish imkoniyatini yaratish uchun amalga oshiriladi. y = sin(x) grafigini kvantlash misolidan foydalanib, u quyidagicha ko'rinadi:

JPEG. Siqish algoritmi

Siqish

Avval matritsani zig-zag shaklida o'tkazamiz:

JPEG. Siqish algoritmi

Biz raqamlar bilan bir o'lchovli massivni olamiz. Biz unda juda ko'p nol borligini ko'ramiz, ularni olib tashlash mumkin. Buning uchun ko'p nollar ketma-ketligi o'rniga biz 1 nol va undan keyin ketma-ketlikda ularning sonini ko'rsatadigan raqamni kiritamiz. Shu tarzda siz butun massivning 1/3 o'lchamiga qayta o'rnatishingiz mumkin. Va keyin biz Huffman usuli yordamida ushbu massivni shunchaki siqib chiqaramiz va uni faylning o'ziga yozamiz.

Qaerdan foydalanish kerak

Hamma joyda. PNG kabi JPEG ham kameralarda, operatsion tizimlarda (kompaniya logotiplari, dastur piktogrammalari, eskizlar sifatida) va tasvirlar samarali saqlanishi kerak bo'lgan barcha mumkin bo'lgan sohalarda qo'llaniladi.

xulosa

Hozirgi vaqtda JPEG haqidagi bilimlar faqat ta'lim maqsadlarida qimmatlidir, chunki u allaqachon hamma joyda qurilgan va odamlarning katta guruhlari tomonidan optimallashtirilgan, ammo ilm-fan graniti hali ham mazali.

Axborot manbalari

Vikipediyadagi YCbCr haqida maqola
JPEG bo'yicha Vikipediya maqolasi
Pikabu postidan PrEP haqida bir oz
PrEP bo'yicha Vikipediya maqolasi

Manba: www.habr.com

a Izoh qo'shish