Методы сжатия цифровой информации Избыточность информации В русском языке существуют слова, однозначно прочитываемые в случае «потери» некоторых букв. Например, С_ НТ_ БРЬ, МОС_ , Д_ Р_ ВО. Для носителя языка обычный связный текст на его родном языке содержит избыточную информацию — ее можно удалить, но смысл текста для него сохранится. Определение. Кодирование информации является избыточным, если количество бит в полученном коде больше, чем это необходимо для однозначного декодирования исходной информации. Хранение и передача информации требуют определенной затраты ресурсов. Сжатие данных (перед сохранением или передачей по каналам связи) позволяет уменьшить эти затраты. Первые теоретические разработки в области сжатия информации относятся к концу 1940-х годов, когда была опубликована статья К. Шеннона «Математическая теория коммуникаций». Все методы сжатия можно поделить на два больших класса: обратимые и необратимые Обратимые алгоритмы только изменяют способ представления входных данных, приводя их к форме, которая более компактно кодируется. Для таких алгоритмов существуют обратные алгоритмы, которые могут точно восстановить исходные данные из сжатого массива. Обратимые методы можно применять для сжатия любых типов данных. Характерными форматами файлов, хранящих сжатую без потерь информацию, являются: • GIF, TIF, PCX, PNG — для графических данных; • AVI — для чередующихся видео- и звуковых данных; • ZIP, ARJ, RAR, LZH, LH, CAB — для любых типов данных. Алгоритмы обратимых методов Определение. Метод сжатия называется обратимым если из данных, полученных при сжатии, можно точно. Существует достаточно много обратимых методов сжатия данных, однако в их основе лежит сравнительно небольшое количество теоретических алгоритмов: Метод упаковки Алгоритм Хаффмана Алгоритм RLE Алгоритмы Лемпеля—Зива Алгоритм RLE В основу алгоритмов RLE (англ. Run-Length Encoding — кодирование путем учета числа повторений) положен принцип выявления повторяющихся последовательностей данных и замены их простой структурой: повторяющимся фрагментом и коэффициентом повторения. Упаковка информации методом RLE-кодирования состоит в следующем. Упакованная последовательность содержит управляющие байты, за каждым управляющим байтом следует один или несколько байтов данных. Если старший бит управляющего байта равен 1, то следующий за управляющим байт данных при распаковке нужно повторить столько раз, сколько записано в оставшихся 7 битах управляющего байта. Если же старший бит управляющего байта равен 0, то надо взять несколько следующих байтов данных без изменения. Сколько именно – записано в оставшихся 7 битах управляющего байта. Например, управляющий байт 10000111 говорит о том, что следующий за ним байт надо повторить 7 раз, а управляющий байт 00000100 – о том, что следующие за ним 4 байта надо взять без изменений. После кодирования методом RLE получилась следующая последовательность байтов (первый байт – управляющий): 10000011 10101010 00000010 10101111 11111111 10000101 10101010. Сколько байт будет содержать данная последовательность после распаковки? Впишите в бланк только число. Ответ: 10 Упаковка информации методом RLE-кодирования состоит в следующем. Упакованная последовательность содержит управляющие байты, за каждым управляющим байтом следует один или несколько байтов данных. Если старший бит управляющего байта равен 1, то следующий за управляющим байт данных при распаковке нужно повторить столько раз, сколько записано в оставшихся 7 битах управляющего байта. Если же старший бит управляющего байта равен 0, то надо взять несколько следующих байтов данных без изменения. Сколько именно – записано в оставшихся 7 битах управляющего байта. Например, управляющий байт 10000111 говорит о том, что следующий за ним байт надо повторить 7 раз, а управляющий байт 00000100 – о том, что следующие за ним 4 байта надо взять без изменений. После кодирования методом RLE получилась следующая последовательность байтов (первый байт – управляющий): 00000011 10101010 00000010 10101111 10001111 11111111. Сколько байт будет содержать данная последовательность после распаковки? Впишите в бланк только число. Ответ: 18 Упакуйте методом RLE следующую последовательность байтов: 11111111 11111111 11111111 11111111 11111111 11110000 00001111 11000011 10101010 10101010 10101010 10101010 Управляющий байт, начинающийся с 1, указывает, сколько раз нужно повторить следующий за ним байт: 10000101 11111111 Управляющий байт, начинающийся с 0, указывает, сколько следующих за ним байт нужно взять без изменений: 00000011 11110000 00001111 11000011 Затем опять: 10000100 10101010 Итого: 10000101 11111111 00000011 11110000 00001111 11000011 10000100 10101010 Получили суммарный выигрыш в 4 байта. Программные реализации алгоритмов RLE отличаются простотой и высокой скоростью работы, но обеспечивают в среднем невысокое сжатие. Наилучшие объекты для сжатия – графические изображения, в которых большие одноцветные участки. Различные реализации метода RLE используются в графических файлах форматов PCX, BMP, при факсимильной передаче информации. Для текстовых данных методы RLE, как правило, неэффективны. Метод упаковки Суть метода упаковки заключается в уменьшении количества бит, отводимых для кодирования символов, если в сжимаемом массиве данных присутствует только небольшая часть используемого алфавита. Пример . Допустим, входной текст состоит только из десятичной записи целых чисел и знаков «минус», разделенных пробелами (например, «280 - 1296 48 40 365 - 159 13 777»). Множество символов, встречающихся в таком тексте, состоит всего из 12 символов (цифры от «0» до «9», знак «-» (минус) и пробел). Для кодирования такого количества символов достаточно всего четырех бит. Если упаковать коды данных символов в 4 бита (например, так: «0» —> «0000», «1» —» «0001», ... «9» —> «1001», «-» —> «1110», пробел -> «1111»), то можно будет кодировать по два символа входного текста одним байтом в выходном массиве. В результате получим двукратное сжатие данных. Формат записи чисел, при котором число записывается в десятичной системе, а цифры числа кодируются 4-битовыми кодами, называется BCD-форматом (Binary Coded Decimal, или двоично-десятичная запись). BCD-формат нередко используется в программировании для хранения целых чисел, например в базах данных. Метод упаковки дает хорошие результаты, только если множество используемых символов невелико. Например, если в тексте используются только прописные русские буквы и знаки препинания, то текст может быть сжат всего на 25% : 33 русские буквы плюс пробел и знаки препинания — итого около 40 символов. Для их кодирования достаточно 6 бит. При упаковке текст уменьшится до 6/8=3/4 от первоначального объема. Задача. Сколько байт будет занимать текст «КОЛ_ОКОЛО_КОЛОКОЛА» после сжатия методом упаковки. Входной текст «КОЛ_ОКОЛО_КОЛОКОЛА» содержит всего 5 различных символов («К», «О», «Л», «А» и пробел), следовательно, каждый символ может быть закодирован тремя битами. Всего в исходном тексте 18 символов, так что потребуется 18 * 3 = 54 бита. Округлив это значение с избытком до целого числа байт, получим размер сжатого массива — всего 7 байт. Коэффициент сжатия равен 18/7 = 2,(571428) * 2,6. Для метода упаковки подсчитайте коэффициент сжатия текста, содержащего только прописные английские буквы, пробелы и знаки препинания (точка, запятая, дефис). Решение: Прописных латинских букв – 26, разделителей - 4. Всего 30 символов. Достаточно 5 бит на символ. Сжатие 8/5 от первоначального объема. 8/5=1,6. Ответ: коэффициент сжатия 1,6 2. Для метода упаковки подсчитайте коэффициент сжатия текста, содержащего прописные и строчные русские буквы, пробелы, цифры и знаки препинания (точка, запятая, дефис). Решение: 33+33=66 +14 разделителей. Всего 80 символов. Достаточно 7 бит на символ. Сжатие 8/7 от первоначального объема. 8/7=1,14. 1. Алгоритм Хаффмана Улучшения степени сжатия можно достичь, кодируя часто встречающиеся символы короткими кодами, а редко встречающиеся — более длинными. Именно такова идея метода, опубликованного Д. Хаффманом (Huffman) в 1952 г. Алгоритм Хаффмана сжимает данные за два прохода: на первом проходе читаются все входные данные и подсчитываются частоты встречаемости всех символов. Затем по этим данным строится дерево кодирования Хаффмана, а по нему — коды символов. После этого, на втором проходе, входные данные читаются еще раз и при этом генерируется выходной массив данных. Алгоритм построения дерева Хаффмана 1. Символы входного алфавита образуют список свободных узлов. Каждый узел имеет вес, равный количеству вхождений символа в исходное сообщение. 2. В списке выбираются два свободных узла с наименьшими весами. 3. Создается их узел-«родитель» с весом, равным сумме их весов, он соединяется с «детьми» дугами. 4. Одной дуге, выходящей из «родителя», ставится в соответствие бит 1, другой — бит 0. 5. «Родитель» добавляется в список свободных узлов, а двое его «детей» удаляются из этого списка. 6. Шаги, начиная со второго, повторяются до тех пор, пока в списке свободных узлов не останется только один свободный узел. Он и будет считаться корнем дерева. Пример 34. Построение дерева Хаффмана и префиксных кодов для текста «КОЛ_ОКОЛО_КОЛОКОЛА»: Теперь для определения кода каждой конкретной буквы необходимо просто пройти от вершины дерева до этой буквы, выписывая нули и единицы по маршруту следования. В нашем примере символы получат следующие коды: После того как коды символов построены, остается сгенерировать сжатый массив данных, для чего надо снова прочесть входные данные и каждый символ заменить на соответствующий код. В нашем случае непосредственно код текста будет занимать 39 бит, или 5 байт. Коэффициент сжатия равен 18/5 = 3,6. Для восстановления сжатых данных необходимо снова воспользоваться деревом Хаффмана, так как код каждого символа представляет собой путь в дереве Хаффмана от вершины до конечного узла дерева, соответствующего данному символу. Код Хаффмана является префиксным. Это означает, что код каждого символа не является началом кода какого-либо другого символа. Постройте дерево Хаффмана и выпишите коды символов для сообщения: «на_дворе_трава,_на_ траве_дрова» (пробелы обозначены _) а в д , е н р о т _ 6 4 2 1 2 2 4 2 2 5 3 4 0 4 1 0 1 0 1 а в д , е н р о т _ 6 4 2 1 2 2 4 2 2 5 8 7 0 1 1 0 0 1 4 1 0 1 4 0 1 а в д , е н р о т _ 6 4 2 1 2 2 4 2 2 5 8 7 0 1 0 1 0 1 0 1 4 1 0 9 1 4 0 1 а в д , е н р о т _ 6 4 2 1 2 2 4 2 2 5 17 13 0 1 8 7 9 0 0 1 1 0 0 1 0 1 0 1 4 1 4 0 1 а в д , е н р о т _ 6 4 2 1 2 2 4 2 2 5 30 1 0 17 13 0 1 8 7 9 0 0 1 1 0 0 1 0 1 0 1 4 1 4 0 1 а в д , е н р о т _ 6 4 2 1 2 2 4 2 2 5 а в д , е н р о т _ 6 4 2 1 2 2 4 2 2 5 00 010 0110 0111 1000 1001 101 1100 1101 111 коэффициент сжатия при методе упаковки: 10 символов - 4 бита. Весь текст – 120 бит. По алгоритму Хаффмана: 2*6+3*4+4*2+4*1+4*2+4*2+3*4+4*2+4*2+3*5=95 бит 120/95=1,26 коэффициент сжатия по сравнению с кодом ASCII: 30*8=240 бит 240/95=2,53 Для декодирования сжатого сообщения вместе с ним обычно пересылаются не коды исходных символов, а сам орграф Хаффмана (без указания веса корня и разметки на дугах, ибо она стандартна: дуга, идущая влево, размечается 0, а идущая вправо – 1). Математики доказали, что среди алгоритмов, которые каждый символ кодируют по отдельности целым количеством бит, алгоритм Хаффмана обеспечивает наилучшее сжатие. Упражнения. В каждом задании вычислить коэффициент сжатия. Упакуйте методом RLE следующую последовательность байтов: 11011111 11011111 11011111 11111111 11111111 11110000 00001111 11000011 10101011 10101011 10101011 10101011 Ответ: 10000011 11011111 10000010 11111111 00000010 100000100 10101011 После кодирования методом RLE получилась следующая последовательность байтов (первый байт – управляющий): 10000011 10101010 00000011 10101111 10001111 11111111. Сколько байт будет содержать данная последовательность после распаковки? Впишите в бланк только число. Ответ:6 Сколько байт будет занимать текст (12 – 56,07) * 43 +28,9: 3,2 после сжатия методом упаковки. Ответ: 17 символов – 5 бит. 30*5=150 бит; 30*8=240 бит. К=24/15 Постройте дерево Хаффмана и выпишите коды символов для сообщения: «мамаша мыла малыша». а 6 м 4 _ 2 л 2 ы 2 ш 2 Упражнения из ЕГЭ Демо 2012 А9 Для кодирования некоторой последовательности, состоящей из букв А, Б, В, Г и Д, решили использовать неравномерный двоичный код, позволяющий однозначно декодировать двоичную последовательность, появляющуюся на приёмной стороне канала связи. Использовали код: А-1, Б-000, В—001, Г-011. Укажите, каким кодовым словом должна быть закодирована буква Д. Длина этого кодового слова должна быть наименьшей из всех возможных. Код должен удовлетворять свойству однозначного декодирования. 1) 00 2) 01 3) 11 4) 010 Ответ: 4) ЕГЭ 2011 А5 А-01, Б-10, В—000, Г-001. 1)110 2)11 3)111 4)00 Ответ: 2) ЕГЭ 2010 А11 А-1, Б-01, В—001 1)000 2)0001 3)11 4)101 Ответ: 1) Алгоритмы Лемпеля—Зива LZ77 и LZ78 Кодируются не отдельные буквы, как в алгоритме Хаффмана, а слова. Общая схема алгоритма LZ77 такова (это не точное описание алгоритма): • входные данные читаются последовательно, текущая позиция условно разбивает массив входных данных на прочитанную и непрочитанную части; • для цепочки первых байтов непрочитанной части ищется наиболее длинное совпадение в прочитанной части. Если совпадение найдено, то составляется комбинация {смещение, длина}, где смещение указывает, на сколько байтов надо сместиться назад от текущей позиции, чтобы найти совпадение, а длина — это длина совпадения; • если запись комбинации {смещение, длина} короче совпадения, то она записывается в выходной массив, а текущая позиция перемещается вперед (на длину совпадающей части); • если совпадение не обнаружено или оно короче записи комбинации {смещение, длина}, то в выходной массив копируется текущий байт, текущая позиция перемещается вперед на 1, и анализ повторяется. Пример. Фраза КОЛОКОЛ_ОКОЛО_КОЛОКОЛЬНИ закодируется алгоритмом LZ77 как КОЛО(-4,3)_(-5,4)0_(-14,7)ЬНИ. Общая схема алгоритма LZ78 такова (это не точное описание алгоритма): • алгоритм во время сжатия текста создает специальный словарь повторяющихся цепочек, в словаре каждой цепочке соответствует короткий код; • для цепочки первых байтов непрочитанной части ищется наиболее длинное совпадение в словаре. Код совпадения записывается в выходной массив, туда же заносится первый несовпавший символ, и текущая позиция перемещается вперед на длину совпадения + 1; • в словарь добавляется новое слово: «совпадение» + «несовпавший символ», и процесс повторяется до тех пор, пока не будет сжат весь входной массив. Алгоритмы Лемпеля—Зива тем лучше сжимают текст, чем больше размер входного массива. Характерной особенностью обратных алгоритмов LZ77 и LZ78 является то, что, кроме самих сжатых данных, никакой дополнительной информации им не требуется. Для сравнения: в алгоритме Хаффмана вместе со сжатыми данными требуется сохранять дерево Хаффмана, иначе распаковка будет невозможна. Методы сжатия с регулируемой потерей информации Как оказалось, для аудио- и видеоинформации абсолютно точное восстановление необязательно. Проведенные в конце XX века исследования психофизиологических характеристик зрения и слуха обнаружили ряд особенностей человеческого восприятия, использование которых позволяет существенно увеличивать степень сжатия звуковой, графической и видеоинформации. Например, было установлено, что глаз человека наиболее чувствителен к зеленому цвету, чувствительность к красному ниже примерно в 4 раза, а к синему — почти в 10 раз! А это означает, что на хранение информации о красной и синей составляющих цвета можно было бы отводить меньше бит. Но в большинстве форматов графических файлов это не так — цветовые компоненты кодируются одинаковым количеством бит. Этот пример показывает, что традиционные способы представления видеоинформации обладают очень большой степенью избыточности, при условии, что речь идет о воспроизведении видеоинформации для человека. Для разработки и стандартизации эффективных методов сжатия аудио- и видеоинформации на рубеже 19801990-х годов были созданы Группа экспертов по фотографическим изображениям (Joint Photographic Experts Group, сокр. JPEG) и Группа экспертов по видеоизображениям (Motion Picture Experts Group, сокр. MPEG). К середине 1990-х годов были разработаны специальные высокоэффективные методы сжатия аудио- и видеоинформации, учитывающие особенности человеческого слуха и зрения. Характерной чертой этих методов является возможность регулируемого удаления маловажной (для человеческого восприятия) информации. Поэтому такие алгоритмы сжатия обобщенно называют алгоритмами с регулируемой потерей информации. Алгоритмы сжатия с регулируемой потерей информации выделяют во входных данных существенную информацию и ту часть, которой можно пренебречь. За счет удаления части информации удается добиться очень большой степени сжатия данных при субъективно незначительной потере качества аудиои видеоданных. Алгоритмы с регулируемой потерей информации не универсальны, они не могут использоваться для сжатия любых данных, поскольку полное восстановление исходной информации невозможно. Наиболее известными методами сжатия с регулируемой потерей информации являются: • JPEG — метод сжатия графических данных; • MPEG — группа методов сжатия видеоданных; • МРЗ — метод сжатия звуковых данных. Алгоритм JPEG Алгоритм JPEG используется для сжатия статических изображений. Помимо сжимаемого изображения, алгоритму передается также желаемый коэффициент сжатия — этот параметр регулирует долю информации, которая будет удалена при сжатии. Алгоритм JPEG способен упаковывать графические изображения в несколько десятков раз, при этом потери качества становятся заметными только при очень высоких коэффициентах сжатия. Алгоритм МРЗ Алгоритм МРЗ (точное название MPEG-1 Layer 3) является частью стандарта MPEG и описывает сжатие аудиоинформации. Помимо сжимаемого звукового фрагмента алгоритму передается также желаемый битрейт (англ. bitrate) — количество бит, используемых для кодирования одной секунды звука. Этот параметр регулирует долю информации, которая будет удалена при сжатии. Сжатие МРЗ также осуществляется в несколько этапов: звуковой фрагмент разбивается на небольшие участки — фреймы (англ. frames), а в каждом фрейме звук разлагается на составляющие звуковые колебания, которые в физике называют гармониками. С точки зрения математики, звук разлагается на группу синусоидальных колебаний с разными частотами и амплитудами. Затем начинается психоакустическая обработка — удаление маловажной для человеческого восприятия звуковой информации, при этом учитываются различные особенности слуха. Желаемый битрейт определяет, какие эффекты будут учитываться при сжатии, а также количество удаляемой информации. На последнем этапе оставшиеся данные сжимаются алгоритмом Хаффмана. Алгоритм МРЗ позволяет сжимать звуковые файлы в несколько раз. При этом даже самый большой битрейт 320 Кбит/с стандарта МРЗ обеспечивает четырехкратное сжатие аудиоинформации по сравнению с форматом Audio CD, при таком же субъективном качестве звука. Формат МРЗ стал стандартом де-факто для распространения музыкальных файлов через Интернет. Алгоритмы MPEG Как уже упоминалось, MPEG — это целое семейство методов сжатия видеоданных. В них используется очень большое количество приемов сжатия, даже краткое перечисление которых заняло бы несколько страниц. Они опираются на несколько базовых идей, а различаются конкретной реализацией алгоритмов. Одна из основных идей сжатия видео — метод «опорного кадра» — заключается в том, чтобы сохранять не целиком кадры, а только изменения кадров. Например, в фильме есть сцена беседы героев в комнате. При этом от кадра к кадру меняются только выражения лиц, а большая часть изображения неподвижна. Закодировав первый кадр сцены и отличия остальных ее кадров от первого, можно получить очень большую степень сжатия. Еще один способ уменьшения кодируемой информации заключается в том, чтобы быстро сменяемые участки изображения кодировать с качеством, которое намного ниже качества статичных участков, — человеческий глаз не успевает рассмотреть их детально. Разновидности формата MPEG отличаются друг от друга по возможностям, качеству воспроизводимого изображения и максимальной степени сжатия: • MPEG-1 — использовался в первых Video CD (VCD-I); • MPEG-2 — используется в DVD и Super Video CD (SVCD, VCD-II); • MJPEG — формат сжатия видео, в котором каждый кадр сжимается по методу JPEG; • MPEG-4 — популярный эффективный формат сжатия видео; • DivX, XviD — улучшенные модификации формата MPEG-4.