JPEG. Алгоритм стиснення

І знову здрастуйте! Я знайшов цю статтю, написану ще у травні 2019-го року. Це продовження серії статей про WAVE і JPEG. перша. Ця публікація включає інформацію про алгоритм кодування зображень і про сам формат в цілому.

Дрібку історії

Столову ложку статті з Вікіпедії:

JPEG (Joint Photographic Experts Group) - один з популярних растрових графічних форматів, що використовується для зберігання фотозображень та подібних до них зображень.

Розроблено цей стандарт був Об'єднаною групою експертів із фотографії ще 1991 року для ефективного стиснення зображень.

Який шлях проходять зображення від сирого вигляду до JPEG

Дехто вважає, що JPEG-картинки - стислі методом Хаффмана сирі дані, але це не так. Перед контрольним стиском дані проходять довгий шлях.

Спочатку колірну модель змінюють із RGB на YCbCr. Для цього навіть є спеціальний алгоритм. тут. Y не чіпають, тому що він відповідає за яскравість, і його зміна буде помітною.

Перше, що роблять із зображенням – це «проріджування» (Subsampling). Зрозуміти це просто: береться 2х2 масив пікселів, далі беруться Cb і Cr — середні значення кожного компонента YCbCr цих 4 пікселів. І так, ми виграли 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 пікселі по горизонталі та вертикалі. Перший варіант використовується найчастіше. Якщо важлива якість зображення, то проріджування не виконується взагалі.
Наочна ілюстрація проріджування (Хабр не дав вставити гіфку). https://i.ibb.co/Rg5Th9H/150953010617579181.gif

Основна частина підготовки

ДКП

Тепер найскладніша і найнеобхідніша частина. Вся картинка розбивається на блоки 8×8 (використовують заповнення у разі, якщо роздільна здатність не кратна стороні блоку).

Тепер до кожного блоку застосовують ДКП (Дискретно-косинусне перетворення). У цій частині з картинки виймають усе зайве. Використовуючи ДКП треба зрозуміти, чи описує цей блок (8×8) якусь монотонну частину зображення: неба, стіни; або він містить складну структуру (волосся, символи і т.д.). Не дивно, що 64 схожих за кольором пікселів можна описати всього одним, т.к. розмір блоку вже відомий. Ось вам і стиск: 1 до 64.

ДКП перетворює блок на спектр, і там, де показання різко змінюються, коефіцієнт стає позитивним, і що різкіше перехід, то вище буде вихід. Там, де коефіцієнт вищий, на зображенні зображені чіткі переходи в кольорі та яскравості, де він нижче – слабкі (плавні) зміни величин компонентів YCbCr у блоці.

Квантування

Тут вже використовуються установки стиснення. Кожен з коефіцієнтів у кожній із матриць 8×8 ділиться на певне число. Якщо якість зображення після всіх його модифікацій ви більше не зменшуватимете, то дільник повинен бути одиницею. Якщо вам важливіше пам'ять, яку займає ця фотографія, то дільник буде більше 1, і приватне округляється. Так виходить, що після округлення нерідко виходить багато нулів.

Квантування роблять для створення ще більшого стиску. Ось як це виглядає з прикладу квантування графіка y = sin(x):

JPEG. Алгоритм стиснення

стиснення

Спочатку проходимо по матриці зиг-загом:

JPEG. Алгоритм стиснення

Отримуємо одновимірний масив з числами. Ми бачимо, що в ньому багато нулів, їх можна забрати. Для цього замість послідовності з множини нулів ми вписуємо 1 нуль і після нього число, що позначає їх кількість у послідовності. Таким чином, можна скинути до 1/3 розміру всього масиву. А далі просто стискає цей масив методом Хаффмана та вписуємо вже у сам файл.

де використовується

Скрізь. Як і PNG, JPEG використовується у фотокамерах, OS'ях (як логотипи компанії, іконок додатків, thumbnail'ів) і у всіх можливих сферах, де потрібно ефективно зберігати зображення.

Висновок

Зараз знання про JPEG сьогодні цінні лише в освітніх цілях, адже він вже скрізь вбудований і оптимізований великими групами людей, але граніт науки все-таки смачний.

Джерела

Стаття про YCbCr на Вікіпедії
Стаття про JPEG на Вікіпедії
Трохи про ДКП з поста Пікабу
Стаття про ДКП на Вікіпедії

Джерело: habr.com

Додати коментар або відгук