«Реализация алгоритмов JPEG и JPEG2000» Выполнил: студент группы 819 Угаров Дмитрий Принципы работы алгоритмов JPEG и JPEG2000 1. Алгоритм JPEG JPEG (англ. Joint Photographic Experts Group — объединённая группа экспертов в области фотографии) — является широко используемым методом сжатия фотоизображений. Формат файла, который содержит сжатые данные обычно также называют именем JPEG; наиболее распространённые расширения для таких файлов .jpeg, .jfif, .jpg, .JPG, или .JPE. Однако из них .jpg самое популярное расширение на всех платформах. Алгоритм JPEG является алгоритмом сжатия с потерей качества. Область применения Формат является форматом сжатия с потерями, поэтому некорректно считать что JPEG хранит данные как 8 бит на канал (24 бит на пиксель). С другой стороны, так как данные, подвергающиеся компрессии по формату JPEG и декомпрессированные данные обычно представляются в формате 8 бит на канал, иногда используется эта терминология. Поддерживается также сжатие чёрно-белых полутоновых изображений. При сохранении JPEG-файла можно указать степень качества, а значит и степень сжатия, которую обычно задают в некоторых условных единицах, например, от 1 до 100 или от 1 до 10. Большее число соответствует лучшему качеству, но при этом увеличивается размер файла. Обыкновенно, разница в качестве между 90 и 100 на глаз уже практически не воспринимается. Следует помнить, что побитно восстановленное изображение всегда отличается от оригинала. Распространённым заблуждением является мнение о том, что качество JPEG тождественно доле сохраняемой информации. Этапы кодирования Процесс сжатия по схеме JPEG включает ряд этапов: 1. Преобразование изображения в оптимальное цветовое пространство; В случае применения цветового пространства яркость/цветность (YCbCr) достигается лучшая степень сжатия. На данном этапе кодирования с помощью соответствующих соотношений цветовая модель RGB преобразуется в YCbCr: Y = 0.299*R + 0.587*G + 0.114*B Cb = - 0.1687*R – 0.3313*G + 0.5*B Cr = 0.5*R – 0.4187*G – 0.0813*B. Во время декодирования можно использовать соответствующее обратное преобразование: R = Y + 1.402*Cr G = Y – 0.34414*Cb – 0.71414*Cr B = Y + 1.772*Cb. Примечание, связывающее Y,Cb,Cr в человеческой визуальной системе: Глаз, особенно сетчатка, имеет как визуальные анализаторы два типа ячеек: ячейки для ночного видения, воспринимающие только оттенки серого (от ярко-белого до темночерного) и ячейки дневного видения, которые воспринимают цветовой оттенок. Первые ячейки, дающие цвет RGB, обнаруживают уровень яркости, подобный величине Y. Другие ячейки, ответственные за восприятие цветового оттенка, - определяют величину, связанную с цветоразностью. 2. Субдискретизация компонентов цветности усреднением групп пикселей; Большая часть визуальной информации, к которой наиболее чувствительный глаза человека, состоит из высокочастотных, полутоновых компонентов яркости (Y) цветового пространства YCbCr. Две другие составляющие цветности (Cb и Cr) содержат высокочастотную цветовую информацию, к которой глаз человека менее чувствителен. Поэтому определенная ее часть может быть отброшена и, тем самым, можно уменьшить количество учитываемых пикселей для каналов цветности. 1)тип 4:2:0 ( когда изображение разбивается на квадраты 2х2 пикселей и в каждом из них все пиксели получают одинаковые значения каналов Cb и Cr, а яркость Y у остается у каждого своя) 2) тип 4:2:2 (объединение по компонентам цветности происходит только по горизонтали в группах по два пикселя). 3)тип 4 : 4 : 4 подразумевает, что каждому пикселю в каждой строке соответствует собственное уникальное значение компонентов Y, Cb и Cr. (рис.1 а) 4) тип 4:2:2. Выполнив субдискретизацию сигнала цветности с коэффициентом 2 по горизонтали, мы получим из потока 4 : 4 : 4 YCbCr поток 4 : 2 : 2 YCbCr. Запись «4 : 2 : 2» означает, что в отдельно взятой строке на 2 значения цветности приходятся 4 значения яркости (см. рис.1 б). Сигнал 4 : 2 : 2 YCbCr очень немного проигрывает по качеству изображения сигналу 4 : 4 : 4 YCbCr, зато требуемая ширина полосы сокращается на 33% от исходной. 3. Применение дискретных косинусных преобразований для уменьшения избыточности данных изображения; Основным этапом работы алгоритма является дискретное косинусное преобразование (ДКП или DCT), представляющее собой разновидность преобразования Фурье. Оно применяется при работе с изображениями в различных целях, не только с целью сжатия. Переход к частотному представлению величин значений пикселей позволяет по-другому взглянуть на изображение, обработать его, ну, и, что интересно для нас, сжать. Более того, зная коэффициенты преобразования, мы всегда может произвести обратное действие вернуть исходную картинку. DCT непосредственно применяемый к блоку (в нашем случае 8х8 пикселей) изображения будет выглядеть так: где х, y - пространственные координаты пикселя (0..7) , f(x,y) - значения пикселей исходного макроблока (допустим, яркость) u,v - координаты пикселя в частотном представлении (0..7) w(u) =1/SQRT(2) при u=0, в остальных случаях w(u)=1 (SQRT - квадратный корень) w(v) =1/SQRT(2) при v=0, в остальных случаях w(v)=1 Или в матричной форме: 4. Квантование каждого блока коэффициентов ДКП с применением весовых функций, оптимизированных с учетом визуального восприятия человеком; Дискретное косинусное преобразование подготавливает информацию для сжатия с потерями и округления. Для каждого элемента преобразуемой матрицы существует соответствующий элемент матрицы квантования. Результирующая матрица получается делением каждого элемента преобразуемой матрицы на соответствующий элемент матрицы квантования и последующим округлением результата до ближайшего целого числа. При составлении матрицы квантования большие ее элементы находятся в левом нижнем углу, чтобы при делении на них данные в этом углу после дискретного косинусного преобразования (как раз те, округление которых пройдет менее болезненно) округлялись более грубо. Соответственно потерянная информация менее важна для нас, чем оставшаяся. 5. Этап Вторичного Сжатия Заключительной стадией работы кодера JPEG является кодирование полученной матрицы. 5.1 Зигзагообразная перестановка 64 DCT коэффициентов Так, после того, как мы выполнили DCT-преобразование над блоком величин 8x8, у нас есть новый блок 8x8. Затем, этот блок 8x8 просматривается по зигзагу подобно этому: (Числа в блоке 8x8 указывают порядок, в котором мы просматриваем 2-мерную матрицу 8x8) 0, 1, 5, 6,14,15,27,28, 2, 4, 7,13,16,26,29,42, 3, 8,12,17,25,30,41,43, 9,11,18,24,31,40,44,53, 10,19,23,32,39,45,52,54, 20,22,33,38,46,51,55,60, 21,34,37,47,50,56,59,61, 35,36,48,49,57,58,62,63 Как Вы видите, сначала - верхний левый угол (0,0), затем величина в (0,1), затем (1,0), затем (2,0), (1,1), (0,2), (0,3), (1,2), (2,1), (3,0) и т.п. После того, как мы прошли по зигзагу матрицу 8x8, мы имеем теперь вектор с 64 коэффициентами (0..63) Смысл этого зигзагообразного вектора – в том, что мы просматриваем коэффициенты 8x8 DCT в порядке повышения пространственных частот. Так, мы получаем вектор отсортированный критериями пространственной частоты: первая величина на векторе (индекс 0) соответствует самой низкой частоте в изображении – она обозначается термином DC. С увеличением индекса на векторе, мы получаем величины соответствующие высшим частотам (величина с индексом 63 соответствует амплитуде самой высокой частоте в блоке 8x8). Остальная часть коэффициентов DCT обозначается AC. 5.2 RunLength кодирование нулей (RLE) Теперь у нас есть вектор с длинной последовательностью нулей. Мы можем использовать это, кодируя последовательные нули. ВАЖНО: Вы увидите позже почему, но здесь мы пропускаем кодировку первого коэффициента вектора (коэффициент DC), который закодирован по-другому. Рассмотрим исходный 64 вектор как 63 вектор (это - 64 вектор без первого коэффициента) Допустим, мы имеем 57,45,0,0,0,0,23,0,-30,-16,0,0,1,0,0,0,0,0,0, только 0,...,0 Здесь - как RLC JPEG сжатие сделано для этого примера: (0,57); (0,45); (4,23); (1,-30); (0,-16); (2,1); EOB Как Вы видите, мы кодируем для каждой величины, отличающейся от 0 количество последовательных ПРЕДШЕСТВУЮЩИХ нулей перед величиной, затем мы добавляем величину. Другое примечание: EOB - короткая форма для Конца Блока, это - специальная кодированная величина (маркер). Если мы достигли в позиции на векторе, от которого мы имеем до конца только нули вектора, мы выделим эту позицию с EOB и завершим сжатие RLC квантованного вектора. [Заметьте, что если квантованный вектор не оканчивается нулями (имеет последний элемент не 0), мы не будем иметь маркер EOB.] (0,57); (0,45); (4,23); (1,-30); (0,-16); (2,1); (0,0) Другая ОСНОВНАЯ вещь: Допустим, где-нибудь на квантованном векторе мы имеем: 57, восемнадцать нулей, 3, 0,0 ,0,0 2, тридцать-три нуля, 895, EOB Кодирование Хаффмана JPG делает ограничение , по которому число предшествующих нулей должно кодироваться как 4-битовая величина - не может превысить 15. Так, предшествующий пример должен быть закодирован как: (0,57); (15,0) (2,3); (4,2); (15,0) (15,0) (1,895), (0,0) (15,0) - специальная кодированная величина, которая указывает, что там следует за 16 последовательными нулями. 5.3 Конечный шаг - кодирование Хаффмана Сначала ВАЖНОЕ примечание: Вместо хранения фактической величины, JPEG стандарт определяет, что мы храним минимальный размер в битах, в котором мы можем держать эту величину (это названо категория этой величины) и затем битно кодированное представление этой величины подобно этому: Величины 0 -1,1 -3,-2,2,3 -7,..,-4,4,..,7 000,001,010,011,100,101,110,111 -15,..,-8,8,..,15 0000,..,0111,1000,..,1111 -31,..,-16,16,..,31 00000,..,01111,10000,..,11111 -63,..,-32,32,..,63 -127,..,-64,64,..,127 -255,..,-128,128,..,255 -511,..,-256,256,..,511 -1023,..,-512,512,..,1023 -2047,..,-1024,1024,..,2047 -4095,..,-2048,2048,..,4095 -8191,..,-4096,4096,..,8191 -16383,..,-8192,8192,..,16383 -32767,..,-16384,16384,..,32767 Категория 0 1 2 3 Биты для величины 0,1 00,01,10,11 4 5 6 7 8 9 10 11 12 13 14 15 . . . . . . . . . . Впоследствии для предшествующего примера: (0,57); (0,45); (4,23); (1,-30); (0,-8); (2,1); (0,0) давайте закодируем только правую величину этих пар, кроме пар, которые являются специальными маркерами подобно (0,0) или (если мы должны иметь) (15,0) 57 - в категории 6 и это – битно кодированный 111001, так что мы закодируем это как (6,111001) 45, аналогично, будет закодирован как (6,101101) 23 -> (5,10111) -30 -> (5,00001) -8 -> (4,0111) 1 -> (1,1) И теперь, мы напишем снова строку пар: (0,6), 111001; (0,6), 101101; (4,5), 10111; (1,5), 00001; (0,4), 0111; (2,1), 1; (0,0) Пары 2 величин, заключенные в скобки, могут быть представлены в байте, так как фактически каждая из 2 величин может быть представлена в 4-битном кусочке (счетчик предшествующих нулей - всегда меньше, чем 15 и также как и категория [числа закодированные в файле JPG - в области -32767..32767]). В этом байте, старший кусочек представляет число предшествующих нулей, а младший кусочек - категорию новой величины, отличной от 0. Конечный шаг кодировки состоит в кодировании Хаффмана этого байта, и затем записи в файле JPG, как поток из битов, кода Хаффмана этого байта, сопровождающийся битовым представлением этого числа. Например, для байта 6 (эквивалент (0,6)) у нас есть код Хаффмана = 111000; для байта 69 = (4,5) (например) у нас есть 1111111110011001 21 = (1,5) — 11111110110 4 = (0,4) — 1011 33 = (2,1) — 11011 0 = EOB= (0,0) — 1010 Конечный поток битов записанных в файле JPG на диск для предшествующего примера 63 коэффициентов (запомните, что мы пропустили первый коэффициент) - 111000 111001 111000 101101 1111111110011001 10111 11111110110 00001 1011 0111 11011 1 1010 Достоинства и недостатки К недостаткам формата следует отнести то, что при сильных степенях сжатия дает знать о себе блочная структура данных, изображение «дробится на квадратики» (каждый размером 8x8 пикселей). Этот эффект особенно заметен на областях с низкой пространственной частотой (плавные переходы изображения, например, чистое небо). В областях с высокой пространственной частотой (например, контрастные границы изображения), возникают характерные «артефакты» — иррегулярная структура пикселей искаженного цвета и/или яркости. Кроме того, из изображения пропадают мелкие цветные детали. Не стоит также забывать и о том, что данный формат не поддерживает прозрачность. Однако, несмотря на недостатки, JPEG получил очень широкое распространение из-за высокой степени сжатия, относительно существующих во время его появления альтернатив. 2. Алгоритм JPEG2000 Алгоритм JPEG-2000 разработан той же группой экспертов в области фотографии, что и JPEG. Формирование JPEG как международного стандарта было закончено в 1992 году. В 1997 стало ясно, что необходим новый, более гибкий и мощный стандарт, который и был доработан к зиме 2000 года. Основные отличия алгоритма в JPEG 2000 от алгоритма в JPEG заключаются в следующем: 1)Лучшее качество изображения при сильной степени сжатия. Или, что то же самое, большая степень сжатия при том же качестве для высоких степеней сжатия. Фактически это означает заметное уменьшение размеров графики "Web-качества", используемой большинством сайтов. 2)Поддержка кодирования отдельных областей с лучшим качеством. Известно, что отдельные области изображения критичны для восприятия человеком (например, глаза на фотографии), в то время как качеством других можно пожертвовать (например, задний план). При "ручной" оптимизации увеличение степени сжатия проводится до тех пор, пока не будет потеряно качество в какой-то важной части изображения. Сейчас появляется возможность задать качество в критичных областях, сжав остальные области сильнее, т.е. мы получаем еще большую окончательную степень сжатия при субъективно равном качестве изображения. 3)Основной алгоритм сжатия заменен на wavelet. Помимо указанного повышения степени сжатия это позволило избавиться от 8-пиксельной блочности, возникающей при повышении степени сжатия. Кроме того, плавное проявление изображения теперь изначально заложено в стандарт (Progressive JPEG, активно применяемый в Интернет, появился много позднее JPEG). 4)Для повышения степени сжатия в алгоритме используется арифметическое сжатие. Изначально в стандарте JPEG также было заложено арифметическое сжатие, однако позднее оно было заменено менее эффективным сжатием по Хаффману, поскольку арифметическое сжатие было защищено патентами. Сейчас срок действия основного патента истек, и появилась возможность улучшить алгоритм. 5)Поддержка сжатия без потерь. Помимо привычного сжатия с потерями новый JPEG теперь будет поддерживать и сжатие без потерь. Таким образом, становится возможным использование JPEG для сжатия медицинских изображений, в полиграфии, при сохранении текста под распознавание OCR системами и т.д. 6)Поддержка сжатия однобитных (2-цветных) изображений. Для сохранения однобитных изображений (рисунки тушью, отсканированный текст и т.п.) ранее повсеместно рекомендовался формат GIF, поскольку сжатие с использованием ДКП весьма неэффективно к изображениям с резкими переходами цветов. В JPEG при сжатии 1битная картинка приводилась к 8-битной, т.е. увеличивалась в 8 раз, после чего делалась попытка сжимать, нередко менее чем в 8 раз. Сейчас можно рекомендовать JPEG 2000 как универсальный алгоритм. 7)На уровне формата поддерживается прозрачность. Плавно накладывать фон при создании WWW страниц теперь можно будет не только в GIF, но и в JPEG 2000. Кроме того, поддерживается не только 1 бит прозрачности (пиксель прозрачен/непрозрачен), а отдельный канал, что позволит задавать плавный переход от непрозрачного изображения к прозрачному фону. Кроме того, на уровне формата поддерживаются включение в изображение информации о копирайте, поддержка устойчивости к битовым ошибкам при передаче и широковещании, можно запрашивать для декомпрессии или обработки внешние средства (plug-ins), можно включать в изображение его описание, информацию для поиска и т.д. Этапы кодирования Процесс сжатия по схеме JPEG2000 включает ряд этапов: 1. Преобразование изображения в оптимальное цветовое пространство. На данном этапе кодирования с помощью соответствующих соотношений цветовая модель RGB преобразуется в YUV: При декомпрессии применяется соответствующее обратное преобразование: 2. Дискретное вейвлет преобразование. Дискретное wavelet преобразование (DWT) также может быть двух видов - для случая сжатия с потерями и для сжатия без потерь. Это преобразование в одномерном случае представляет собой скалярное произведение соответствующих коэффициентов на строку значений. Но т.к. многие коэффициенты нулевые, то прямое и обратное вейвлет преобразование можно записать следующими формулами (для преобразования крайних элементов строки используется ее расширение на 2 пикселя в каждую сторону, значения которых симметричны с значениями элементов строки относительно ее крайних пикселей): y( 2*n + 1 ) = x( 2*n + 1 ) - (int)( x( 2*n ) + x( 2*n + 2 ) ) / 2 y( 2*n ) = x( 2*n ) + (int)( y( 2*n - 1 ) + y( 2*n + 1 ) + 2 ) / 4 и обратное x( 2*n ) = y( 2*n ) - (int)( y( 2*n - 1 ) + y( 2*n + 1 ) + 2 ) / 4 x( 2*n + 1 ) = y( 2*n + 1 ) + (int)( x( 2*n ) + x( 2*n + 2 ) ) / 2. 3. Квантование коэффициентов. Так же как и в алгоритме JPEG, при кодировании изображения в формат JPEG2000 используется квантование. Дискретное вейвлет преобразование, так же как и его аналог, сортирует коэффициенты по частотности. Но, в отличие от JPEG, в новом формате матрица квантования одна на все изображение. 4. Этап Вторичного Сжатия .Как и в JPEG, в новом формате последним этапом алгоритма сжатия является кодирование без потерь. Но, в отличие от предыдущего формата, в JPEG2000 используется алгоритм арифметического сжатия. Программная реализация В данной работе реализованы алгоритмы JPEG и JPEG2000. В обоих алгоритмах реализовано прямое и обратное кодирование (отсутствует последний этап вторичного сжатия). Расчет JPEG происходит довольно долго (порядка 30 секунд) в связи «прямым» высчитыванием DCT. Если потребуется увеличить скорость работы, следует изначально вычислить матрицу DCT(изменения производить в классе DCT). Перейдем к рассмотрению программы: 1. После запуска выводится окно, где 1 2 3 4 5 Место загрузки изображения 6 1) 2) 3) 4) 5) 6) Кнопка открытия изображения Кнопка сохранения изображения Кнопка выполнения выбранного алгоритма Лист выбора алгоритма Выбор параметров субдискретизации Quality Factor 2. Вызвав диалоговое окно открытия кнопкой (1) выберем нужное изображение. 3. Установим нужные параметры( (5) для алгоритма JPEG2000 не нужен) 4. Нажмите применить (3),и через некоторое время изображение вы получите обработанное изображение и сможете его сохранить, нажав кнопку (2) и введя желаемое название в диалоговом окне. 5. При достаточно большом Quality Factor изображение сильно измениться. Если это JPEG алгоритм то будут ярко выражены блоки размера 8x8.(в случае алгоритма JPEG2000, блочного деления не будет) До: После: