Как работает формат JPEG?
Рассмотрим технологии сжатия JPEG и о том, за счёт чего достигаются столь сильные степени сжатия.
JPEG-сжатие.Стандарт JPEG это стандарт сжатия растровых изображений, основанный на принципе восприятия цвета человеком. Исследования показали, что человек легче воспринимает цветовые плоскости и контрастные границы между ними и труднее различает тонкие светотеневые эффекты и незначительные изменения цветовых оттенков. В связи с этим алгоритм JPEG-сжатия предполагает сжатие изображения путем сокращения оттенков цветов.
JPEG-сжатие происходит следующим образом: переведенное в цветовую гамму HSB-изображение делится на квадраты 8x8 пикселей, далее рассматривается средняя освещенность каждого квадрата, которая вычисляется прямым преобразованием по функции косинус. Далее более высокие, не воспринимаемые глазом цветовые оттенки отбрасываются, а градиентные и плавные переходы заменяются на более однородные. Часто этот формат называют форматом с “потерей качества”, т.к. те данные, которые были отброшены, впоследствии не восстанавливаются. Но при компрессии пользователь сам может определить коэффициент сжатия (20:1, 25:1), что позволяет достичь необходимого качества при максимально возможном сжатии.
Процесс сжатия по схеме JPEG состоит из нескольких шагов. На первом шаге производится преобразование изображения из цветового пространства RGB в пространство YUV, основанное на характеристиках яркости и цветности. Вся дальнейшая работа производится именно с этим цветовым пространством, которое благодаря некоторым своим характеристикам позволяет получать нам столь большие степени сжатия.
Что же такого необычного в YUV представлении цвета по сравнению с RGB? То, что оно наиболее близко к "естественному", тому, которое неосознанно выполняет человек. Y-компонента, или яркость, тесно связана с качеством картинки. Точнее сказать, Y - это и есть картинка, только чёрно-белая. Компоненты U и V содержат информацию о цвете и позволяют нам раскрашивать Y-картинку.
На следующем после преобразования шаге изображение разделяется на квадратные участки размером 8х8 пикселей. После этого над каждым участком производится т.н. дискретное косинус-преобразование (ДКП). При этом выполняется анализ каждого блока, разложение его на составляющие цвета и подсчёт частоты появления каждого цвета.
Человеческий глаз устроен таким образом, что наиболее чувствителен именно к яркостной составляющей изображения (Y-компонента) и наименее чувствителен к цветовым. Причина этого феномена лежит в физиологии. Зрачок представляет собой оптическую линзу, которая фокусирует изображение на глазное дно, покрытое палочками и колбочками. Палочки - это сенсоры, воспринимающие именно яркостную составляющую, а колбочки - цветовую. Причём палочек на порядок больше, чем колбочек, и они гораздо более чувствительны к свету. Вечером все теряет цвет именно из-за того, что количества падающего на зрачок света не хватает для того, чтобы вызвать реакцию колбочки. Но и чувствительность человеческого глаза к разным цветам тоже величина непостоянная. Зрачок более чувствителен к нижней части цветового спектра, нежели к верхней. Формат JPEG как раз и учитывает эти особенности.
Анализируя частотную информацию о появлении цветов, удаётся избавиться от части информации уже в процессе квантования. При этом цвета в верхней части спектра исключаются, что практически не сказывается на зрительном восприятии образа. Также исключается часть яркостной информации. Грубо говоря, JPEG просто отбрасывает от яркостной составляющей половину полезного сигнала, а от цветовой - 3/4. Это, конечно, примерно, т.к. существуют градации и более сложные схемы сжатия.
Количество информации, исключаемой при сжатии, зависит от требуемого качества изображения. При максимально-высоких уровнях сжатия детали полностью стираются, и блок становится серым. При средних и низких уровнях сжатия в файле сохраняется примерная информация о цвете данного участка. Величина этой "примерности" напрямую зависит от степени сжатия. Нужно помнить, что в отличие от обычных форматов, сохраняющих изображение поточечно, JPEG сохраняет примерные цвета. Если говорить научным языком, то JPEG использует для сохранения ряды Фурье и при больших степенях сжатия просто отбрасывает члены ряда высшего порядка. И каждый раз при воспроизведении изображения на экране компьютер производит синтез. Причём достаточно ресурсоемкий и заметный на медленных компьютерах. Из этого следует одно замечание - если Вы сохранили какой-нибудь рисунок в формате JPEG, то восстановить его обратно до последнего пикселя невозможно! Именно из-за этого формат называется "форматом с потерями", и именно поэтому не рекомендуется пересжимать JPEG-изображения, т.к. они обязательно станут хуже.
Информация о яркости и цвете затем кодируется так, что сохраняются только отличия между соседними блоками. В результате блоки представляются строками чисел, которые можно сжимать дальше. В результате обработки блоки содержат много нулей, последняя стадия кодирования (выполняемая по алгоритму Хаффмана - подобного тому, что применяется в архиваторах) даёт хорошие результаты. Сжимать JPEG-файл архиватором не имеет никакого смысла, ведь он уже сжат. Полученный архив наверняка будет больше по размеру, чем исходная фотография.
Таким образом, первоначальные 24 бита на элемент изображения или 1536 бит (192 байта) на блок превращаются в горстку бит, которые описывают зрительные характеристики всего участка изображения.