Простое двухцветное дифференциальное сжатие изображений - PullRequest
1 голос
/ 06 мая 2010

Есть ли эффективный, быстрый и простой пример выполнения дифференциального ч / б сжатия изображений? Или, что еще лучше, некоторые простые (, но без потерь - зазубренные изображения размером 1 бит на дюйм не выглядят очень убедительно при сжатии с использованием сжатия с потерями), которые могут принимать в качестве входных данных несколько кадров?

У меня есть простой поток черно-белых изображений (320x200), отображающий что-то похожее на светодиодный дисплей, который обновляется примерно раз в секунду с помощью AJAX. Изображения в большинстве случаев очень похожи, поэтому, если вычесть их, результат будет довольно хорошо сжиматься (даже с простым RLE). Доступно ли что-то подобное?

1 Ответ

2 голосов
/ 06 мая 2010

Я не знаю ни одной уже существующей библиотеки, которая могла бы выполнять то, что вы просите, кроме как просто запустить ее через gzip или какой-либо другой алгоритм сжатия без потерь. Однако, поскольку вы знаете, что кадры сильно коррелированы, вы можете XOR кадры, как предложил Conspicuous Compiler, и затем запустить gzip для этого. Если между кадрами мало изменений, результат XOR должен иметь гораздо меньшую энтропию, чем исходный кадр. Это позволит gzip или другому алгоритму сжатия без потерь достичь более высокой степени сжатия.

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

Если вы просто заинтересованы в изучении сжатия, вы можете попробовать реализовать RLE после XORing кадров. Посмотрите RLE битового уровня, о котором говорилось здесь примерно на полпути вниз по странице. Это должно быть довольно легко реализовать, так как в каждом байте хранится 7-битная длина и одноразрядное значение, чтобы можно было достичь наилучшего коэффициента сжатия 128/8 = 16, если между кадрами нет изменений.

Другая мысль состоит в том, что если изменений очень мало, вы можете просто закодировать битовые позиции, которые переворачиваются между кадрами. Вы можете адресовать изображение размером 320x200 с 16-разрядным целым числом. Например, если изменяется только 100 пикселей, вы можете просто сохранить 100 16-битных целых чисел, представляющих те позиции (1600 бит), где обсуждаемое выше RLE будет принимать как минимум 64000/16 = 4000 бит (вероятно, это будет немного выше) , Вы можете переключаться между этим методом и RLE в зависимости от содержимого кадра.

Если вы хотите выйти за рамки простых методов, я бы предложил использовать коды переменной длины для представления возможных прогонов во время кодирования длин серий. Затем вы можете назначить более короткие коды прогонам с наибольшей вероятностью. Это будет аналогично RLE, используемому в JPEG или MPEG после выполнения сжатия с потерями (DCT и квантование).

...