Урок #5. Сжатие данных с потерями. JPEG и MP3
Почему файл фотографии в BMP весит 50 МБ, а тот же снимок в JPEG - всего 2 МБ? Куда делись данные? Ответ: существуют алгоритмы, которые удаляют часть информации, не критичную для восприятия. С точки зрения данных это потери, с точки зрения человека - картинка выглядит так же. Разберём, как это работает в JPEG и MP3.
1. Что такое сжатие с потерями
Сжатие с потерями - это уменьшение объёма данных, при котором распакованный файл отличается от оригинала. Часть информации удаляется безвозвратно: восстановить её из архива уже невозможно.
Применяется там, где важны объём и скорость передачи, а не побитовая точность:
- фотографии и изображения в интернете;
- музыка и подкасты;
- видео, стриминг, видеозвонки;
- голосовые сообщения в мессенджерах.
Напомним: на прошлых уроках мы разобрали алгоритм Хаффмана и алгоритм LZW - это сжатие без потерь. После распаковки они дают файл байт-в-байт идентичный исходному. Но их возможности ограничены энтропией источника: случайные или очень богатые данные так сжать не получится. Lossy-алгоритмы идут дальше - они выбрасывают то, что человек всё равно не заметит.
2. Несовершенство восприятия
Основа lossy-сжатия - психофизиология. Наши глаза и уши устроены не идеально, и этим пользуются алгоритмы.
Зрение
- Мы отлично различаем яркость - контуры, тени, переходы света.
- Гораздо хуже различаем оттенки цвета, особенно мелкие детали.
- Не замечаем крошечных изменений в однородных областях изображения.
Слух
- Не слышим частоты ниже 20 Гц и выше 20 кГц.
- Громкий звук «маскирует» тихие соседние частоты - их просто не слышно.
- На низких частотах плохо определяем направление звука.
3. Алгоритм JPEG
JPEG (Joint Photographic Experts Group) - стандарт сжатия фотографий и изображений с плавными переходами цветов. Разработан в 1992 году, до сих пор остаётся самым распространённым форматом фотографий.
Область применения: фотографии, градиенты, портреты, пейзажи. Формат JPEG плохо подходит для чертежей, схем, скриншотов и текста - об этом поговорим в разделе про артефакты.
4. Цветовое пространство YCbCr
В цветовой модели YCbCr компоненты Cb и Cr - это цветоразностные сигналы (хроматические компоненты). Они отвечают за информацию о цвете, отделяя её от информации о яркости. Cb (Chroma Blue) - это «синее отклонение» или разность по синему каналу (blue-difference chroma). Он показывает, насколько цвет пикселя смещен в сторону синего или желтого относительно нейтрального серого. Cr (Chroma Red) - это «красное отклонение» или разность по красному каналу (red-difference chroma). Он показывает смещение цвета в сторону красного или голубого (цианового). Как это работает на практике Если представить, что мы смотрим на черно-белую фотографию, мы видим только яркость (Y). Чтобы превратить её в цветную, нам нужно добавить информацию о том, «в какой цвет покрасить» серые участки. Если Cb положительный, а Cr отрицательный - участок станет синеватым. Если Cr положительный, а Cb отрицательный - участок станет красноватым. Если и Cb, и Cr равны нулю (или 128 в 8-битном кодировании) - пиксель будет оттенком серого, независимо от значения Y. Математическая логика Компоненты Cb и Cr вычисляются как разность между синим (или красным) каналом исходной модели RGB и яркостью Y. Зеленый цвет (G) отдельно не передается - он восстанавливается математически при декодировании на основе значений Y, Cb и Cr. Зачем это нужно (связь с JPEG) Эта модель построена на особенностях человеческого зрения. Глаз очень хорошо замечает детали в яркости (Y), но плохо различает оттенки цвета (Cb, Cr) на мелких деталях. Именно поэтому алгоритмы сжатия, такие как JPEG, позволяют себе «прореживать» компоненты Cb и Cr (усреднять их значения для соседних пикселей), почти не трогая компонент Y. Мы не замечаем, что на синем небе или красном лице цвет стал чуть более однородным, но замечаем любую потерю четкости в контурах (яркости). Это и позволяет достигать высокого сжатия при сохранении визуального качества. Важное уточнение про гамма-коррекцию В профессиональной литературе часто встречается запись Y'CbCr (с апострофом). Апостроф означает, что яркость Y' закодирована нелинейно с помощью гамма-коррекции, чтобы соответствовать особенностям работы кинескопов старых телевизоров и современных мониторов. В контексте школьного курса информатики и базового объяснения JPEG разницу между Y и Y' обычно опускаютПервый шаг JPEG - перевод изображения из модели RGB (красный, зелёный, синий) в модель YCbCr. Вместо трёх цветовых каналов алгоритм получает один канал яркости и два канала цветности.
Y = 0,299 · R + 0,587 · G + 0,114 · BБуква Y означает Luma - яркость, то есть интенсивность света, воспринимаемую глазом. Формула показывает, какой вклад каждый цветовой канал вносит в общую яркость.
Физиологический смысл коэффициентов
В сетчатке глаза есть два типа фоторецепторов: палочки (отвечают за свет и тень) и колбочки (отвечают за цвет). Эволюционно мы лучше всего приспособлены замечать изменения в зелёном спектре (растительность, лица людей в тени) и хуже всего - в синем (он кажется нам более тёмным и размытым).
- 0,587 (зелёный): самый большой вес - глаз максимально чувствителен к нему.
- 0,299 (красный): средний вес.
- 0,114 (синий): самый маленький вес - глаз почти не реагирует на изменения синего как на источник яркости.
Если сложить эти числа (0,299 + 0,587 + 0,114), получится ровно 1,0. Это значит, что формула вычисляет средневзвешенное значение.
Пример расчёта
Чистый ярко-красный пиксель в модели RGB: R = 255, G = 0, B = 0.
Подставляем в формулу:
Y = 0,299 · 255 + 0,587 · 0 + 0,114 · 0 = 76,245
Для сравнения, чисто белый пиксель (255, 255, 255) даст: Y = 255. Получается, что ярко-красный цвет воспринимается глазом как имеющий примерно 30 % (76 из 255) от максимальной возможной яркости белого, хотя в самом красном канале значение максимальное.
5. Четыре шага JPEG
Шаг 1. Перевод в YCbCr
Каждый пиксель изображения из формы (R, G, B) превращается в тройку (Y, Cb, Cr). Дальше алгоритм работает с этими тремя каналами независимо.
Шаг 2. Прореживание (chroma subsampling)
Глаз плохо видит цвет мелких деталей. Поэтому для блока пикселей сохраняется яркость для каждого пикселя, а цветовые компоненты Cb и Cr усредняются по группе пикселей. Объём данных о цвете сокращается без видимой потери качества.
Как читать запись «4:4:4» и «4:2:0»
Три числа через двоеточие - это условная запись соотношения. Первое число (всегда 4) - размер опорного блока по горизонтали, к которому приводятся остальные. Два других числа - сколько значений яркости Y и цветности Cb / Cr сохраняется на этот блок.
Проще: в блоке из 4 пикселей по горизонтали - сколько замеров яркости и сколько замеров цвета мы для них храним.
Схема 4:4:4 - без прореживания
Каждому пикселю - своё значение яркости и своё значение цветности.
Пиксели: P1 P2 P3 P4 Y: Y1 Y2 Y3 Y4 ← 4 значения яркости Cb: Cb1 Cb2 Cb3 Cb4 ← 4 значения синевы Cr: Cr1 Cr2 Cr3 Cr4 ← 4 значения красноты
Итого на 4 пикселя: 4 + 4 + 4 = 12 значений. Это режим без потерь цветности, но и без выигрыша в объёме. Используется в профессиональной обработке - например, при экспорте в высоком качестве для печати.
Схема 4:2:2 - прореживание по горизонтали вдвое
Яркость сохраняется для каждого пикселя, а цветность - только для пар соседних пикселей по горизонтали.
Пиксели: P1 P2 P3 P4 Y: Y1 Y2 Y3 Y4 ← 4 значения яркости Cb: Cb12 Cb34 ← 2 значения синевы Cr: Cr12 Cr34 ← 2 значения красноты
Итого: 4 + 2 + 2 = 8 значений вместо 12. Экономия: (12 − 8) / 12 = 33 %. Пиксели P1 и P2 используют одно общее значение синевы Cb12 и одно общее значение красноты Cr12. То же для пары P3 и P4.
Схема 4:2:0 - прореживание и по горизонтали, и по вертикали
Яркость - для каждого пикселя. Цветность - одна на блок 2×2 (четыре пикселя).
Блок 2×2:
P1 P2
P3 P4
Y: Y1 Y2 ← 4 значения яркости
Y3 Y4
Cb: один Cb на весь блок ← 1 значение
Cr: один Cr на весь блок ← 1 значение
Итого: 4 + 1 + 1 = 6 значений вместо 12. Экономия: (12 − 6) / 12 = 50 %.
Почему называется 4:2:0, а не 4:1:1? Историческая особенность нотации. Логически было бы 4:1:1 (четыре Y, одна Cb, одна Cr). Но в стандарте запись «0» во второй позиции означает, что по вертикали цветность тоже прореживается: по горизонтали - в 2 раза, по вертикали - в 2 раза, итого в 4 раза по площади. Отсюда 4 значения Y и по 1 значению Cb и Cr.
Именно 4:2:0 - стандарт JPEG. Так сохраняют практически все фотографии в интернете.
Сводная таблица
| Схема | Y (яркость) | Cb | Cr | Всего значений на 4 пикселя | Экономия |
|---|---|---|---|---|---|
| 4:4:4 | 4 | 4 | 4 | 12 | 0 % |
| 4:2:2 | 4 | 2 | 2 | 8 | −33 % |
| 4:2:0 | 4 | 1 | 1 | 6 | −50 % (стандарт JPEG) |
Почему это работает и не портит картинку
Глаз человека устроен так: мы отлично различаем яркость (границы, контуры, светотени) и плохо - мелкие цветовые переходы. Если бы мы проредили яркость, картинка сразу стала бы размытой. А если проредить цветность - глазу почти не за что зацепиться: мелкие оттенки он всё равно не различает.
Пример на конкретных пикселях
Возьмём блок из 4 пикселей, у которых яркость разная, а цвет почти одинаковый (например, кожа на лице):
Пиксель: P1 P2 P3 P4 Оттенок: беж беж беж беж ← глаз не видит разницы Светлота: тёмн. средн. средн. светл. ← глаз различает хорошо
Схема 4:4:4 сохранит 4 разных значения оттенка - лишняя информация, глаз их не различит.
Схема 4:2:0 сохранит 1 общее значение оттенка для всего блока (то самое «беж») и 4 разных значения светлоты. Визуально изображение не изменилось, но данных стало в 2 раза меньше.
Итог по записи «4:x:x»
| Число в нотации | Что означает |
|---|---|
4: x : x | размер опорного блока (всегда 4 пикселя по горизонтали) |
x : 4 : x | сколько замеров яркости Y приходится на блок |
x : x : 4 | сколько замеров цветности Cb/Cr приходится на блок |
То есть 4:4:4 - «на каждые 4 яркости - 4 цвета», 4:2:2 - «на каждые 4 яркости - 2 цвета», 4:2:0 - «на каждые 4 яркости - 1 цвет» (по горизонтали и вертикали). Чем меньше цветовых замеров - тем меньше файл и тем незаметнее для глаза потеря. Для JPEG стандартом стало 4:2:0: половина данных о цвете выбрасывается, но картинка выглядит как исходная.
Шаг 3. Дискретное косинусное преобразование (ДКП)
Изображение разбивается на блоки 8×8 пикселей. Каждый блок переводится из пространственной области в частотную: вместо 64 значений яркости мы получаем 64 коэффициента для разных частот.
- Низкие частоты - общая форма, плавные переходы.
- Высокие частоты - мелкие детали, шум, резкие границы.
Затем идёт квантование: каждый коэффициент делится на определённое число (из таблицы квантования) и округляется. Высокочастотные коэффициенты становятся нулями и отбрасываются. Именно на этом шаге происходит необратимая потеря информации. Уровень сжатия в JPEG регулируется как раз таблицей квантования - чем грубее деление, тем меньше файл и хуже качество.
Шаг 4. Кодирование
Оставшиеся коэффициенты сжимаются без потерь: сначала алгоритмом RLE (кодирование повторов, поскольку после квантования много нулей), затем алгоритмом Хаффмана. То есть lossy-алгоритм JPEG внутри использует lossless-сжатие - так уменьшается объём уже «прореженных» данных.
6. Алгоритм MP3
MP3 (MPEG-1 Audio Layer III) - стандарт сжатия цифрового звука, разработан в 1993 году. Опирается на психоакустическую модель - математическое описание того, как человек слышит звук.
Три ключевые идеи
- Маскировка. Громкий звук на одной частоте «маскирует» (делает неслышимыми) тихие звуки на близких частотах. Алгоритм находит такие зоны спектра и просто удаляет оттуда данные.
- Отсечение. Человеческое ухо не слышит звуки ниже 20 Гц и выше 20 кГц. Алгоритм их отсекает.
- Стереоэффект. На низких частотах ухо не определяет направление звука, поэтому для них стереоканалы объединяются в один. Данных становится вдвое меньше - а на слух это незаметно.
Битрейт - главный параметр качества
Битрейт (bitrate) - количество бит, используемых для кодирования одной секунды звука. Чем выше битрейт, тем лучше качество и больше файл.
Расчёт: сколько весит одна секунда CD-звука
Стандарт CD: частота дискретизации 44 100 Гц, разрядность 16 бит, 2 канала (стерео).
44 100 · 16 · 2 = 1 411 200 бит = 1375 Кбит в секунду.
MP3 с битрейтом 256 Кбит/с сжимает этот объём в 5,4 раза: 1375 ÷ 256 ≈ 5,4. При этом звук на 256 Кбит/с для большинства людей неотличим от CD-качества.
| Битрейт MP3 | Степень сжатия | Качество |
|---|---|---|
| 320 Кбит/с | 4,3× | Максимальное, почти неотличимо от CD |
| 256 Кбит/с | 5,4× | Отличное, стандарт для аудиофилов |
| 192 Кбит/с | 7,2× | Хорошее, годится для большинства музыки |
| 128 Кбит/с | 10,7× | Приемлемое, стандарт стриминга 2010-х |
| 64 Кбит/с | 21× | Для подкастов и голоса |
| 32 Кбит/с | 43× | Телефонное качество, только речь |
Почему MP3 «звучит как CD» при 256 Кбит/с
Разница заметна только на хорошей аппаратуре (студийные наушники, дорогая акустика) и при внимательном прослушивании. На смартфоне в метро или в наушниках за 500 рублей - неотличимо. Именно поэтому MP3 стал стандартом 2000-х, а сегодня ему на смену пришёл более эффективный Opus: он даёт то же качество при битрейте в 1,5–2 раза ниже.
7. Артефакты и когда не нужны потери
Артефакты JPEG
При сильном сжатии на изображении появляются характерные дефекты:
- Блочность - изображение распадается на видимые квадраты 8×8 (границы блоков ДКП).
- «Лесенка» - резкие диагональные линии становятся зубчатыми.
- Ореолы - светящиеся контуры вокруг контрастных границ.
- Размытие мелких деталей - текстуры теряют чёткость.
Артефакты MP3
- «Металлический» оттенок на тарелках и высоких частотах.
- «Бульканье» на сложных звуках (например, оркестр).
- Смазанная атака - момент удара по струне или барабану звучит менее резко.
RAW vs JPEG для фотографа
Профессиональные фотографы сохраняют исходники в RAW - это «сырые» данные с матрицы камеры без потерь. Обработка (цветокоррекция, ретушь, экспозиция) делается уже при экспорте. Сжатие с потерями применяется только на финальном этапе - для публикации в сети или печати.
Причина проста: если сохранить сразу в JPEG и потом ещё раз отредактировать, каждое пересохранение применяет новую порцию сжатия с потерями, и артефакты накапливаются.
Что такое кодек
Кодек (codec) - программный или аппаратный модуль, который выполняет кодирование и декодирование данных. Название происходит от английских слов COder/DECoder. JPEG, MP3, H.264, AV1 - всё это кодеки.
8. Итоги
Сжатие с потерями - это компромисс. Мы обмениваем точность данных на размер файла. Такой обмен оправдан, когда итоговый результат воспринимает человек: фотографию смотрит глаз, музыку слушает ухо. Там, где информация обрабатывается машиной или важна для дальнейшего редактирования, сжатие с потерями неприменимо.
В основе JPEG и MP3 лежит одна и та же идея: математическая модель человеческого восприятия. JPEG использует модель зрения (чувствительность к яркости выше чувствительности к цвету), MP3 - модель слуха (маскировка громкими звуками тихих, отсечение неслышимых частот). Дальше идут уже знакомые инструменты: ДКП, RLE, кодирование Хаффмана - то есть сжатие без потерь.
Вопросы для обсуждения
- Почему для чертежей, схем и скриншотов с текстом нельзя использовать JPEG, а лучше использовать PNG? (Ответ: JPEG создаёт артефакты вокруг чётких линий и букв, делая их нечитаемыми, так как алгоритм рассчитан на плавные переходы и фотографии.)
- Если вы фотограф, в каком формате вы сохраните исходники съёмки и почему? (Ответ: в RAW или PNG, чтобы не терять информацию. Сжатие с потерями применяется только на финальном этапе для публикации в сети.)
- Что такое кодек? (Ответ: программный или аппаратный модуль, выполняющий кодирование и декодирование - COder/DECoder.)
- Почему JPEG сначала переводит изображение из RGB в YCbCr, а не сжимает каналы RGB напрямую? (Ответ: потому что глаз чувствительнее к яркости Y, чем к цветности Cb и Cr - их можно прореживать в 2–4 раза без видимой потери качества.)
- Во сколько раз MP3 с битрейтом 128 Кбит/с сжимает CD-звук? (Ответ: 1375 / 128 ≈ 10,7 раз.)
Подсказка: одна минута MP3 при 128 Кбит/с весит примерно 0,94 МБ. Сколько таких минут в 4 ГБ?