Страничка посвящена описанию JPEG-LS кодера, реализованного автором на языке VHDL для применения в проектах на FPGA.
Краткое описание стандарта JPEG-LS
Стандарт JPEG-LS был разработан к 1997 году группой JPEG на основе алгоритма LOCO-I от компании Hewlett-Packard. Стандарт описывает сжатие полутоновых черно-белых или цветных изображений без потерь. Впрочем, предусмотрен также и вариант сжатия с ограниченными потерями, так называемый "near lossless" режим, при котором значения оригинального и восстановленного пикселов могут отличаться не более, чем на определенное значение.
Кодер JPEG-LS состоит из двух основных частей - блока контекстого моделирования и энтропийного кодера:
Кроме того, JPEG-LS кодер может работать в режиме сжатия последовательностей одинаковых пикселов, так называемый "run mode". В этом случае кодируется длина последовательности. В обычном же режиме кодируется ошибка предсказания пиксела, то есть разность между пикселом и его предсказанным значением, полученным в свою очередь с помощью фиксированного предиктора и адаптивной коррекции в соответствии со встречаемостью контекста.
Основные характеристики кодера JPEG-LS
Степень сжатия.
Типичная степень сжатия для обычных фотореалистичных изображений порядка 2, впрочем для изображений с большими полями одинаковых пикселов или с малым количеством мелких деталей (например деловая и компьютерная графика, медицинские изображения и пр.) степень сжатия существенно выше и может достигать 10 и более.
Сложность.
Алгоритм LOCO-I, примененный в стандарте, расшифровывается как LOw COmplexity LOssless COmpression for Images, то есть в самом названии алгоритма обращается внимание на низкую сложность алгоритма. И действительно, программный код, реализующий работу алгоритма получается весьма компактный и быстрый. Однако, хорошо соответствуя модели последовательных вычислений, алгоритм плохо поддается распараллеливанию и аппаратной реализации, поскольку за время обработки одного пиксела (за один такт) необходимо выполнить много вычислений и обновить контекстную память, причем в следующий такт обновленные данные могут быть востребованы из памяти для обработки следующего пиксела.
Сравнение с другими алгоритмами.
Хотя алгоритм и является "несложным", по степени сжатия он уступает самым совершенным современным алгоритмам без потерь (LOCO-A, CALIC-A) в среднем не более, чем на единицы процентов. И существенно превосходит большинство известных алгоритмов (FELICS, Lossless JPEG, PNG).
Сравнение - по статье: WEINBERGER et al.: LOCO-I LOSSLESS IMAGE COMPRESSION ALGORITHM. IEEE TRANSACTIONS ON IMAGE PROCESSING, VOL. 9, NO. 8, AUGUST 2000.
Текущая реализация кодера JPEG-LS
По проекту аппаратного кодера JPEG-LS полностью реализована и проверена "в железе" следующая функциональность:
Режим сжатия без потерь. То есть восстановленное изображение побитно совпадает с исходным.
Режим сжатия с ограниченными потерями "near-lossless", при котором каждая точка сжатого изображения может отличаться от оригинальной не более, чем на заданную величину.
Одноканальный кодер.
Сейчас реализована работа только с черно-белыми (в градациях серого) изображениями. И хотя стандартом предусмотрена работа с цветными (многоканальными) картинками, степень сжатия в таком варианте будет несколько хуже, чем при установке трех (нескольких, по числу компонентов) независимых кодеров, каждый со своей памятью встречаемости контекстов. При этом аппаратная реализация сжатия в таком варианте по ресурсам будет значительно более затратная, зато по быстродействию выигрыш будет равен числу компонентов. За один такт будут обрабатываться все компоненты параллельно, в то время как в стандартном режиме за такт будет обрабатываться один компонент одного пиксела, то есть пиксельная частота должна быть меньше тактовой в три раза (при трех компонентах).
Разрядность.
Хотя кодер испытывался лишь в 8-ми разрядном варианте, другая разрядность пиксельных данных достигается не более, чем изменением значений констант в исходных текстах и переимплементацией проекта. Следствием увеличения разрядности будет некоторое увеличение ресурсов, занятых проектом в FPGA (за счет увеличения разрядности
памяти строки, контекстной памяти для переменной "С" и разрядности арифметики). Кроме ресурсов, никаких ограничений для разрядности входных данных не существует (стандартом JPEG-LS рассматривается только разрядность в диапазоне от 2 до 16 бит).
Разрешение.
Горизонтальное разрешение (длина строки) определяет размер памяти, используемой для
временного хранения строки и ограничено ресурсами памяти выбранного чипа FPGA. Вертикальное разрешение (количество строк) ни на что не влияет, ничем не ограничено и может быть любым. Проверялся кодер на изображениях 720х576, текущая имплементация поддерживает до 2048 пикселов в строке. Использование современных (в том числе недорогих)
серий FPGA позволяет работать с любыми разумными разрешениями (до нескольких десятков! мегапикселов).
Ресурсы.
По количеству занимаемых ресурсов FPGA кодер стандарта JPEG-LS может показаться весьма
громоздким. Так, в тестовом варианте кодер (вместе с выходным FIFO и контроллером
интерфейса EPP) занимает практически полностью ресурсы чипа XC2S200 фирмы XILINX серии SPARTAN II. Самый востребованный ресурс - логика LUT, поскольку многчисленная арифметика, а также весьма широкие мультиплексоры и логические шифтеры проекта требуют большого количества логики. Кроме того, контекстная память должна обеспечивать возможность
асинхронного чтения и при использовании чипов серии SPARTAN II может быть реализована только на распределенной памяти, которая замещает собой LUTы. Однако на других кристаллах ситуация с занимаемыми ресурсами не такая серьезная. В частноти, имплементация проекта для чипа EP1S10 (ALTERA STRATIX) показала использование ресурсов менее 30%
Если ресурсы в проекте дефицитны - есть возможность заметно сократить их потребление ценой незначительного (единицы процентов) ухудшения степени сжатия. Достигается это уменьшением количества контекстов с базовых 364 до 171 путем ограничения количества шагов квантования градиентов с 9 до 7 заданием двух порогов вместо трех. Кроме того, если отказаться от строгого соответствия выходного потока стандарту JPEG-LS и исключить вставку заголовка и вставку нулевого бита после байта 0xFF в выходном потоке - можно сэкономить еще заметное количество ресурсов.
Быстродействие.
Решающее значение здесь оказывает выбор кристалла FPGA. В частности, для чипа XC2S200 фирмы XILINX максимальная тактовая (пиксельная) частота может составлять 22 МГц, при использовании же семейства ALTERA STRATIX достижима частота 40 МГц (весьма ориентировочные значения, конкретное значение максимальной пиксельной частоты можно определить лишь после имплементации конкретного проекта под конкретный чип). Однако,
используя несколько параллельно работающих кодеров, вполне реально сжимать видеопоследовательности и в формате HDTV (частота следования отсчетов 74 МГц).
Интерфейс.
Входные сигналы кодера следующие:
CLK - Основной (и единственный) тактовый сигнал, синхронизирующий всю схему. Кодер представляет из себя полностью синхронный проект. Все входные сигналы защелкиваются по положительному фронту CLK (при активном CE), выходные сигналы также синхронизированы по положительному фронту CLK.
CE - Clock Enable, сигнал разрешения. При установке в "0" весь кодер останавливается, входные данные не принимаются, сигналы управления не анализируются, состояние всех регистров и памяти сохраняется неизменным. "1" - рабочий режим. Может использоваться для синхронизации кодера с источником данных, если данные с него выдаются не в каждом такте.
HSYNC - Горизонтальный синхросигнал. Активный уровень - "0". Низкий уровень на входе HSYNC (при VSYNC="0") означает наличие действительных входных данных на входе DIN. При высоком уровне входные данные не принимаются, на входе DIN могут быть любые значения. Горизонтальное разрешение определяется длительностью (в тактах CLK) активного уровня на входе HSYNC. Неактивный - высокий - уровень должен быть не менее 32 тактов.
VSYNC - Вертикальный синхросигнал. Активный уровень - "0". Можно менять значение сигнала только одновременно с переходом HSYNC из низкого уровня в высокий либо в течение высокого уровня HSYNC, но не позднее, чем за 16 тактов до перехода его из высокого уровня в низкий. Между кадрами (и перед первым кадром) должен быть не менее одного периода горизонтальной синхронизации в высоком уровне (а при низком горизонтальном разрешении не менее 400 тактов, что может составить несколько периодов HSYNC).
DIN(7:0) - Входные данные. Принимаются при условии (HSYNC=VSYNC="0", CE="1"). Разрядность может быть другая (см. выше).
Выходные сигналы кодера:
DOUT(31:0) - Выходные данные, то есть сжатый поток JPEG-LS. Разрядность данных равна 32, причем данные могут следовать в каждом такте на протяжении некоторого времени (сериями). Целесообразно в дальнейшем тракте данных использовать FIFO достаточной длины.
DOUT_EN - Строб выходных данных. Данные c выхода DOUT действительны и могут быть использованы при высоком уровне DOUT_EN. Данные (и соответственно строб DOUT_EN) могут появляться на выходе максимум еще четыре такта после установки VSYNC в "1".
Тестовый макет.
Кодер тестировался "в железе" на следующей платформе: Чип FPGA - XILINX Spartan2 XC2S200PQ208 -6C. В нем помимо собственно кодера JPEG-LS, было реализовано выходное FIFO длиной в строку изображения и интерфейс EPP для обмена данными и получения команд с компьютера.
Все модули проекта написаны на языке VHDL. На компьютере для передачи исходных данных (картинки), для приема сжатого потока и для управления кодером была написана программа на DELPHI под WINDOWS.
Возможные применения аппаратного кодера JPEG-LS
Список возможных применений аппаратного кодера JPEG-LS очень широк, вот лишь некоторые варианты:
Охранные системы. Использование кодера в видеоохранных системах может позволить существенно (в разы) сократить трафик цифрового видеопотока либо увеличить время записи для автономных систем.
Системы сбора изображений (в научном, промышелнном оборудовании).
Медицинская техника. Кодер позволит в реальном времени и, что очень важно, без потерь сжимать медицинские изображения (рентгеновские снимки, томограммы, УЗИ- и эндоскопические изображения и пр.) для дальнейшего архивирования либо передачи в проектах телемедицины.
Видеостудийное оборудование, видеорекордеры. Сжатие без потерь видеопоследовательностей позволит сохранять исходное качество видеоматериалов, существенно экономя место в системах хранения.
ВЕБ-камеры. Кодер позволит разрабатывать более эффективные продукты с высоким качеством изображения.
CCD- и CMOS- камеры.Применение кодера позволит создавать более эффективные решения.
Спутниковые, подводные и прочие специальные системы фото- и видеонаблюдения.