2010-05-06 3 views
1

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

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

+0

Являются ли изображения только сохраненными как один бит на пиксель? –

+0

Это их бит-глубина, да. Их фактическое представление в памяти может быть изменено по мере необходимости (с одной точки они управляют объектами .NET Image с глубиной 1bpp, так как я использую .NET). Но это куча изображений, а не видеопоток. – Groo

+1

Я уверен, что это не самый эффективный метод, но я бы подумал сделать 1 пиксель за байт и XORing двух кадров. Все биты, значение которых изменилось, будут равны 1, большинство бит будут равны нулю. Затем run-length закодирует полученный массив. - Если вы отбросите какие-либо фреймы, это будет вести себя плохо. –

ответ

2

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

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

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

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

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

Смежные вопросы