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) авсан. 2х2 хэмжээтэй ч гэсэн 2:1 шахалтын харьцаатай алдагдалтай шахалт нь хатуу сонсогддог. Энэ нь бүхэл бүтэн зурагт хамаарна. Тэгээд л - тэд хагас хэмжээгээр буурсан. Мөн бид өнгөний мэдрэмжийнхээ ачаар энэ техникийг ашиглаж болно. Хэрэв хүн жижиг блок пиксел дээр дундажласан бол өнгөний хувьд биш харин тод байдлын ялгааг амархан анзаарах болно. Нимгэнжүүлэх ажлыг мөн шугамаар, хэвтээ ба босоо байдлаар 4 пикселээр хийж болно. Эхний сонголтыг илүү олон удаа ашигладаг. Хэрэв зургийн чанар чухал бол хасалтыг огт хийдэггүй.
Нимгэнжүүлэх дүрслэл (Хабр надад gif оруулахыг зөвшөөрөөгүй) - https://i.ibb.co/Rg5Th9H/150953010617579181.gif

Бэлтгэл ажлын гол хэсэг

БЭЛТГЭЛ

Одоо хамгийн хэцүү, хамгийн хэрэгтэй хэсэг ирлээ. Зургийг бүхэлд нь 8х8 блок болгон хуваасан (нарийн нягтрал нь блокийн талаас олон дахин биш бол дүүргэхийг ашиглана).

Одоо блок бүрт хэрэглээрэй DCT (Дискрет косинусын хувиргалт). Энэ хэсэгт шаардлагагүй бүх зүйлийг зургаас хассан болно. DCT ашиглан та өгөгдсөн блок (8 × 8) нь зургийн аль нэг монотон хэсгийг дүрсэлсэн эсэхийг ойлгох хэрэгтэй: тэнгэр, хана; эсвэл энэ нь нарийн төвөгтэй бүтэц (үс, тэмдэг гэх мэт) агуулдаг. Ижил өнгөтэй 64 пикселийг ердөө 1-ээр дүрслэх нь логик юм, учир нь блокийн хэмжээ аль хэдийн тодорхой болсон. Шахалтын хувьд маш их: 64-ээс 1.

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

Тоо хэмжээ

Шахалтын тохиргоог энд аль хэдийн хэрэгжүүлсэн. 8х8 матриц тус бүрийн коэффициент тус бүрийг тодорхой тоонд хуваана. Хэрэв та бүх өөрчлөлтийн дараа зургийн чанарыг бууруулахгүй бол хуваагч нь нэг байх ёстой. Хэрэв энэ зурганд байгаа санах ой таны хувьд илүү чухал бол хуваагч нь 1-ээс их байх ба хуваагч нь дугуйрсан байх болно. Бөөрөнхийлсний дараа та ихэвчлэн олон тэгтэй байдаг.

Илүү их шахах боломжийг бий болгохын тулд тоон тооцооллыг хийдэг. y = sin(x) графикийг квантчлах жишээг ашиглавал дараах байдалтай байна.

JPEG. Шахалтын алгоритм

Шахалт

Эхлээд бид матрицыг зиг-заг хэлбэрээр дамжуулна.

JPEG. Шахалтын алгоритм

Бид тоо бүхий нэг хэмжээст массивыг авдаг. Үүнд маш олон тэг байгаа тул тэдгээрийг арилгах боломжтой гэдгийг бид харж байна. Үүнийг хийхийн тулд бид олон тэгийн дарааллын оронд 1 тэг, дараа нь тэдгээрийн тоог харуулсан тоог оруулна. Ингэснээр та бүх массивын 1/3 хэмжээг дахин тохируулах боломжтой. Тэгээд бид зүгээр л энэ массивыг Huffman аргыг ашиглан шахаж файл руугаа бичнэ.

Хаана ашигладаг вэ?

Хаа сайгүй. PNG-н нэгэн адил JPEG нь камер, үйлдлийн систем (компанийн лого, програмын дүрс, өнгөц зураг гэх мэт) болон зургийг үр дүнтэй хадгалах шаардлагатай бүх хэсэгт ашиглагддаг.

дүгнэлт

Одоогийн байдлаар JPEG-ийн талаарх мэдлэг нь зөвхөн боловсролын зорилгоор л үнэ цэнэтэй, учир нь үүнийг хаа сайгүй суулгаж, олон тооны хүмүүс оновчтой болгосон боловч шинжлэх ухааны боржин чулуу нь амттай хэвээр байна.

Эх сурвалжууд

Wikipedia дээрх YCbCr-ийн тухай нийтлэл
JPEG дээрх Википедийн нийтлэл
Пикабугийн нийтлэлээс PrEP-ийн талаар бага зэрэг
PrEP-ийн Wikipedia нийтлэл

Эх сурвалж: www.habr.com

сэтгэгдэл нэмэх