Pregunta

I tener una aplicación embebida donde un escáner de imágenes envía una corriente de píxeles de 16 bits que más tarde se ensamblan a una imagen en escala de grises. Mientras que necesito tanto guardar estos datos a nivel local y la enviará a una interfaz de red, me gustaría para comprimir el flujo de datos para reducir el ancho de banda y espacio de almacenamiento de red necesaria.

¿Existe un algoritmo simple que puedo usar para comprimir sin pérdidas los datos de píxeles?

I primero pensó en el cálculo de la diferencia entre dos píxeles consecutivos y luego codifica esta diferencia con un código de Huffman. Por desgracia, los píxeles son sin signo de 16 bits cantidades por lo que la diferencia puede estar en cualquier lugar en el rango -65535 .. 65535 que conduce a longitudes de palabra de código potencialmente enormes. Si unas pocas palabras de código muy largas se producen en una fila, voy a tener problemas de desbordamiento de búfer.

Actualización: mi plataforma es una FPGA

¿Fue útil?

Solución

PNG proporciona libre, de código abierto, la compresión de imágenes sin pérdida en un formato estándar utilizando el estándar herramientas. PNG utiliza zlib como parte de su compresión. También hay un libpng. A menos que su plataforma es muy inusual, no debería ser difícil de puerto de este código a la misma.

Otros consejos

¿Cuántos recursos tiene disponible en su plataforma embebida?

¿Podría puerto zlib y hacer la compresión gzip? Incluso con recursos limitados, usted debería ser capaz de portar algo así como LZ88 .

Hay una amplia variedad de bibliotecas de compresión de imágenes disponibles. Por ejemplo, esta página listas nada más que las bibliotecas / kits de herramientas para imágenes PNG. ¿Qué formato / biblioteca que funciona mejor para usted lo más probable dependerá de las limitaciones de recursos particulares que están trabajando bajo (en particular, si su sistema embebido puede hacer aritmética de punto flotante).

El objetivo con la compresión sin pérdidas es ser capaz de predecir el siguiente píxel en función de píxeles anteriores, y luego codificar la diferencia entre su predicción y el valor real del píxel. Esto es lo que hace a la idea inicial, pero sólo se utilizaba el píxel anterior y haciendo la predicción de que el pixel siguiente sería el mismo.

Tenga en cuenta que si usted tiene todos los píxeles anteriores, usted tiene la información más relevante que solo el píxel anterior. Es decir, si usted está tratando de predecir el valor de X, se debe utilizar los píxeles S:

.. OOO ...
..OX

Además, usted no desea utilizar el píxel anterior, B, en la corriente de predecir X en la siguiente situación:

OO ... B <- Fin de la fila
X <- Comienzo de la siguiente fila

En lugar usted haría su base de predicción en el sistema operativo.

¿Cómo 'sin pérdida' se necesita?
Si se trata de un escáner real hay un límite en el ancho de banda / resolución por lo que incluso si se puede enviar +/- 64 K valores que puede ser no físico para los píxeles adyacentes tengan una diferencia de más que, por ejemplo 8 bits.

En este caso usted puede hacer un valor de píxel de inicio para cada fila y luego hacer diferencias entre cada píxel.

Esto frotis de los picos, pero puede ser que cualquier pico más 'N'bits son el ruido de todos modos.

Una buena LZ77 / híbrida RLE con campanas y wwhistles pueden obtener de compresión maravilloso que es bastante rápido para descomprimir. También serán más grandes, más malos compresores de archivos más pequeños debido a la falta de los gastos generales de la biblioteca. Para una buena, pero GPLd implementació de esto, echa un vistazo a PUCrunch

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top