JPEG formati qanday ishlaydi

JPEG tasvirlari raqamli hayotimizda hamma joyda mavjud, ammo bu xabardorlik shponining orqasida inson ko'ziga sezilmaydigan tafsilotlarni olib tashlaydigan algoritmlar mavjud. Natijada eng kichik fayl hajmida eng yuqori vizual sifat - lekin bularning barchasi qanday ishlaydi? Keling, ko'zlarimiz aniq nimani ko'rmasligini ko'rib chiqaylik!

JPEG formati qanday ishlaydi

Do'stingizga fotosurat yuborish va ular qaysi qurilma, brauzer yoki operatsion tizimdan foydalanayotgani haqida qayg'urmaslik oson, lekin bu har doim ham shunday bo'lmagan. 1980-yillarning boshlariga kelib, kompyuterlar raqamli tasvirlarni saqlashi va namoyish qilishi mumkin edi, ammo buni amalga oshirishning eng yaxshi usuli haqida ko'plab raqobatlashuvchi g'oyalar mavjud edi. Tasvirni bir kompyuterdan boshqasiga yuborib, u ishlaydi deb umid qilib bo'lmaydi.

Ushbu muammoni hal qilish uchun 1986 yilda butun dunyo bo'ylab ekspertlar qo'mitasi yig'ildi.Fotosurat bo'yicha mutaxassislarning qo'shma guruhi» (Joint Photographic Experts Group, JPEG), Xalqaro standartlashtirish tashkiloti (ISO) va Xalqaro elektrotexnika komissiyasi (IEC) oʻrtasida qoʻshma saʼy-harakatlar sifatida tashkil etilgan, shtab-kvartirasi Shveytsariyaning Jeneva shahrida joylashgan ikkita xalqaro standartlar tashkiloti.

JPEG deb nomlangan bir guruh odamlar 1992 yilda JPEG raqamli tasvirni siqish standartini yaratdilar. Internetdan foydalangan har bir kishi, ehtimol JPEG kodli tasvirlarga duch kelgan. Bu tasvirlarni kodlash, yuborish va saqlashning eng keng tarqalgan usuli. Veb-sahifalardan elektron pochta va ijtimoiy tarmoqlargacha JPEG kuniga milliardlab marta ishlatiladi - deyarli har safar biz rasmni onlayn ko'rganimizda yoki uni yuborganimizda. JPEG bo'lmasa, Internet kamroq rang-barang, sekinroq va mushuklarning rasmlari kamroq bo'lar edi!

Ushbu maqola JPEG tasvirini qanday dekodlash haqida. Boshqacha qilib aytganda, kompyuterda saqlangan siqilgan ma'lumotlarni ekranda paydo bo'ladigan tasvirga aylantirish uchun nima talab qilinadi. Bu nafaqat biz har kuni foydalanadigan texnologiyani tushunish muhimligi uchun, balki siqilish darajasini ochish orqali biz idrok va ko'rish va ko'zlarimiz qaysi tafsilotlarga eng sezgir ekanligi haqida ko'proq bilib olamiz.

Bundan tashqari, bu tarzda tasvirlar bilan o'ynash juda qiziq.

JPEG formati qanday ishlaydi

JPEG ichiga qarash

Kompyuterda hamma narsa ikkilik raqamlar ketma-ketligi sifatida saqlanadi. Odatda bu bitlar, nollar va birliklar baytlarni tashkil qilish uchun sakkizdan iborat guruhlarga birlashtiriladi. JPEG tasvirini kompyuterda ochganingizda, biror narsa (brauzer, operatsion tizim, boshqa narsa) baytlarni dekodlashi kerak, asl tasvirni ko'rsatilishi mumkin bo'lgan ranglar ro'yxati sifatida tiklaydi.

Agar siz ushbu shirinlikni yuklab olsangiz mushukning fotosurati va uni matn muharririda oching, siz bir nechta nomuvofiq belgilarni ko'rasiz.

JPEG formati qanday ishlaydi
Bu erda men fayl mazmunini tekshirish uchun Notepad++ dan foydalanmoqdaman, chunki Windows-dagi Notepad kabi oddiy matn muharrirlari saqlanganidan keyin ikkilik faylni buzadi va u endi JPEG formatini qoniqtirmaydi.

Tasvirni matn protsessorida ochish kompyuterni chalkashtirib yuboradi, xuddi ko‘zingizni ishqalab, rangli dog‘larni ko‘ra boshlaganingizda miyangizni chalkashtirib yuborganingizdek!

Siz ko'rgan bu dog'lar deb nomlanadi fosfenlar, va ong tomonidan yaratilgan yorug'lik stimuli yoki gallyutsinatsiyaning natijasi emas. Ular miyangiz optik nervlardagi har qanday elektr signallari yorug'lik haqida ma'lumot beradi deb o'ylaganligi sababli paydo bo'ladi. Miya bu taxminlarni amalga oshirishi kerak, chunki signal tovush, ko'rish yoki boshqa narsa ekanligini bilishning hech qanday usuli yo'q. Tanadagi barcha nervlar aynan bir xil elektr impulslarini uzatadi. Ko'zlaringizga bosim o'tkazish orqali siz vizual bo'lmagan signallarni yuborasiz, lekin ko'z retseptorlarini faollashtirasiz, sizning miyangiz ularni - bu holda, noto'g'ri - ingl. Siz bosimni tom ma'noda ko'rishingiz mumkin!

Kompyuterlar miyaga qanchalik o'xshashligi haqida o'ylash juda kulgili, ammo bu ma'lumotlarning ma'nosi - nervlar orqali tanaga o'tishi yoki kompyuterda saqlanganligi - uning qanday talqin qilinishiga qanchalik bog'liqligini ko'rsatish uchun foydali analogiya. Barcha ikkilik ma'lumotlar har qanday turdagi ma'lumotlarni uzata oladigan asosiy komponentlar bo'lgan 0 va 1 lardan iborat. Sizning kompyuteringiz ko'pincha fayl kengaytmalari kabi maslahatlar yordamida ularni qanday izohlashni aniqlaydi. Endi biz ularni matn sifatida izohlashga majbur qilamiz, chunki matn muharriri shuni kutadi.

JPEG kodini qanday dekodlashni tushunish uchun biz asl signallarning o'zlarini - ikkilik ma'lumotlarni ko'rishimiz kerak. Buni o'n oltilik muharrir yordamida yoki to'g'ridan-to'g'ri amalga oshirish mumkin asl maqola veb-sahifasi! Rasm mavjud, uning yonida matn maydonida uning barcha baytlari (sarlavhadan tashqari) o'nli shaklda taqdim etiladi. Siz ularni o'zgartirishingiz mumkin va skript tezda qayta kodlanadi va yangi tasvirni yaratadi.

JPEG formati qanday ishlaydi

Ushbu muharrir bilan o'ynash orqali siz ko'p narsalarni o'rganishingiz mumkin. Masalan, piksellar qanday tartibda saqlanganligini ayta olasizmi?

Bu misolning g'alati tomoni shundaki, ba'zi raqamlarni o'zgartirish tasvirga umuman ta'sir qilmaydi, lekin, masalan, birinchi qatordagi 17 raqamini 0 bilan almashtirsangiz, fotosurat butunlay buziladi!

JPEG formati qanday ishlaydi

Boshqa o'zgarishlar, masalan, 7-chi qatordagi 1988 raqamini 254 raqami bilan almashtirish rangni o'zgartiradi, lekin faqat keyingi piksellar.

JPEG formati qanday ishlaydi

Ehtimol, eng g'alati narsa shundaki, ba'zi raqamlar nafaqat rangni, balki tasvirning shaklini ham o'zgartiradi. 70-qatordagi 12-ni 2-ga o'zgartiring va nimani nazarda tutayotganimni tushunish uchun tasvirning yuqori qatoriga qarang.

JPEG formati qanday ishlaydi

Qaysi JPEG tasviridan foydalanmasligingizdan qat'iy nazar, baytlarni tahrirlashda siz har doim bu sirli shaxmat naqshlarini topasiz.

Muharrir bilan o'ynaganingizda, ushbu baytlardan fotosurat qanday qayta yaratilishini tushunish qiyin, chunki JPEG siqish bosqichlarida ketma-ket qo'llaniladigan uch xil texnologiyadan iborat. Biz ko'rayotgan sirli xatti-harakatni ochish uchun har birini alohida o'rganamiz.

JPEG siqishning uch darajasi:

  1. Rangli namuna olish.
  2. Diskret kosinus konvertatsiyasi va namuna olish.
  3. Ishlash uzunligini kodlash, delta и Huffman

Siqishning kattaligi haqida tasavvurga ega bo'lish uchun yuqoridagi rasm 79 819 raqamni yoki taxminan 79 KB ni ifodalashiga e'tibor bering. Agar biz uni siqmasdan saqlasak, har bir piksel uchta raqamni talab qiladi - qizil, yashil va ko'k komponentlar uchun. Bu 917 700 raqamni yoki taxminan. 917 KB. JPEG siqish natijasida yakuniy fayl 10 barobardan ko'proq qisqardi!

Aslida, bu tasvirni ko'proq siqish mumkin. Quyida ikkita rasm yonma-yon joylashgan - o'ngdagi fotosurat 16 KB ga siqilgan, ya'ni siqilmagan versiyadan 57 marta kichikroq!

JPEG formati qanday ishlaydi

Agar diqqat bilan qarasangiz, bu tasvirlar bir xil emasligini ko'rasiz. Ularning ikkalasi ham JPEG siqishli tasvirlar, lekin o'ngdagisi hajmi jihatidan ancha kichikroq. Bundan tashqari, biroz yomonroq ko'rinadi (fon rangidagi kvadratlarga qarang). Shuning uchun JPEG yo'qolgan siqilish deb ham ataladi; Siqish jarayonida tasvir o'zgaradi va ba'zi tafsilotlarni yo'qotadi.

1. Rangli namuna olish

Bu erda faqat birinchi darajadagi siqilish qo'llaniladigan rasm.

JPEG formati qanday ishlaydi
(Interaktiv versiya - in original maqolalar). Bitta raqamni olib tashlash barcha ranglarni yo'q qiladi. Biroq, agar aniq oltita raqam olib tashlansa, bu tasvirga deyarli ta'sir qilmaydi.

Endi raqamlarni ochish biroz osonroq. Bu ranglarning deyarli oddiy ro'yxati bo'lib, unda har bir bayt aynan bitta pikselni o'zgartiradi, lekin ayni paytda u siqilmagan tasvirning yarmiga teng (bu qisqartirilgan o'lchamda taxminan 300 KB ni egallaydi). Sababini taxmin qila olasizmi?

Ko'rishingiz mumkinki, bu raqamlar standart qizil, yashil va ko'k komponentlarni ifodalamaydi, chunki agar biz barcha raqamlarni nol bilan almashtirsak, biz yashil rangga ega bo'lamiz (oq emas).

JPEG formati qanday ishlaydi

Buning sababi shundaki, bu baytlar Y (yorqinlik) ni anglatadi.

JPEG formati qanday ishlaydi

Cb (nisbiy ko'klik),

JPEG formati qanday ishlaydi

va Cr (nisbiy qizarish) rasmlari.

JPEG formati qanday ishlaydi

Nima uchun RGB dan foydalanmaslik kerak? Axir, aksariyat zamonaviy ekranlar shunday ishlaydi. Sizning monitoringiz har qanday rangni, jumladan qizil, yashil va ko'kni har bir piksel uchun har xil intensivlikda ko'rsatishi mumkin. Oq rang uchtasini to'liq yorqinlikda, qora esa ularni o'chirish orqali olinadi.

JPEG formati qanday ishlaydi

Bu ham inson ko'zi qanday ishlashiga juda o'xshaydi. Ko'zimizdagi rang retseptorlari deyiladi "konuslar", va uchta turga bo'lingan, ularning har biri qizil, yashil yoki ko'k ranglarga sezgirroq [S-tipli konuslar binafsha-ko'k rangga sezgir (inglizcha qisqa - qisqa to'lqin spektridan S), M. -turi - yashil-sariq (ingliz tilidan M Medium - o'rta to'lqin) va L tipi - sariq-qizil (inglizchadan L Long - uzun to'lqinli) spektrning qismlarida. Ushbu uch turdagi konusning mavjudligi (va spektrning zumrad yashil qismida sezgir bo'lgan tayoqchalar) odamga rangli ko'rish imkonini beradi. / taxminan. tarjima]. G'ildiraklar, bizning ko'zimizdagi boshqa turdagi fotoreseptorlar yorqinlikdagi o'zgarishlarni aniqlashga qodir, lekin rangga nisbatan ancha sezgir. Bizning ko'zlarimiz taxminan 120 million tayoq va atigi 6 million konusga ega.

Shuning uchun bizning ko'zlarimiz rangdagi o'zgarishlardan ko'ra yorqinlikdagi o'zgarishlarni aniqlashda ancha yaxshi. Rangni yorqinlikdan ajratsangiz, ozgina rangni olib tashlashingiz mumkin va hech kim hech narsani sezmaydi. Chroma subsampling - bu tasvirning rang komponentlarini yorqinlik komponentlariga qaraganda pastroq aniqlikda aks ettirish jarayoni. Yuqoridagi misolda har bir piksel aynan bitta Y komponentiga ega va to'rt pikseldan iborat har bir alohida guruhda aynan bitta Cb va bitta Cr komponenti mavjud. Shuning uchun tasvir asl nusxadan to'rt barobar kamroq rang ma'lumotlarini o'z ichiga oladi.

YCbCr rang maydoni nafaqat JPEG formatida qo'llaniladi. U dastlab 1938 yilda teledasturlar uchun ixtiro qilingan. Hamma ham rangli televizorga ega emas, shuning uchun rang va yorqinlikni ajratish hammaga bir xil signalni olish imkonini berdi va rangsiz televizorlar faqat yorqinlik komponentidan foydalangan.

Shunday qilib, tahrirlovchidan bitta raqamni olib tashlash barcha ranglarni butunlay buzadi. Komponentlar Y Y Y Y Cb Cr shaklida saqlanadi (aslida, bu tartibda bo'lishi shart emas - saqlash tartibi fayl sarlavhasida ko'rsatilgan). Birinchi raqamni olib tashlash Cb ning birinchi qiymatini Y, Cr Cb sifatida qabul qilinishiga olib keladi va umuman olganda siz rasmning barcha ranglarini almashtiradigan domino effektiga ega bo'lasiz.

JPEG spetsifikatsiyasi sizni YCbCr dan foydalanishga majburlamaydi. Ammo aksariyat fayllar undan foydalanadi, chunki u RGB ga qaraganda yaxshiroq tushirilgan tasvirlarni ishlab chiqaradi. Lekin siz mening so'zimni qabul qilishingiz shart emas. Quyidagi jadvalda har bir alohida komponentning quyi namunasi RGB va YCbCr da qanday ko'rinishini o'zingiz ko'ring.

JPEG formati qanday ishlaydi
(Interaktiv versiya - in original maqolalar).

Ko'kni olib tashlash qizil yoki yashil rangdagi kabi sezilarli emas. Bu sizning ko'zlaringizdagi olti million konus tufayli, taxminan 64% qizil, 32% yashil va 2% ko'k rangga sezgir.

Y komponentining quyi namunasi (pastki chap) eng yaxshi ko'rinadi. Hatto kichik o'zgarish ham sezilarli.

Tasvirni RGB-dan YCbCr-ga o'zgartirish fayl hajmini kamaytirmaydi, lekin olib tashlanishi mumkin bo'lgan kamroq ko'rinadigan tafsilotlarni topishni osonlashtiradi. Yo'qotilgan siqilish ikkinchi bosqichda sodir bo'ladi. Bu ma'lumotlarni yanada siqilgan shaklda taqdim etish g'oyasiga asoslanadi.

2. Diskret kosinusni aylantirish va tanlash

Ushbu siqilish darajasi, asosan, JPEG bilan bog'liq. Ranglarni YCbCr ga aylantirgandan so'ng, komponentlar alohida siqiladi, shuning uchun biz faqat Y komponentiga e'tibor qaratishimiz mumkin.Va bu qatlamni qo'llashdan keyin Y komponentining baytlari qanday ko'rinishga ega.

JPEG formati qanday ishlaydi
(Interaktiv versiya - in original maqolalar). Interaktiv versiyada pikselni bosish muharrirni uni ifodalovchi qatorga aylantiradi. Raqamlarni oxiridan olib tashlashga yoki ma'lum bir raqamga bir nechta nol qo'shishga harakat qiling.

Bir qarashda, bu juda yomon siqilishga o'xshaydi. Tasvirda 100 000 piksel bor va ularning yorqinligini (Y-komponentlari) ifodalash uchun 102 400 ta raqam kerak bo'ladi - bu hech narsani siqishdan ham yomonroq!

Biroq, bu raqamlarning aksariyati nolga teng ekanligini unutmang. Bundan tashqari, chiziqlar oxiridagi barcha nollarni tasvirni o'zgartirmasdan olib tashlash mumkin. Taxminan 26 000 ta raqam qoldi va bu deyarli 4 baravar kam!

Bu daraja shaxmat naqshlarining sirini o'z ichiga oladi. Biz ko'rgan boshqa effektlardan farqli o'laroq, bu naqshlarning ko'rinishi xato emas. Ular butun tasvirning qurilish bloklari. Tahrirlovchining har bir satrida aniq 64 ta raqam, 64 ta noyob naqshning intensivligiga mos keladigan diskret kosinus o'zgarishi (DCT) koeffitsientlari mavjud.

Bu naqshlar kosinus syujeti asosida tuzilgan. Mana, ulardan ba'zilari qanday ko'rinishga ega:

JPEG formati qanday ishlaydi
8 koeffitsientdan 64 tasi

Quyida barcha 64 naqshni ko'rsatadigan rasm mavjud.

JPEG formati qanday ishlaydi
(Interaktiv versiya - in original maqolalar).

Bu naqshlar alohida ahamiyatga ega, chunki ular 8x8 tasvirlarning asosini tashkil qiladi. Agar siz chiziqli algebrani yaxshi bilmasangiz, bu 8 ta naqshdan istalgan 8x64 tasvirni yaratish mumkinligini anglatadi. DCT - bu tasvirlarni 8x8 bloklarga bo'lish va har bir blokni ushbu 64 koeffitsientning kombinatsiyasiga aylantirish jarayoni.

Har qanday tasvir 64 ta o'ziga xos naqshdan iborat bo'lishi sehrga o'xshaydi. Biroq, bu Yerdagi istalgan joyni ikkita raqam bilan tasvirlash mumkin - kenglik va uzunlik [yarim sharlarni ko'rsatuvchi / taxminan. tarjima]. Biz ko'pincha Yer yuzasini ikki o'lchovli deb hisoblaymiz, shuning uchun bizga faqat ikkita raqam kerak. 8x8 rasm 64 o'lchamga ega, shuning uchun bizga 64 raqam kerak.

Bu siqilish nuqtai nazaridan bizga qanday yordam berishi hali aniq emas. Agar bizga 64x8 tasvirni ko'rsatish uchun 8 ta raqam kerak bo'lsa, nega bu 64 yorqinlik komponentini saqlashdan ko'ra yaxshiroq bo'ladi? Xuddi shu sababga ko'ra, biz uchta RGB raqamini uchta YCbCr raqamiga aylantirdik: bu bizga nozik tafsilotlarni olib tashlashga imkon beradi.

Ushbu bosqichda aniq qaysi tafsilot olib tashlanganligini ko'rish qiyin, chunki JPEG 8x8 bloklarga DCT qo'llaydi. Biroq, hech kim bizni butun rasmga qo'llashni taqiqlamaydi. Butun rasmga qo'llaniladigan Y komponenti uchun DCT qanday ko'rinishga ega:

JPEG formati qanday ishlaydi

60 000 dan ortiq raqamlar fotosuratda deyarli sezilarli o'zgarishlarsiz oxiridan olib tashlanishi mumkin.

JPEG formati qanday ishlaydi

Ammo shuni yodda tutingki, agar biz birinchi beshta raqamni nolga tushirsak, farq aniq bo'ladi.

JPEG formati qanday ishlaydi

Boshidagi raqamlar tasvirdagi past chastotali o'zgarishlarni ifodalaydi, bu bizning ko'zlarimiz eng yaxshi qabul qiladi. Oxirgi raqamlar yuqori chastotalardagi o'zgarishlarni ko'rsatadi, ularni sezish qiyinroq. "Ko'z ko'ra olmaydigan narsalarni ko'rish" uchun biz birinchi 5000 raqamni nol qilib, ushbu yuqori chastotali tafsilotlarni ajratib olishimiz mumkin.

JPEG formati qanday ishlaydi

Biz tasvirning pikseldan pikselgacha eng katta o'zgarish sodir bo'lgan barcha joylarini ko'ramiz. Mushukning ko'zlari, mo'ylovlari, terri adyol va pastki chap burchakdagi soyalar ajralib turadi. Dastlabki 10 000 ta raqamni nolga tenglashtirish orqali siz oldinga borishingiz mumkin:

JPEG formati qanday ishlaydi

20 000:

JPEG formati qanday ishlaydi

40 000:

JPEG formati qanday ishlaydi

60 000:

JPEG formati qanday ishlaydi

Ushbu yuqori chastotali tafsilotlar siqish bosqichida JPEG tomonidan o'chiriladi. Ranglarni DCT koeffitsientlariga aylantirishda hech qanday yo'qotish yo'q. Yo'qotish yuqori chastotali yoki nolga yaqin qiymatlar olib tashlangan namuna olish bosqichida sodir bo'ladi. JPEG saqlash sifatini pasaytirganingizda, dastur olib tashlangan qiymatlar soni uchun chegarani oshiradi, bu fayl hajmini kamaytiradi, lekin rasmni yanada pikselli qiladi. Shuning uchun birinchi bo'limdagi 57 marta kichikroq tasvir shunday ko'rinishga ega edi. Har bir 8x8 blok yuqori sifatli versiyaga nisbatan ancha kam DCT koeffitsientlari bilan ifodalangan.

Tasvirlarni bosqichma-bosqich uzatish kabi ajoyib effekt yaratishingiz mumkin. Siz ko'proq va ko'proq koeffitsientlar yuklab olinganda batafsilroq bo'ladigan loyqa rasmni ko'rsatishingiz mumkin.

Bu yerda, faqat o'yin-kulgi uchun, siz atigi 24 000 raqamdan foydalanasiz:

JPEG formati qanday ishlaydi

Yoki atigi 5000:

JPEG formati qanday ishlaydi

Juda xira, lekin qandaydir tarzda tanib olish mumkin!

3. Run uzunligi kodlash, delta va Huffman

Hozirgacha siqilishning barcha bosqichlari yo'qotilgan. Oxirgi bosqich, aksincha, yo'qotishlarsiz davom etadi. U ma'lumotni o'chirmaydi, lekin fayl hajmini sezilarli darajada kamaytiradi.

Ma'lumotni tashlamasdan qanday qilib biror narsani siqish mumkin? 700 x 437 o'lchamdagi oddiy qora to'rtburchakni qanday tasvirlashimizni tasavvur qiling.

JPEG buning uchun 5000 raqamdan foydalanadi, ammo ancha yaxshi natijalarga erishish mumkin. Bunday tasvirni iloji boricha kamroq baytda tasvirlaydigan kodlash sxemasini tasavvur qila olasizmi?

Men o'ylab topishim mumkin bo'lgan minimal sxema to'rttadan foydalanadi: uchtasi rangni ifodalash uchun va to'rtinchisi bu rangning nechta pikselini ko'rsatadi. Ushbu siqilgan shaklda takrorlanadigan qiymatlarni ifodalash g'oyasi ish uzunligi kodlash deb ataladi. Bu yo'qotishsiz, chunki biz kodlangan ma'lumotlarni asl shakliga qaytarishimiz mumkin.

Qora to'rtburchakli JPEG fayli 4 baytdan ancha katta - esda tutingki, DCT darajasida siqish 8x8 pikselli bloklarga qo'llaniladi. Shuning uchun, hech bo'lmaganda, har 64 piksel uchun bitta DCT koeffitsienti kerak. Bizga bitta kerak, chunki bitta DCT koeffitsientidan keyin 63 nolni saqlash o'rniga, ish uzunligini kodlash bizga bitta raqamni saqlashga imkon beradi va "barcha qolganlari nol" ekanligini ko'rsatadi.

Delta kodlash - bu har bir baytda mutlaq qiymatdan ko'ra ba'zi bir qiymatdan farq bo'lgan usul. Shuning uchun, ma'lum baytlarni tahrirlash barcha boshqa piksellarning rangini o'zgartiradi. Masalan, saqlash o'rniga

12 13 14 14 14 13 13 14

Biz 12 dan boshlashimiz va keyingi raqamni olish uchun qancha qo'shishimiz yoki ayirishimiz kerakligini ko'rsatishimiz mumkin. Delta kodlashda bu ketma-ketlik quyidagi shaklni oladi:

12 1 1 0 0 -1 0 1

O'zgartirilgan ma'lumotlar dastlabki ma'lumotlardan kichik emas, lekin uni siqish osonroq. Ishlash uzunligini kodlashdan oldin delta kodlashni qo'llash yo'qotishsiz siqish bo'lsa ham ko'p yordam berishi mumkin.

Delta kodlash 8x8 bloklardan tashqarida qo'llaniladigan kam sonli usullardan biridir. 64 DCT koeffitsientidan bittasi oddiygina doimiy to'lqin funksiyasi (to'liq rang). Yorqinlik komponentlari uchun har bir blokning o'rtacha yorqinligini yoki Cb komponentlari uchun o'rtacha ko'kligini va boshqalarni ifodalaydi. Har bir DCT blokining birinchi qiymati DC qiymati deb ataladi va har bir DC qiymati oldingilariga nisbatan delta kodlangan. Shuning uchun birinchi blokning yorqinligini o'zgartirish barcha bloklarga ta'sir qiladi.

Yakuniy sir qolmoqda: qanday qilib birlikni o'zgartirish butun rasmni butunlay buzadi? Hozirgacha siqilish darajalari bunday xususiyatlarga ega emas edi. Javob JPEG sarlavhasida joylashgan. Dastlabki 500 baytda tasvir haqidagi metama’lumotlar – kenglik, balandlik va hokazolar mavjud va biz ular bilan hali ishlaganimiz yo‘q.

Sarlavhasiz JPEG kodini dekodlash deyarli mumkin emas (yoki juda qiyin). Men sizga rasmni tasvirlamoqchi bo'lganimga o'xshayman va o'z taassurotimni etkazish uchun so'zlarni o'ylab topmoqchiman. Ta'rif, ehtimol, juda ixcham bo'ladi, chunki men aniq aytmoqchi bo'lgan ma'noga ega so'zlarni ixtiro qila olaman, ammo boshqalar uchun ular mantiqiy bo'lmaydi.

Bu ahmoqona tuyuladi, lekin aynan shunday bo'ladi. Har bir JPEG tasviri unga xos kodlar bilan siqiladi. Kod lug'ati sarlavhada saqlanadi. Ushbu uslub Huffman kodi, lug'at esa Huffman jadvali deb ataladi. Sarlavhada jadval ikki bayt bilan belgilanadi - 255 va keyin 196. Har bir rang komponenti o'z jadvaliga ega bo'lishi mumkin.

Jadvallardagi o'zgarishlar har qanday tasvirga tubdan ta'sir qiladi. Yaxshi misol - 15-qatorni 1 ga o'zgartirish.

JPEG formati qanday ishlaydi

Buning sababi, jadvallar alohida bitlarni qanday o'qish kerakligini belgilaydi. Hozirgacha biz faqat o'nlik ko'rinishdagi ikkilik sonlar bilan ishladik. Ammo bu bizdan shuni yashiradiki, agar siz baytda 1 raqamini saqlamoqchi bo'lsangiz, u 00000001 ga o'xshaydi, chunki har bir baytda to'liq sakkiz bit bo'lishi kerak, hatto ulardan bittasi kerak bo'lsa ham.

Agar sizda kichik raqamlar ko'p bo'lsa, bu joyni katta isrof qilishdir. Huffman kodi - bu har bir raqam sakkiz bitni egallashi kerak bo'lgan ushbu talabni engillashtirishga imkon beradigan texnikadir. Bu shuni anglatadiki, agar siz ikkita baytni ko'rsangiz:

234 115

Keyin, Huffman jadvaliga qarab, bu uchta raqam bo'lishi mumkin. Ularni ajratib olish uchun avval ularni alohida bitlarga bo'lishingiz kerak:

11101010 01110011

Keyin ularni qanday guruhlashni aniqlash uchun jadvalga qaraymiz. Masalan, bu birinchi olti bit (111010) yoki kasrda 58, keyin besh bit (10011) yoki 19 va nihoyat oxirgi to'rt bit (0011) yoki 3 bo'lishi mumkin.

Shuning uchun siqilishning ushbu bosqichida baytlarni tushunish juda qiyin. Baytlar ular ko'rinadigan narsani ifodalamaydi. Men ushbu maqolada jadval bilan ishlash tafsilotlariga kirmayman, lekin materiallar bu masala bo'yicha onlayn etarli.

Ushbu bilim bilan qilishingiz mumkin bo'lgan qiziqarli hiylalardan biri sarlavhani JPEG-dan ajratish va uni alohida saqlashdir. Darhaqiqat, faylni faqat siz o'qiy olishingiz mumkin. Facebook buni fayllarni yanada kichikroq qilish uchun qiladi.

Yana nima qilish mumkin - Huffman jadvalini biroz o'zgartirish. Boshqalar uchun bu buzilgan rasmga o'xshaydi. Va faqat siz uni tuzatishning sehrli usulini bilib olasiz.

Xulosa qilaylik: JPEG kodini dekodlash uchun nima kerak? Kerakli:

  1. Huffman jadval(lar)ni sarlavhadan chiqarib oling va bitlarni dekodlang.
  2. Har bir 8x8 blok uchun har bir rang va yorug'lik komponenti uchun diskret kosinus o'zgarishi koeffitsientlarini ajratib oling, teskari ish uzunligi va delta kodlash transformatsiyalarini bajaring.
  3. Har bir 8x8 blok uchun piksel qiymatlarini olish uchun kosinuslarni koeffitsientlar asosida birlashtiring.
  4. Agar quyi namuna olish amalga oshirilgan bo'lsa, rang komponentlarini masshtablang (bu ma'lumot sarlavhada).
  5. Olingan YCbCr qiymatlarini har bir piksel uchun RGB ga aylantiring.
  6. Tasvirni ekranda ko'rsating!

Mushuk bilan oddiygina fotosuratni ko'rish uchun jiddiy ish! Biroq, menga yoqadigan narsa shundaki, u JPEG texnologiyasi qanchalik insonga qaratilganligini ko'rsatadi. Bu bizning idrok etishimizning o'ziga xos xususiyatlariga asoslangan bo'lib, an'anaviy texnologiyalarga qaraganda ancha yaxshi siqilishga erishishga imkon beradi. Va endi biz JPEG qanday ishlashini tushunganimizdan so'ng, biz ushbu texnologiyalarni boshqa sohalarga qanday o'tkazish mumkinligini tasavvur qilishimiz mumkin. Masalan, videoda delta kodlash fayl hajmini sezilarli darajada qisqartirishni ta'minlaydi, chunki ko'pincha ramkadan freymga o'zgarmaydigan butun maydonlar mavjud (masalan, fon).

Maqolada foydalanilgan kod, ochiq va rasmlarni o'zingiznikiga almashtirish bo'yicha ko'rsatmalarni o'z ichiga oladi.

Manba: www.habr.com

a Izoh qo'shish