Вопрос

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

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

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

Обновление: моя платформа является FPGA

Это было полезно?

Решение

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

Другие советы

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

Не могли бы вы портировать zlib И сжатие gzip? Даже с ограниченными ресурсами, вы должны быть в состоянии портировать что-то вроде Lz77 или lz88..

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

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

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

...Ooo ...
..Ox

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top