Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
68
Добавлен:
02.05.2014
Размер:
359.94 Кб
Скачать

Удаление шума и дифференцирование

LZW позволяет хорошо сжимать данные различной пиксельной глубины. И 1-, и 8-, и 24-битовые изображения сжимаются не хуже, чем при помощи RLE-схем. Однако изображения с шумом могут значительно уменьшить эффективность сжатия при помощи LZW. Удаление шума, осуществляемое обычно посредством обнуления одной или двух младших битовых плоскостей изображения, позволяет повысить эффективность сжатия. Другими словами, если ваши данные плохо сжимаются, их следует преобразовать в другую форму, которая будет сжиматься лучше.

Один из методов, позволяющих преобразовать данные в более "сжимаемую" форму посредством уменьшения избыточности информации изображения, называется дифференцированием. Идея этого метода состоит в том, что несвязанные данные могут быть легко конвертированы при помощи обратимого преобразования в форму, позволяющую более эффективно применить алгоритм кодирования. Дифференцирование основано на том, что во многих изображениях с непрерывными тонами значения соседних пиксельных величин различаются весьма незначительно. Если мы заменим значение пикселя разностью между этим значением и значением соседнего пикселя, то уменьшим объем сохраненной информации без потерь.

В 1-битовых монохромных и 8-битовых полутоновых изображениях пиксельные значения уже дифференцированы. RGB-пиксели должны дифференцироваться раздельно по каждому цветовому каналу (красные из красных, зеленые из зеленых и синие из синих).

Обычно применяется горизонтальное дифференцирование, т.е. по строкам развертки. В приведенном ниже примере кода этот алгоритм начинает работу с последнего пикселя первой строки развертки растра. Вначале вычисляется разность между последними двумя пикселями в строке, затем полученный результат записывается вместо последнего пикселя. После этого происходит перемещение на один пиксель влево, а обработка строки развертки продолжается вплоть до конца растра:

/* Horizontally difference a bitmap */ for (Line = 0; Line NumberOfLines; Line++)

for (Pixel = NumberOfPixelsPerLine - 1; Pixel = 1; Pixel-) Bitmap[Line][Pixel] -= Bitmap[Line][Pixel]-1];

Применяемые в некоторых случаях методы вертикального и двухмерного дифференцирования работают аналогичным образом. Разные типы дифференцирования имеют самую различную эффективность, зависящую от содержимого изображения. Однако дифференцированные изображения сжимаются с помощью LZW значительно более эффективно.

Варианты алгоритма lzw

В некоторых программах используются различные варианты алгоритма LZW, отличающиеся большой эффективностью. В одном из наиболее общих его вариантов применяются индексные указатели переменной длины (обычно они наращиваются с 9 битов до 12 или 13 битов). После того как индексный указатель конкретной длины был использован, к нему добавляется еще один бит — для повышения точности.

Другой популярный вариант LZW-компрессоров постоянно отслеживает процесс сжатия на снижение эффективности. Если такое снижение было зафиксировано, то последние из использованных фраз (LRU) удаляются из словаря, чтобы освободить место для новых фраз, либо перестраивается весь словарь.

Вариант LZMW строит фразы путем конкатенации двух фраз, а не конкатенации текущей фразы и следующего символа данных, что позволяет быстро строить длинные строки за счет усложнения данных словаря.

Алгоритм LZW настолько прост, что говорить об особой эффективности не приходится. Принимая решение о том, когда удалять фразы из словаря и, особенно, как искать данные в нем в процессе кодирования (применяя хеширование или древовидную схему), нужно учитывать необходимость повышения эффективности и скорости.

Стандартный алгоритм LZW слишком общий, поэтому реализуются его варианты. Например, форматы TIFF и GIF используют такие стандартные свойства алгоритма LZW, как код очистки (указывающий на необходимость очистки таблицы строк развертки), код конца файла (EOF) и ограничение ширины закодированного символа 12 битами. Однако GIF рассматривает каждое пиксельное значение как отдельный входной символ, следовательно, начальная ширина сжатого символа и значения кодов очистки и EOF изменяются в зависимости от пиксельной глубины подлежащего сжатию изображения.

Кроме того, GIF записывает сжатые коды в порядке "младший в младшем", невзирая на родной порядок битов машины, на которой реализован алгоритм. Когда в один байт записываются два кода, то первый из них помещается в младшие биты. Если код записывается без учета границ байта, то его младшие биты записываются в младших байтах.

Вариант LZW, примененный в TIFF, всегда читает из несжатых данных 8-битовые входные символы (невзирая на пиксельную глубину). В этом случае каждый символ может содержать один пиксель, более одного пикселя или только часть пикселя, что зависит от пиксельной глубины изображения. TIFF, в отличие от GIF, всегда записывает сжатые коды с первым старшим битом. Не смешивайте индикатор порядка байтов в заголовке TIFF или значение тега FillOrder с порядком битов сжатых LZW-данных. В TIFF-файле данные LZW всегда записаны в порядке битов "старший в младшем".

Последний вариант LZW содержит маленькую неточность. Ширина сжатого кода должна наращиваться на единицу раньше, чем это необходимо. Например, компрессор переходит с 9-битовых кодов на 10-битовые после добавления в таблицу кода 511, не ожидая пока будет добавлен код 512. Таким образом, один бит теряется.

Объясняется такая практика ошибкой, которая содержится в реализации LZW, поставляемой фирмой Aldus в TIFF Developer's Toolkit, хотя сама спецификация TIFF 5.0 описывает алгоритм LZW корректно. К тому времени, когда эта неточность была обнаружена (Сэмом Леффлером, главой Консультативного комитета TIFF), существовало слишком много программ, применявших эту ошибочную реализацию, и не было способа выявить некорректно закодированные данные. Приняли решение изменить спецификацию TIFF с учетом этого "варианта", поскольку было слишком сложно изменить TIFF Developer's Toolkit, превратив этим все существующие программы и созданные ранее изображения в некорректные и бесполезные.

Соседние файлы в папке Лекции по компьютерной графике