С развитием аппаратного обеспечения, поддерживающего высокое разрешение и богатую цветовую гамму, графические файлы значительно увеличились в раз-мерах. Профессиональные художники теперь, как правило, имеют дело с файла-ми, содержащими 10 и более мегабайт данных на каждое изображение. Даже пользователи с более скромными запросами подчас используют изображе-ния 640 на 480 пикселов в 256 цветах (а это более 300 килобайт). Кроме того, многие сейчас начинают работать с полноцветными изображениями 1024 на 768 пикселов (это более 2,3 мегабайт данных). Так как высококачественные изобра-жения встречаются все чаще и чаще, ограничения, накладываемые традицион-ными методами сжатия (например, LZW), становятся все более ощутимыми.
Для поиска лучшего способа сжатия изображений фотографического каче-ства две влиятельные международные организации по стандартизации: Interna-tional Telecommunications Union (ITU) и International Organization for Standar-tization (ISO) создали Joint Photographic Experts Group (JPEG, объединенная экспертная группа по фотографии).
Взгляд на JPEG
Имя: JPEG, JFIF (JPEG File Interchange Format)
Расширения: .jpeg, .jpg, .jfif
Используется для: работы с изображениями фотографического качества
Группа JPEG обобщила полувековой опыт исследований инженеров и уче-ных, работающих в компьютерной, телевизионной и многих других областях, связанных с человеческим зрением и компьютерной графикой. Заключительный отчет группы содержал детальные рекомендации, позволяющие впечатляюще уменьшить размеры файлов с изображениями фотографического качества. С тех пор сокращение "JPEG" используется как название этой техники сжатия. Кроме того, оно входит в названия некоторых использующих ее файловых форматов. Так, наиболее широко распространенный формат, известный как JPEG File Interchange Format (JFIF), стандартизирует один из простых методов размеще-ния сжатых с помощью алгоритма сжатия JPEG данных в файле. На самом деле большинство изображений "JPEG" правильнее называть "JFIF".
Имя JPEG указывает на метод сжатия, но не на формат файла. На самом деле метод сжатия JPEG используют как многочисленные мало различающиеся форматы, зачастую известные, как "JPEG", так и единичные радикально отли-чающиеся форматы, такие как TIFF и QuickTime. К счастью, все же большинст-во форматов, известных под именем "JPEG", крайне похожи, и скорее всего у вас не возникнет с этим проблем, однако всегда полезно отдавать себе отчет о возможных осложнениях.
Когда использовать JPEG
Я полагаю, что формат JPEG отличается от других графических форматов пре-жде всего тем, что он использует подход сжатия с "потерями". JPEG частично идентифицирует и удаляет ту информацию, которая несущественна для воспри-ятия изображения. В результате JPEG может достигать высокого уровня сжатия без заметных потерь в качестве изображения.
Подход сжатия "с потерями" имеет много реализации. JPEG достигает тако-го впечатляющего сжатия за счет отбрасывания той графической информации, которая обычно не проявляется в реальных изображениях. Однако при сжатии с помощью JPEG изображений с четкими контурами линии начинают заметно "дрожать". Так, например, если изображение содержит какие-либо подписи, то подобный эффект может возникнуть вокруг символов. Этот эффект может быть сведен к минимуму заданием очень высоких значений параметра качества, одна-ко при этом нельзя достичь приемлемых показателей сжатия. Вероятно, в буду-щем появится возможность задавать высокие значения параметра качества лишь для определенных фрагментов изображения. Это позволит вам задавать их только в областях, содержащих четкие контуры.
Как использовать JPEG
Так как JPEG - это сжатие с потерями, при создании файлов JPEG необходимо быть внимательным. Большинство программ, создающих такие файлы, позво-ляют вам задавать значение параметра качества (quality) изображения. Обычно оно варьирует от нуля до ста. Нижние значения позволяют при сжатии JPEG от-брасывать больше информации, в результате чего получаются файлы меньшего размера. В свою очередь, высокие значения ограничивают количество информа-ции, которой можно пренебречь во время сжатия (Одна из наиболее часто встречающихся ошибок заключается в интерпретации значения па-раметра качества от нуля до ста как процента сохраняемых данных. Чтобы развеять это заблуж-дение, некоторые современные программные продукты JPEG просто используют шкалу "лучшее сжатие" - "лучшее качество").
Хитрость заключается в том, чтобы при наименьшей величине параметра качества получить изображение без видимого ухудшения изображения. Обычно лучше начинать со средних значений и внимательно оценивать результат. Если вы отмечаете некоторое ухудшение, попробуйте увеличить это значение, если нет - попытайтесь его уменьшить. При просмотре изображения обращайте внимание на следующие моменты:
- Обращайте внимание на четкие очертания и углы, например, вокруг текста, или на контур детали изображения, выделяющейся на общем фоне. Часто заметно, что контур "смазан" или представляет собой "дрожащую" линию.
- Сжатие JPEG использует мозаику размером восемь на восемь пикселов. При задании слишком низких значений качества могут стать заметны ее границы.
Если у вас уже есть изображения в GIF или другом восьмиразрядном форма-те, возможно, вы захотите попробовать конвертировать их в JPEG. Несмотря на то, что это иногда все же приводит к уменьшению требуемого для хранения файлов пространства, в большинстве случаев игра не стоит свеч. Если вы все же хотите попытаться, начните с выяснения того, сколько цветов использует ваше изображение GIF. Если оно использует только 64 цвета, то конверсия вряд ли себя оправдает, так как изображение с такой бедной цветовой палитрой не имеет тех постепенных цветовых переходов, которые хорошо сжимает JPEG. В резуль-тате вы просто ухудшите качество изображения, не освободив места.
Одна из серьезных проблем конверсии изображений GIF в JPEG заключает-ся в том, что изображения в формате GIF, лимитированные набором из 256 или меньше цветов, часто используют клиширование (dithering - Дополнительные градации цветов получают за счет использования шаблонов. Шаблоны об-разуются за счет смешения пикселов базовой палитры. - Примеч. пер. ) и полутона (halftoning), в результате чего пикселы двух цветов смешиваются для получения эффекта третьего тона. В результате использования этой техники образуются шаблоны, крайне плохо сжимаемые с помощью JPEG. Отдельные программы позволяют вам усреднять значения этих шаблонов, "смягчая", таким образом, изображение до преобразования, в результате чего сжатие с помощью JPEG оказывается более эффективным.
Как распознать файлы в формате JPEG
Любой поток данных (data stream) JPEG начинается с двух байт 255 и 232. Однако многие форматы JPEG помещают заголовок перед потоком данных, по-этому этот маркер не всегда можно найти в начале файла. Файлы JFIF пред-ставляют собой поток данных JPEG, поэтому они всегда начинаются с этого маркера. Кроме того, с седьмого с начала байта появляется идентификатор JFIF.
Как JFIF работает
Окончательный отчет группы JPEG был весьма обширным, но все же некоторые детали в нем были опущены. Прежде всего, это касалось разнообразных второ-степенных расширений. К счастью, большинство файловых форматов, исполь-зующих сжатие JPEG, как правило, опираются на документированный группой JPEG "базовый формат" (Baseline JPEG), вынося всю дополнительную инфор-мацию в заголовок. Хорошо написанные программы JPEG знают, каким обра-зом можно найти в файле начало данных "Baseline JPEG", игнорируя любую непонятную информацию, помещенную в заголовке.
Так как дополнительный заголовок зачастую просто игнорируется, боль-шинство популярных форматов JPEG очень просты. JPEG File Interchange Format (JFIF), разработанный C-Cube Systems, просто конкретизировал некото-рые неясности в стандарте, использовав преимущества модельного формата Baseline JPEG.
JFIF определяет некоторые, оставшиеся неуточненными в формате Baseline JPEG понятия. Одно из них - цветовая модель (color model). Ниже я расскажу о том, как JPEG для предоставления лучшего сжатия обыгрывает некоторые свой-ства цветовой модели. JFIF использует цветовую модель YCbCr, которая описы-вает цвет в терминах яркостной компоненты (lightness) и двух цветоразностных компонент (chromaticities) (СьСг). На рис. 16.1 и 16.2 показана связь между вось-миразрядной моделью RGB и моделью цветопередачи JFIF.
Y = 0.299R + 0.587G + 0.114В
Сь = -0.1687R - 0.3313G + 0.5В + 128
Cr = -0.5R - 0.4187G - 0.0813В + 128
Рис. 16.1. Преобразование RGB в систему цветопередачи JFIF
R = Y + 1.402(Сг - 128)
G = Y - 0.34414(Сь - 128) - 0.71414(Cr - 128)
B = Y+ 1.772(Сь - 128)
Puc. 16.2. Преобразование системы цветопередачи JFIF в RGB
Для хранения специальных данных Baseline JPEG использует некоторое ко-личество маркеров (markers). Каждый маркер начинается с двухбайтового кода, значение которого больше или равно 255. Некоторые маркеры также содержат данные. В этом случае вначале идет двухбайтовый счетчик, а затем соответст-вующие данные. (Отметим, что значение счетчика включает два байта счетчика, но не включает два байта маркера.)
Таблица 16.1. Маркер JFIF APPO
Размер Описание
2 Маркер APPO (255,240)
2 Длина данных фрагмента +2
4 Идентификатор: JFIF
1 Нулевой байт
2 Версия (1,2)
1 Единицы измерения плотности по координатам Х и Y
2 Х(горизонтальная) плотность
2 Y (вертикальная) плотность
1 Ширина уменьшенного изображения: х
1 Высота уменьшенного изображения: у
З*x*у Значения RGB уменьшенного изображения
Вместо того чтобы сохранять сжатый поток данных Baseline JPEG в отдель-ном структурированном файле, JFIF напрямую использует сжатый поток дан-ных Baseline JPEG, включая дополнительную информацию в виде маркеров. Файлы JFIF используют маркер Application Marker О (APPO) формата Baseline JPEG для включения добавочной информации. Данные внутри этого маркера начинаются с ограниченной нулем строки, посредством которой указывается назначение этого маркера.
На настоящий момент определены только два таких маркера APPU. Первый маркер JFIF APPO (табл. 16.1) указывает версию JFIF, разрешение изображения и дополнительные особенности. Второй представленный маркер JFXX APPO (табл. 16.2) был разработан для хранения другой 'дополнительной информации JFIF. В настоящее время расширение JFXX используется для хранения умень-шенного изображения. Причем может использоваться несколько вариантов од-ного изображения (например, разных размеров), представленных либо в сжатом виде JPEG, либо в виде изображения с палитрой. (Маркер JFIF APPO может хранить дополнительную информацию только в незапакованном виде.)
Таблица 16.2. Маркер JFXX APPO
Размер Описание
2 Маркер APPO (255, 240)
2 Длина данных фрагмента +2
4 Идентификатор: JFXX
1 Нулевой байт
1 Расширенный код JFIF
16. уменьшенное изображение, сжатое с помощью JPEG
17. уменьшенное изображение, использующее 8 бит на пиксел
19, уменьшенное изображение, использующее 24 бита на пиксел
n Дополнительные данные
Так как файл JFIF - это поток данных JPEG, он начинается с маркера Start-of-Image (SOI) (255, 232) и заканчивается маркером End-of-Image (255, 233). В файле JFIF маркер JFIF APPO следует сразу за маркером SOI. На рис. 16.3 по-казано начало типичного файла JFIF.
Рис. 16.3. Структура файла JFIF
Как работает алгоритм сжатия JPEG
Для эффективного сжатия данных необходимо прежде всего оценить характер вашего изображения. JPEG сжимает графические данные, опираясь на то, что видит человеческий глаз. Поэтому, чтобы помочь понять, как и что делает JPEG, я хотел бы дать вам общее представление о зрительном восприятии чело-века.
Сжатие JPEG происходит в несколько этапов. Цель - преобразовать гра-фические данные таким образом, чтобы незначимая визуальная информация легко идентифицировалась и отбрасывалась. Такое сжатие "с потерями" отли-чается от большинства других подходов, используемых при работе с графиче-скими форматами, которые стараются сохранить в неприкосновенности каждый бит изображения.
Цветовая модель
Первый шаг JPEG - выбор подходящего способа представления цветов. Цвета обычно задаются в трехмерной системе координат. Хорошо известная большин-ству программистов система описывает цвет, как комбинацию красного, зелено-го и синего (RGB). К несчастью, с точки зрения возможности сжатия, это не лучший способ описания цвета. Проблема заключается в том, что все три ком-понента: красный, зеленый и синий - равнозначны. Однако переход к другой системе цветопередачи позволяет выделить некоторую более важную информацию.
Профессионалы используют две цветовые модели: HSL (Hue-Saturation-Lightness) и HSV (Hue-Saturation-Value). Интуитивно понятно, что яркостная компонента (Lightness) модели HSL и яркостная компонента (Value) модели HSV каждая по-своему определяют соотношение света и тени. Насыщенность (saturation) определяет уровень "чистого" цвета. Ненасыщенные цвета часто не-формально называют "грязными" (greysh). Оттенок (Hue) - это то, что мы воспринимаем, как цвет предмета, например красный или серовато-зеленый. Здесь важно отметить удивительный факт: человеческое зрение более чувстви-тельно к изменению освещенности, а не цвета как такового!
Различные реализации алгоритма сжатия JPEG используют различные цве-товые системы. Используемая форматом JFIF система цветопередачи YCbCr во многом схожа со схемой, разработанной много лет назад для цветного телевидения.
Прореживание
Основная причина преобразования одной цветовой модели в другую заключает-ся в необходимости выявления менее существенной для просмотра информации изображения. JPEG уменьшает количество информации о цвете. В то время как яркостная компонента передается с полным разрешением, цветоразностностные компоненты используют в два раза меньший диапазон значений. В результате этого простого шага объем данных уменьшается на треть.
С помощью прореживания (subsampling) регулируются цвета изображения цветного телевизора. Обычно в телевидение черно-белое изображение и инфор-мация о цвете передаются по отдельности. Причем информация о цвете переда-ется в менее строгом виде, чем информация о яркости изображения.
Дискретное косинусное преобразование (DCT)
Каждая компонента цвета обрабатывается отдельно, как если бы они были не одним цветным, а тремя полутоновыми изображениями. Если вы посмотрите на детальное изображение с большого расстояния, то вы различите лишь общий тон картины. Например, "главным образом, синий" или "преимущественно красный". Чем ближе вы будете подходить к изображению, тем больше деталей сможете различить. Для эмуляции этого эффекта JPEG использует один матема-тический прием, называемый дискретным косинусным преобразованием (DCT). DCT преобразует информацию о пикселах в информацию об изменении пиксе-лов. Первое, что может дать DCT - усредненный цвет области. Затем он все больше и больше уточняет детали.
Как в случае удаленного изображения, усредненное значение цвета пред-ставляет собой очень важную информацию об области изображения. Ваш глаз менее чувствителен к скорости изменения цвета, поэтому она не так важна. Пре-образовав информацию о цвете подобным образом, мы выделяем ту информа-цию, которой можно пожертвовать.
Считается, что потери обусловливаются именно этим этапом. Если вы с по-мощью DCT закодируете изображение и затем с помощью функции обратного DCT восстановите его, то вы не получите абсолютно такой же набор бит. Одна-ко эта ошибка - ошибка округления. Она возникает при выполнении арифме-тических действий и обычно не очень велика. Поэтому я предпочитаю думать об этапе DCT, как о действии, происходящем "в основном без потерь".
Для больших изображений обсчет DCT и обратного DCT весьма времяем-кий процесс. Чтобы сократить время расчетов, JPEG разбивает изображение на мозаику размером восемь на восемь пикселов. Каждая из мозаик обрабатывает-ся отдельно, что существенно сокращает необходимое для DCT время расчета. Проблема, возникающая при таком подходе, состоит в том, что после квантова-ния (о котором пойдет речь в следующем разделе) границы этих квадратиков могут не совпадать и потому становятся видимыми при задании низкого значе-ния параметра качества.
Квантование
Разработчиков JPEG прежде всего интересовали изображения фотографическо-го качества (photographic, contnuous tone). Как правило, эти полутоновые изо-бражения характеризуются мягкими переходами от одного цвета к другому. Для таких изображений низкочастотная (медленно изменяющаяся) компонента DCT важнее высокочастотной (быстро меняющаяся).
Термин квантование (quantization) означает просто "округление". JPEG от-брасывает некоторую графическую информацию за счет округления каждого члена DCT с различными весовыми коэффициентами, опираясь при этом на раз-личные факторы. Высокочастотная компонента округляется сильнее низкочас-тотной. Например, низкочастотная компонента, которая хранит среднюю вели-чину яркости, может быть округлена до значения, кратного трем, в то время как высокочастотная компонента может быть округлена до значения, кратного ста!
Операция квантования объясняет, почему сжатие JPEG в случае четких кон-туров приводит к образованию "дрожащих" линий. Контуры определяются вы-сокочастотной (быстро меняющейся) пространственной компонентой. (На первый взгляд может показаться, что вы должны получить размытый контур, однако вспомните, что С в сокращении DCT обозначает косинус.)
Обычно цветовые плоскости квантуются гораздо грубее плоскостей яркости. Здесь правильный выбор цветовой модели помогает выявлять ту информацию, которую можно отбросить.
Сжатие
До сих пор, за исключением того случая, когда рассматривалась частота выбор-ки из двух цветовых каналов, никакого сжатия не происходило. Все рассмотрен-ные выше шаги - преобразование цветовых моделей, DCT и квантование - оставляли размер данных без изменений. Наконец мы добрались до последнего шага, во время которого с помощью стандартной техники сжатия без потерь действительно будет уменьшен размер данных.
Данные, разложенные по полочкам в ходе предыдущих шагов, могут быть сжаты более эффективно, чем необработанное сырье, которое представляют со-бой графические данные RGB. Причем ни один из сделанных шагов не был лишним, каждое изменение данных было направлено на то, чтобы более эффек-тивно сжать окончательный вариант.
Изменение цветовой модели позволило проредить информацию каналов и затем более энергично их квантовать.
DCT дало возможность выделить высокочастотную пространственную ком-поненту. Высокочастотная компонента обычно имеет небольшие значения, в ре-зультате чего выходные данные на этапе DCT содержат несоразмерно много маленьких значений, облегчающих процесс сжатия.
В процессе квантования большая часть высокочастотной составляющей об-нуляется, а остальная принимает конкретные значения. Сокращение числа раз-личных значений также облегчает процесс сжатия данных.
Стандарт JPEG предоставляет два различных метода сжатия без потерь, ко-торые могут быть использованы на последнем этапе. Сжатие Хаффмана (Huffman compression) (см. стр. 167) - это давно известный незапатентованный, легко программируемый алгоритм. В отличие от него более новый алгоритм арифметического кодирования (arithmetic coding) (см. стр. 167) является объектом многочисленных патентов. (Поэтому не удивительно, что многие программы сжатия JPEG поддерживают только сжатие Хаффмана.)
При декодировании изображений JPEG необходимо совершить все эти шаги в обратном порядке. Поток данных вначале распаковывается, затем каждый блок 8х8 подвергается обратному DCT и наконец изображение конвертируется в соответствующую цветовую модель (обычно это RGB). Отметим, что информа-ция, которая была обдуманно отброшена с помощью прореживания и квантова-ния, никогда не восстанавливается. Однако если все было сделано корректно, потеря информации не вызовет никакого видимого ухудшения изображения.
Перспективы методов сжатия с потерями
JPEG - это не единственная техника сжатия графики с потерями. Существует много других методов в частности новейшие исследования в области человече-ского зрения открыли факты, позволяющие в будущем еще повысить эффектив-ность техники сжатия.
Один из недостатков JPEG заключается в том, что она отбрасывает высоко-частотную информацию, которая определяет резкие контуры изображения. По-теря этой информации при низких величинах параметра качества приводит к дрожащим линиям и смазанному изображению. Одна из областей исследова-ния - поиск путей идентификации и отдельного сжатия фрагментов, содержа-щих контуры. Такой подход может привести к созданию в будущем алгоритма сжатия с потерями, дающего еще более впечатляющие результаты.
Техника сжатия JPEG без потерь (Lossless JPEG)
В отчете группы JPEG в действительности были специфицированы две доста-точно разные техники сжатия. Наиболее известную технику сжатия с потерями я описал выше. Однако вторая техника сжатия без потерь JPEG (Lossless JPEG) тоже стоит того, чтобы о ней вспомнить. Эта техника использует "фильтры", за которыми следует либо сжатие Хаффмана, либо арифметическое кодирование.
Для изображений с фотографическим качеством стандарт JPEG предостав-ляет лучшее сжатие, даже если используются высокие значения параметра каче-ства. Для других типов изображений существует большое количество популярных и эффективных методов сжатия без потерь, и вряд ли есть потреб-ность в новых. Таким образом, стоит использовать стандарт JPEG для сжатия изображений с фотографическим качеством и обращаться к другим форматам, если требуется эффективное сжатие без потерь.
Дополнительная информация
Отчет группы JPEG можно получить в организациях ISO или ITU. Кроме того, детальную информацию по этому вопросу вы можете найти в книге Вилльяма Б. Пеннебейкера (William В. Pennebaker) и Жоан Л. Митчел (Joan L.Mitchell) JPEG: Still Image Data Compression Standard [PM93].
Большинство программ просмотра графических изображений поддержива-ют JPEG. Чтобы найти программное обеспечение для вашей платформы, обра-титесь к списку архивов в главе 2. Если вы программист, то вас, возможно, заинтересует код программ сжатия и распаковки JPEG, доступный на сервере ftp: //ftp. uu. net/graphics/ jpeg группы пользователей Independent JPEG Group.
В свою очередь, в каталоге pub/usenet/news .answers сервера ftp://rtfm.mit.edu вы найдете список часто задаваемых вопросов (FAQ) по JPEG.