Эффективное кодирование и цифровое представление изображений. Практикум № 37
.pdf
ФЕДЕРАЛЬНОЕ АГЕНТСТВО СВЯЗИ
Федеральное государственное образовательное бюджетное учреждение высшего профессионального образования
Московский технический университет связи и информатики
Кафедра мультимедийных сетей и услуг связи
Гузеев А.В.
Практикум № 37
Эффективное кодирование и цифровое представление изображений
для студентов 3 курса (направление подготовки 11.03.01)
Москва 2014
План УМД на 2014/2015 уч.г.
Практикум № 37
Эффективное кодирование и цифровое представление изображений
Составитель А.В. Гузеев, к.т.н., доцент
Издание утверждено советом факультета ИТ. Протокол № 9 от 22.05.2014г.
Рецензент Н.В.Яковенко, доцент
2
Цель работы
1.Изучение основ цифрового представления полутоновых и бинарных изображений.
2.Изучение алгоритма построения эффективных кодов Хаффмана по длинам кодов, использующегося в современных стандартах кодирования изображений (T.81,T.800).
3.Изучение методов оценки эффективности алгоритмов сжатия.
4.Исследование упрощенного алгоритма эффективного кодирования полутоновых и бинарных изображений.
Домашнее задание
1.Изучить алгоритм построения кодов Хаффмана по длинам кодов.
2.Найти длины кодов для всех символов алфавита генерируемого источником, который содержит последовательно записанные через пробел ваши фамилию, имя и отчество.
3.Построить список счетчиков длин кодов.
4.Сформировать кодовые комбинации по изученному алгоритму для найденного списка длин кодов.
5.Определить значение средней длины кодовой комбинации nср ,
энтропии Н и максимальной энтропии Н макс .
6.Определить значения коэффициентов относительной эффективности
КОЭ и сжатия КСЖ .
7.Закодировать свои фамилию, имя и отчество, записанные через пробел,
сформированными кодовыми последовательностями. Объяснить использование свойства префиксности при декодировании полученной кодовой последовательности.
3
Краткая теория
Цифровое представление изображений
Все цифровые изображения можно разбить на два больших класса: векторные цифровые изображения и растровые цифровые изображения.
Для векторного представления изображения характерно разбиение графического образа, содержащегося в этом изображении, на графические примитивы (линии, окружности, эллипсы, многоугольники и т.д.). Графические примитивы задаются координатой некоторой точки, принадлежащей этому примитиву и характеризующей его положение на плоскости изображения, и параметрами графического примитива, характеризующими его форму, размер и ориентацию (например, для квадрата это может быть координата любого угла, размер стороны и угол поворота). По этой причине при сильном увеличении изображения при просмотре, векторные изображения остаются предельно четкими.
Для растровых цифровых изображений последнее утверждение не справедливо. Если у векторных изображений задаются параметры для каждого графического примитива, то у растровых изображений задаются параметры для каждой точки на плоскости изображения. Такая точка называется единичный элемент изображения или пиксель (от английского picture element). На первый взгляд кажется, что задать каждую точку на изображении - гораздо более сложная задача, чем задание графических примитивов, но это совсем не так. Во-первых, графические примитивы отличаются большим разнообразием видов и различным количеством параметров для каждого вида, что вызывает определенные трудности для их описания некоторым двоичным кодом (т.е. для представления в цифровой форме). Во-вторых, разбить изображение на совокупность графических примитивов – далеко не тривиальная задача, поэтому область применения векторной графики сильно ограничена, в основном это искусственно созданные изображения (например, деловая графика). Изображения реального мира (фотографии и др.) являются растровыми. Конечно, можно нарисовать лицо человека в виде эллипса с глазами – кругами внутри и ртом
– линией, но это будет очень грубое приближение. Растровое изображение дает настолько точное приближение, что человек может не заметить разницы, если не будет специально искать её.
Растровые изображения получаются в результате процесса АЦП (аналогоцифровое преобразование). Сначала оригинал сканируется или фотографируется, количество светочувствительных датчиков в устройстве определяет разрешающую способность системы (измеряется в dpi, dot-per- inch или в точках на дюйм), на этом этапе происходит дискретизация образа оригинала. Затем происходит квантование каждой точки-отсчета; количество уровней квантования зависит от характеристик и назначения системы; остановимся на трех основных вариантах: два уровня, 256 уровней и 16777216 уровней. Так как каждая точка изображения может принимать
4
значение одного из возможных уровней квантования, то для возможности отличать один уровень от другого, соответственно, будем иметь 1 бит, 8 бит или 24 двоичных разряда (бита) на точку. Эта величина называется глубиной цветопередачи изображения, и в зависимости от её значения будем различать черно-белые, полутоновые и цветные растровые изображения соответственно.
Итак, для черно-белых изображений, каждая точка кодируется одним битом, который может принимать значение «0», если точка белая, и значение «1», если точка черная.
Для полутоновых изображений, каждая точка может принимать одно из 256 различных значений, которым соответствуют оттенки серого цвета (полутона или уровни) от полностью черного (значение «0»), до полностью белого (значение «255»). Так, как каждая точка полутонового изображения кодируется 8 битами, а каждая точка черно-белого изображения – 1 битом, то можно представить полутоновое изображение совокупностью восьми чернобелых изображений, которые будут называться плоскостями. Чем меньше номер плоскости, тем старше биты полутонового изображения, которые она представляет. Если изменить значение пиксела на плоскости с номером 1, то значение пиксела полутонового изображения изменится на 128 полутонов, если изменить значение пиксела на плоскости с номером два, то на 64 полутона и т.д. Изменение одного пиксела на восьмой плоскости поменяет значение пиксела полутонового изображения только на один полутон, иными словами на соседний. Однако для человеческого глаза такое различие является крайне не существенным. Убедиться в этом можно, проведя несложный эксперимент в любом современном графическом редакторе.
Наконец, цветные изображения кодируются 24 битами на пиксел, однако это значение нельзя воспринимать как номер одного из 16777216 различных уровней. Это значение разделяется на три подряд записанных числа, на каждое из которых отводится по 8 бит. Первое число кодирует красную компоненту (Red), второе – зелёную (Green) и третье – синюю (Blue), это так называемая, RGB модель представления цветов, когда любой цвет можно представить тремя перечисленными цветами, «смешанными» в нужной пропорции. Существуют и другие модели представления цветов, а также формулы пересчета значений для перехода из одной модели в другую. Таким образом, цветное изображение в модели представления цветов RGB состоит из трех цветовых плоскостей, каждая из которых кодируется как полутоновое изображение, т.е. по 8 бит на один пиксель.
В настоящей лабораторной работе используется разложение полутонового изображения на восемь черно-белых плоскостей, которые, затем, сжимаются отдельно друг от друга. Исследуются зависимости коэффициента сжатия и энтропии от характера черно-белого изображения.
Кодирование алгоритмом Хаффмана
Эффективное кодирование или сжатие имеет своей целью компактное представление информации для её дальнейшего хранения или передачи.
5
Одним из классов эффективных кодов являются статистические коды, к этому классу относятся и коды Хаффмана. Согласно теореме Шеннона о кодировании для канала без помех, скорость передачи информации будет увеличиваться, если преобразовать сообщения от источника информации в статистически независимые, т.е. в символы с равномерной функцией распределения вероятности появления. Статистическое кодирование осуществляет такое преобразование посредством уменьшения числа символов, необходимых для представления одного элемента алфавита. Для решения этой задачи алгоритм Хаффмана сопоставляет наиболее вероятным сообщениям кодовые последовательности меньшей длины, а наименее вероятным – большей длины. Входными данными для кодирования по алгоритму Хаффмана являются вероятности появления символов алфавита на выходе источника и последовательность символов, которую необходимо закодировать. Для декодирования необходимы вероятности появления (те же самые), сопоставленные соответствующим символам алфавита источника (для построения кодов) и закодированная последовательность символов. Таким образом, будем говорить о полезной нагрузке и о служебной информации, необходимой для верного декодирования. Эта информация может быть как кодовым деревом, так и информацией для построения такого дерева, например, частоты или вероятности появления символов кодируемого алфавита. Хотя древовидная структура облегчает понимание принципов кодирования Хаффмана, это не самый простой путь получения кодов Хаффмана. Другой метод состоит в генерировании для всех символов кодируемого алфавита длин кодов (code length) и формировании на их основе кодов Хаффмана. Длины кодов будут занимать меньший объем, чем вероятности появления символов и тем более чем структура кодового дерева. Для пояснения алгоритма получения кодов Хаффмана при помощи длин кодов в качестве примера воспользуемся следующим палиндромом:
A MAN A PLAN A CANAL PANAMA
Палиндром состоит из восьми различных символов с частотами появления, приведенными в табл. 1.
Таблица 1
Частоты появления символов в палиндроме
Значение |
Частота |
A |
10 |
C |
1 |
L |
2 |
M |
2 |
N |
4 |
P |
2 |
Пробел |
6 |
. (точка) |
1 |
6
В этом алгоритме используются символы, связанные с длинами кодов, и списки значений со связанными с ними частотами. Первоначально кодируемому значению присваивается длина кода равная 0, и каждое значение помещается в отдельный список, которому назначается частота, равная частоте кодируемого значения из этого списка. Для рассматриваемого палиндрома данный алгоритм образует структуру, показанную на рис. 1.
|
|
|
|
A 0 |
10 |
|
|
|
|
|
|
|
|
|
|
C 0 |
1 |
|
|
|
|
|
|
|
|
|
|
L 0 |
2 |
|
|
|
|
|
|
|
|
|
|
M 0 |
2 |
|
|
|
|
|
|
|
|
|
|
N 0 |
4 |
|
|
|
|
|
|
|
|
|
|
P 0 |
2 |
|
|
|
|
|
|
|
|
|
|
_ 0 |
6 |
|
|
|
|
|
|
|
|
|
|
. 0 |
1 |
|
|
|
|
|
|
Рис. 1. Первый этап генерирования длин кодов Хаффмана
Для получения длин кодов соединим два списка с самыми низкими частотами. При объединении двух списков частота нового списка равна сумме частот двух прежних списков. Каждый раз при присоединении списка, частота каждого символа в списке увеличивается на единицу, а новый список перемещается на последнее место (записывается нижней строкой). Процесс повторяется до тех пор, пока не получится один список кодов. При наличии нескольких списков с наименьшей частотой из них всегда выбирается тот список, который расположен ближе всех к концу.
Наименьшие частоты принадлежат спискам с точкой и буквой С, поэтому объединяем эти списки и увеличиваем на единицу длины кодов для двух символов (рис. 2а).
В результате получаются четыре списка с наименьшей частотой равной 2. Выбираем два списка, ближайших к низу, и объединяем их (рис. 2б). Повторяя описанную выше процедуру, получаем структуры, показанные на рис. 2в-ж.
7
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
A 0 |
10 |
|
|
|
|
|
|
|
|
|
|
|
|
|
A 0 |
10 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
L 0 |
2 |
|
|
|
|
|
|
|
|
|
|
|
|
|
L 0 |
2 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
M 0 |
2 |
|
|
|
|
|
|
|
|
|
|
|
|
|
M 0 |
2 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
N 0 |
4 |
|
|
|
|
|
|
|
|
|
|
|
|
|
N 0 |
4 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
P 0 |
2 |
|
|
|
|
|
|
|
|
|
|
|
|
|
_ 0 |
6 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
_ 0 |
6 |
|
|
|
|
|
|
|
|
|
|
|
|
|
P 1 |
|
C 2 |
|
. 2 |
4 |
|
|
|
|
|
|
|
|
|
||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
C 1 |
|
. 1 |
2 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
а |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
б |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
|
A 0 |
10 |
|
|
|
|
|
|
|
|
|
|
|
|
|
A 0 |
10 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
|
N 0 |
4 |
|
|
|
|
|
|
|
|
|
|
|
|
|
N 0 |
4 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||
|
_ 0 |
6 |
|
|
|
|
|
|
|
|
|
|
|
|
|
_ 0 |
6 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
P 1 |
|
C 2 |
|
. 2 |
4 |
|
|
|
|
|
P 2 |
|
C 3 |
|
. 3 |
|
L 2 |
|
M 2 |
8 |
|
|
|
|
|||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
|
L 1 |
|
M 1 |
4 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
в |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
г |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
|
A 0 |
10 |
|
|
|
|
|
|
|
|
|
|
|
|
|
A 0 |
10 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
P 2 |
|
C 3 |
|
. 3 |
|
L 2 |
|
M 2 |
8 |
|
P 3 |
|
C 4 |
|
. 4 |
|
L 3 |
|
M 3 |
|
N 2 |
|
_ 2 |
18 |
|||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||
|
N 1 |
|
_ 1 |
10 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
д |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
е |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
P 4 
C 5 
. 5 
L 4 
M 4 
N 3 
_ 3 
A 1 28
ж
Рис. 2. Генерирование длин кодов Хаффмана
Если отсортировать символы по длине кода, получим длины кодов, приведенные в табл. 2. Используя алгоритм, блок-схема которого показана на рис. 3, можно сгенерировать из отсортированного списка коды Хаффмана. Входными данными будет массив длин кодов Хаффмана, подобных тем, что
8
приведены в табл. 1, а выходными массив кодов Хаффмана, сгенерированных для длин кодов.
Таблица 2
Символы палиндрома, отсортированные по длине кода
Символ |
Код длины |
A |
1 |
Пробел |
3 |
N |
3 |
L |
4 |
M |
4 |
P |
4 |
C |
5 |
. (точка) |
5 |
Для того чтобы алгоритм корректно завершил свою работу, к массиву длин кодов нужно добавить нулевую длину на последнюю позицию. Поэтому в примере работы данного алгоритма, рассмотренном ниже, входной массив будет содержать девять позиций, а не восемь.
начало |
c=0;s=1;k=0; |
- |
MD[k]==s |
+ |
MK←c |
c++;k++; |
+ |
MD[k]==0 |
- |
c<<=1; |
s++; |
+ |
MD[k]!=s |
- |
конец |
Рис. 3. Блок-схема алгоритма генерирования кодов Хаффмана по длинам кодов
9
На рис. 3 приняты следующие обозначения:
MD – массив длин кодов
MK – массив кодов Хаффмана с – текущий ход Хаффмана
s – текущая длина кода Хаффмана k – индекс массива длин
== - равно != - неравно = присвоить
← - увеличить массив на один элемент справа и добавить на это место указанное значение ++ - увеличить на единицу
<<= - сдвинуть значение влево на указанную величину с добавлением нулей справа.
Далее рассмотрим пример построения кодов Хаффмана по длинам с использованием алгоритма, представленного на рис. 3.
Входные данные: MD[9]={1,3,3,4,4,4,5,5,0}; MK[0]={};
1.c=0;s=1;k=0;
2.MD[0]==1 → MK={0};c=1;k=1;
3.MD[1]!=1
4.MD[1]!=0
5.c=10;s=2;
6.MD[1]!=2 → c=100;s=3;
7.MD[1]==3
8.MD[1]==3 → MK={0,100};c=101;k=2;
9.MD[2]==3 → MK={0,100,101};c=110;k=3;
10.MD[3]!=3
11.MD[3]!=0
12.c=1100;s=4;
13.MD[3]==4
14.MD[3]==4 → MK={0,100,101,1100};c=1101;k=4;
15.MD[4]==4 → MK={0,100,101,1100,1101};c=1110;k=5;
16.MD[5]==4 → MK={0,100,101,1100,1101,1110};c=1111;k=6;
17.MD[6]!=4
18.MD[6]!=0
19.c=11110;s=5;
20.MD[6]==5
21.MD[6]==5 → MK={0,100,101,1100,1101,1110,11110};c=11111;k=7;
22.MD[7]==5 → MK={0,100,101,1100,1101,1110,11110,11111};c=100000;k=8;
23.MD[8]!=5
24.MD[8]==0 → конец
Выходные данные: MK={0,100,101,1100,1101,1110,11110,11111};
10
