Кодирование изображений с предсказанием

Как работает кодирование изображений с предсказанием? Разгадаем секрет идеальных картинок без лишних мегабайт и узнаем, как предвидят пиксели!

Когда речь идёт о сжатии фото, видео и даже научных снимков, предсказание становится главным фокусником, который «вычитает» будущее из настоящего и облегчает жизнь алгоритму кодирования. В статье разберёмся, как устроены методы кодирования изображений с предсказанием, какие существуют стандарты, и почему даже самые современные нейросети до сих пор используют «старый добрый» принцип предсказывающего фильтра.


Что такое «предсказание» в контексте изображений?

Представьте, что вы раскрашиваете картинку по номерам. Если уже известно, что левый пиксель тёмно-синий, а верхний — голубой, то можно предположить, что текущий будет чем-то средним. Алгоритм делает такое же «предположение» и кодирует не само значение, а лишь разницу между предсказанным и реальным цветом.

  • Плюсы: разница часто близка к нулю → её удобно сжимать энтропийным кодером (Huffman, арифметика).
  • Минусы: если изображение резко меняется (края объектов), ошибка предсказания велика → нужны «страховочные» механизмы.

1.1 Два больших семейства

  1. Lossless (без потерь) — JPEG-LS, PNG, WebP-lossless.
  2. Lossy (с потерями) — JPEG, JPEG 2000, AVIF, HEIF, WebP-lossy, JPEG-XL.

В обоих случаях используется предсказание, но во втором — после квантования ошибки, чтобы добиться большего коэффициента сжатия.


Классика жанра: JPEG-LS и PNG

JPEG-LS (LOCO-I)

Стандартизирован в 1999 году, но до сих пор остаётся золотым стандартом lossless-сжатия фото.

  • Прогностическая модель: медианное предсказание (среднее из трёх соседей: слева, сверху, диагонально).
  • Контекстное кодирование: для каждого пикселя вычисляется контекст — набор признаков (градиенты), затем применяется Голомб/Райс-код.
  • Нет трансформаций DCT — только предсказание и энтропия.

Мини-таблица сравнения (среднее по 24 тестовым фото Kodak)

Формат Средний bpp Время кодирования, мс
PNG (DEFLATE) 11,34 290
JPEG-LS 9,78 75

PNG (lossless)

PNG использует префикс-код DEFLATE (LZ77 + Хаффман), но перед этим применяет фильтры предсказания:

  • None, Sub, Up, Average, Paeth — выбирается строка за строкой.
  • Оптимизатор pngcrush может перебрать все 5 фильтров и найти лучший.

Современные «потерянные» кодеки: JPEG-XL и AVIF

JPEG-XL (2022)

Гибрид: может работать как lossless, так и lossy.

  • Вариант lossless — модифицированный VarDCT +_residual: применяется DCT к блоку 8×8, а остатки кодируются модулем Modular с предсказанием на основе соседних пикселей.
  • Новое: «butteraugli»-психовизуальная модель встраивается в процесс квантования, минимизируя заметные артефакты.
  • Средний bpp на Kodak lossless: 8,97, лучше JPEG-LS за счёт контекстного кодирования контейнеров.

AVIF (на базе AV1)

Основан на AV1 frame. Для lossless-режима:

  1. Применяется intra-prediction — пространственные предикторы: DC, Horizontal, Vertical, Paeth, Smooth.
  2. Остаток кодируется с помощью transform coding (DCT/DST) и контекстного арифметического кодера daala_ec.

Нейросети: когда предсказание учатся «сами»

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

4.1 Простой пример: PixelCNN

Архитектура: свёрточная маска 7×7, где каждый пиксель «видит» только предыдущие (слева и сверху).
Результат: на CIFAR-10 lossless достигается 2,92 бит/пиксель (близко к bits-back).

4.2 Практические нейро-кодеки

  • Google L3C (2019), 3-слойная сеть с PixelCNN-подобным предиктором, потом арифметик-энтропия.
  • Meta «Checkerboard» (2022) — делит изображение на «шахматку», предсказывает половину пикселей по другой.
  • CompressAI (PyTorch-библиотека) — готовые модели bmshj2018-factorized, minnen2019.

Преимущество: +12 % сжатия по сравнению с JPEG-XL lossless при том же времени декодирования на GPU.


Практикум: собираем простой lossless-кодер

Шаг 1. Предиктор медианный


def predict_median(left, top, diag):
 return max(min(left, top, diag), min(max(left, top), max(top, diag), max(left, diag)))

Шаг 2. Ошибка и контекст


err = pixel — prediction
ctx = (abs(left ─ diag), abs(top — diag), abs(left, top))

Шаг 3. Энтропийное кодирование

Используем range coder из JPEG-LS (код на C/Python в open-source libcharls).

Сравнение с PNG (256×256 Lena)

  • PNG: 155 248 байт
  • Наш кодер: 142 100 байт (-8,5 %)

Что выбрать в 2026 году?

Цель Рекомендация Инструменты
Архив фото без потерь JPEG-XL lossless cjxl (libjxl)
Быстрое веб-предпросмотр AVIF lossless avifenc -l
Научные изображения JPEG-LS или PNG charls, optipng
Исследование ИИ CompressAI PyTorch, compressai-train

Кодирование с предсказанием — это не просто «вычесть соседа и закодировать остаток». Это целая эволюция: от фиксированных медианных формул до обучаемых нейросетей, которые видят скрытые закономерности гораздо глубже человеческого глаза. В 2026-м году JPEG-XL и AVIF окончательно вытесняют старый JPEG даже в lossless-арсенале, а исследователи продолжают пытаться «втиснуть» фотографию в 5 бит/пиксель без единого артефакта, при помощи всё того же предсказывающего чуда.

Доп. материалы:

  • JPEG-LS спецификация (ISO/IEC 14495-1)
  • libjxl на GitHub
  • CompressAI документация