CodeNet / Приложения / Алгоритмы / Сжатие и кодирование / JPG
CodeNet / Приложения / Графика / Форматы файлов / JPG
CodeNet / Остальное / Форматы файлов / JPG
JPG
JFIF (Jpeg Формат Взаимозаменяемого Файла) файл
JPEG стандарт (что в файле itu-1150.ps) как-нибудь очень обобщенный, JFIF реализация является конкретным случаем этого стандарта (и он является, конечно, совместимым со стандартом). JPEG стандарт определяет некоторые маркеры, зарезервированные для приложений (под приложениями я подразумеваю конкретные случаи осуществления стандарта) Эти маркеры названы APPn, где n изменяется от 0 до 0xF; APPn = FFEn. JFIF спецификация использует маркер APP0 (FFE0), чтобы идентифицировать файл JPG, который использует эту спецификацию. Вы увидите в JPEG стандарте, что он имеет отношение к "компонентам образа". Эти компоненты образа могут быть (Y,Cb,Cr) или (YIQ) или все, что угодно. JFIF реализации использует только (Y,Cb,Cr) для цветного JPG, или только Y для монохромного JPG.
Показатели (факторы) дискретизации
Примечание: следующее объяснение раскрывает кодировку цветных (3 компонента) JPG-файлов; для черно-белых JPG-файлов есть один компонент (Y), который - обычно никак необработанный совсем, и не требует любого обратного преобразования подобно инверсии (Y,Cb,Cr) -> (R,G,B). Впоследствии, черно-белые JPG-файлы - самые простейшие для декодирования: для каждого блока 8x8 в изображении Вы делаете декодирование Хаффмана кодированного вектора RLC, который затем Вы преобразовываете из зигзага, деквантуете 64 вектор и, наконец, Вы применяете к нему обратное DCT и прибавляете 128 (сдвиг уровня) к новым величинам 8x8.
Я сообщил Вам, что компоненты изображения обработаны. Обычно Y взято для каждый пикселя, и Cb, Cr взяты для блока пикселей 2x2. Но есть некоторые JPG-файлы, в которых Cb, Cr взяты для каждого пикселя, или некоторые JPG-файлы где Cb, Cr взяты для каждых 2 пикселей (горизонтальная дискретизация на 2 пикселях, и вертикальная дискретизация на каждом пикселе) Показатели дискретизации для компонента образа в файле JPG определяются в отношении (относительном) в самом высшем показателе дискретизации.
Вот показатели дискретизации для наиболее обычного примера: Y взято на каждый пиксель, и Cb, Cr взяты для блока пикселей 2x2 (JFIF спецификация дает формулу для показателей дискретизации, которая я думаю, что работает только когда максимальный показатель дискретизации для каждого измерения X или Y <=2) JPEG стандарт не определяет показатели дискретизации.
Вы видите, что Y будет иметь самую высшую частоту дискретизации:
Горизонтальный показатель дискретизации = 2 = HY Вертикальный показатель дискретизации = 2 = VY Для Cb, Горизонтальный показатель дискретизации = 1 = HCb Вертикальный показатель дискретизации = 1 = VCb Для Cr, Горизонтальный показатель дискретизации = 1 = HCr Вертикальный показатель дискретизации = 1 = VCr
Действительно эта форма определения показателей дискретизации вполне полезна. Вектор 64 коэффициентов для компонента изображения, кодированных Хаффманом, назван
DU = Единица Данных (стандартная терминология JPEG)
В файле JPG, порядок кодировки Единиц Данных:
1) закодируйте Единицу Данных для первого компонента изображения: для (счетчик_y=1; счетчик_y<=VY; счетчик_y++) для (счетчик_x=1; счетчик_x<=HY; счетчик_x++) { кодировать Единицу Данных для Y } 2) закодируйте Единицу Данных для второго компонента изображения: для (счетчик_y=1; счетчик_y<=VCb ; счетчик_y++) для (счетчик_x=1; счетчик_x<=HCb; счетчик_x++) { кодировать Единицу Данных для Cb } 3) наконец, для третьего компонента, аналогично: для (счетчик_y=1; счетчик_y<=VCr; счетчик_y++) для (счетчик_x=1; счетчик_x<=HCr; счетчик_x++) { кодировать Единицу Данных для Cr }
Для примера я дал Вам (HY=2, VY=2; HCb=VCb =1, HCr, VCr=1)
здесь это – цифра:
YDU YDU CbDU CrDU YDU YDU
(YDU - Единица Данных (DU) для Y, и аналогично CbDU DU для Cb, CrDU = DU для Cr) Эта обычная комбинация показателей дискретизации обозначается 2:1:1 как для вертикальных, так и для горизонтальных показателей дискретизации.
И, конечно, в файле JPG порядок кодирования будет:
YDU,YDU,YDU,YDU,CbDU,CrDU
Вы знаете, что DU (64 коэффициента) определяют блоквеличин 8x8, таким образом, здесь мы определили кодирующий порядок для блока пикселей изображения 16x16 (Пиксель изображения (Y,Cb,Cr)): Четыре блока 8x8 величин Y (4 YDUs), один блок 8x8 величин Cb (1 CbDU) и один блок 8x8 величин Cr (1 CrDU)
(Hmax = Максимальный горизонтальный показатель дискретизации, Vmax = максимальный вертикальный показатель дискретизации) Впоследствии для этого примера показателей дискретизации (Hmax = 2, Vmax=2), шифратор должен обрабатывать ОТДЕЛЬНО каждый 16x16 = блок пикселей образа (Hmax*8 x Vmax*8) в упомянутом порядке.
Этот блок пикселей изображения размерами (Hmax*8,Vmax*8) называется, в стандартной терминологии JPG, MCU = Минимальная Кодированная Единица.
Для предшествующего примера: MCU = YDU,YDU,YDU,YDU,CbDU,CrDU
Другой пример показателей дискретизации:
HY =1, VY =1 HCb=1, VCb=1 HCr=1, VCr=1 Цифра/порядок: YDU CbDU CrDU
Вы видите, что здесь определены пиксель образа блока 8x8 (MCU) с 3 8x8 блоками:
один для Y, один для Cb и один для Cr (Совсем нет обработки)
Здесь (Hmax=1, Vmax=1) MCU имеет измерение (8,8), и MCU = YDU,CbDU,CrDU
In the JPG file, the sampling factors for every image component are defined after the marker SOF0 = Start Of Frame 0 = FFC0
Для черно-белых JPG-файлов Вы не должны побеспокоиться о порядке кодировки единиц данных в MCU. Для этих JPG, MCU = 1 Единица Данных (MCU = YDU)
В файле JPG, показатели дискретизации для каждого компонента образа определены после маркера SOF0 = Начало Кадра 0 = FFC0
Краткая схема декодирования файла JPG
Дешифратор читает из файла JPG показатели дискретизации, он обнаруживает размеры MCU (Hmax*8,Vmax*8) => сколько MCU - в целом изображении, затем декодирует каждую MCU, присутствующую в исходном изображении (цикл для всех этих блоков, или пока не обнаружится маркер EOI [это должно обнаружиться, когда кончится цикл, в противном случае Вы получите неполное изображение]) - он декодирует MCU, декодируя каждую Единицу Данных в MCU в порядке упомянутом перед этим, и наконец, пишет расшифрованный цветной блок пикселей (Hmax*8 x Vmax*8) в (R,G,B) буфер изображения.
Видео MPEG-1 и JPEG
Интересная часть спецификации MPEG-1 (и вероятно MPEG-2) - то, что она полагается сильно на JPEG спецификацию. Он использует много понятий, представленных здесь. Причина в том, что каждые 15 кадров, или, когда это нужно, есть независимый кадр названный I-кадр (Интра фрейм), который JPEG закодирован. (Между прочим, блок 16x16 пикселей изображения в примере, который я Вам дал, называется, в стандартной терминологии MPEG, макроблок) За исключением алгоритмов для компенсации движения, видео MPEG-1 положились во многом на спецификацию JPG (DCT-преобразование, квантование, и т.п.)
Надеюсь, Вы готовы теперь начать программирование вашего просмотрщика JPG или шифратора.
Об авторе этого документа
Автором этого документа является Cristi Cuturicu, студент Политехнического Университета в Бухаресте (UPB), Отделе Информатики. Вы можете связаться с ним по электронной почте: cccrx@kermit.cs.pub.ro; cryx@ulise.cs.pub.ro И если Вы – компания по программированию, требующая программиста, тогда свяжитесь. |