5

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

Есть ли простой алгоритм, который я могу использовать для без сжатия данных пикселей?

Сначала я подумал о вычислении разницы между двумя последовательными пикселями и затем кодировании этой разницы с кодом Хаффмана. К сожалению, пиксели представляют собой неподписанные 16-битные величины, поэтому разница может быть где угодно в диапазоне -65535 .. +65535, что приводит к потенциально огромным длинам кодового слова. Если в строке возникает несколько действительно длинных кодовых слов, я столкнулся с проблемами переполнения буфера.

Update: моя платформа является FPGA

+0

У меня такая же проблема, не на FPGA, но с использованием ARM и мои данные - 12 бит. Что вы в конечном итоге использовали? – user4749

ответ

8

PNG обеспечивает бесплатное сжатие изображений с открытым исходным кодом без потерь в стандартном формате с использованием стандартных инструментов. PNG использует zlib как часть его сжатия. Существует также libpng. Если ваша платформа не очень необычной, ее не следует переносить на этот код.

+0

ли JPG больше не подходит для сканирования по шкале серого? –

+2

@Matthew, название говорит «без потерь». Существует нестандартный режим без потерь для JPEG, но я думаю, что лучшим выбором будет PNG. –

+0

Также используйте соответствующий фильтр PNG, поскольку LZ/Huffman не использует двухмерное предсказательное сжатие. http://www.w3.org/TR/PNG-Filters.html Кроме того, разрешите конечному пользователю устройства выбирать меньшее количество бит на выборку, поскольку наименее значимые биты не являются сжимаемыми и увеличивают данные размер значительно. На уровне аппаратного обеспечения/протокола просто обнуление ненужных битов в источнике улучшит сжимаемость. – rwong

3

Сколько ресурсов у вас есть в наличии на вашей встроенной платформе?

Можете ли вы порт zlib и сделать сжатие gzip? Даже с ограниченными ресурсами вы должны иметь возможность переносить что-то вроде LZ77 or LZ88.

+0

Спасибо за ваши предложения. Методы, основанные на словарях, такие как те, которые вы предложили, скорее всего подходят для задачи, чем кодирование хаффмана. Что касается ресурсов, я хочу реализовать это на FPGA. У меня нет процессора. – geschema

3

Существует множество доступных библиотек сжатия изображений. Например, this page перечисляет только библиотеки/инструментарий для изображений PNG. Какой формат/библиотека лучше всего подходит для вас, скорее всего, будут зависеть от конкретных ограничений ресурсов, над которыми вы работаете (в частности, может ли ваша встроенная система выполнять арифметику с плавающей запятой).

2

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

Имейте в виду, что если у вас есть все предыдущие пиксели, у вас есть более релевантная информация, чем только предыдущий пиксель. То есть, если вы пытаетесь предсказать значение X, вы должны использовать пикселы O:

..OOO ...
..OX

Кроме того, вы не хотели бы использовать предыдущий пикселей, B, в потоке, чтобы предсказать X в следующей ситуации:

OO ... B < - Конец строки
X < - начало следующей строки

Вместо этого вы бы свою базу прогнозирования на Ос.

1

Как вам «без потерь»?
Если это реальный сканер, существует ограничение на пропускную способность/разрешение, поэтому даже если он может отправлять значения +/- 64K, это может быть нефизическим для смежных пикселей, чтобы иметь разницу более чем на 8 бит.

В этом случае вы можете сделать начальное значение пикселя для каждой строки, а затем сделать различия между каждым пикселем.

Это размажет пики, но может случиться так, что любые пики больше, чем «N'биты».

+0

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

1

Хороший гибрид LZ77/RLE с колокольчиками и wwhistles может получить прекрасное сжатие, которое довольно быстро распаковывается. Они также будут более крупными компрессорами-баддерами на небольших файлах из-за нехватки ресурсов накладных расходов. Для хорошего, но GPLd имплантация этого, проверьте PUCrunch

+0

PUCrunch находится под LGPL. –

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