Domanda

Ho un'applicazione embedded dove uno scanner di immagini invia un flusso di pixel a 16 bit che vengono poi assemblati a un'immagine in scala di grigi. Come ho bisogno di entrambi salvare questi dati in locale e lo trasmette ad un'interfaccia di rete, mi piacerebbe per comprimere il flusso di dati per ridurre la larghezza di banda e lo spazio di archiviazione di rete richiesta.

C'è un semplice algoritmo che posso usare per comprimere senza perdita dei dati dei pixel?

ho pensato calcolando la differenza tra due pixel consecutivi e poi codifica questa differenza con un codice Huffman. Purtroppo, i pixel sono quantità a 16 bit senza segno quindi la differenza può essere ovunque nel range -65.535 .. 65.535 che porta ad potenzialmente enormi lunghezze codeword. Se un paio di parole di codice davvero lunghi si verificano in una fila, corro in problemi di buffer overflow.

Aggiornamento: la mia piattaforma è un FPGA

È stato utile?

Soluzione

PNG fornisce libero, open-source, senza perdita di dati compressione delle immagini in un formato standard con lo standard utensili. PNG utilizza zlib come parte della sua compressione. C'è anche una libpng. A meno che la vostra piattaforma è molto insolita, non dovrebbe essere difficile da questo codice in esso.

Altri suggerimenti

Quante risorse si hanno a disposizione sulla vostra piattaforma embedded?

zlib e fare la compressione gzip? Anche con risorse limitate, si dovrebbe essere in grado di porta qualcosa come o LZ88 .

Ci sono una vasta gamma di librerie di compressione delle immagini disponibili. Ad esempio, questa pagina liste nulla, ma le librerie / toolkit per le immagini PNG. Quale formato / biblioteca funziona meglio per voi molto probabilmente dipenderà dalle particolari vincoli di risorse si sta lavorando sotto (in particolare, se il vostro sistema embedded può fare aritmetica in virgola mobile).

L'obiettivo con la compressione senza perdita di dati è quello di essere in grado di prevedere il pixel successivo sulla base di pixel precedenti, e quindi per codificare la differenza tra la previsione e il valore reale del pixel. Questo è ciò che si pensiero iniziale di fare, ma si sono stati solo con il un pixel precedente e facendo la previsione che il prossimo pixel sarebbe stato lo stesso.

Tieni presente che se si dispone di tutti i pixel precedenti, si dispone di informazioni più rilevanti che solo il pixel precedente. Cioè, se si sta cercando di prevedere il valore di X, è necessario utilizzare i pixel O:

.. OOO ...
..OX

Inoltre, si potrebbe non si desidera utilizzare il pixel precedente, B, nel flusso di prevedere X nella seguente situazione:

OO ... B <- Fine riga
X <- Inizio della riga successiva

Invece si dovrebbe fare la vostra base previsione sul sistema operativo.

Come 'lossless' cosa hai bisogno?
Se questo è un vero e proprio scanner v'è un limite alla larghezza di banda / risoluzione in modo anche se è in grado di inviare +/- 64 K valori può essere unphysical per pixel adiacenti hanno una differenza di più di dire 8 bit.

In questo caso si può fare un valore iniziale di pixel per ogni riga e poi fare differenze tra ogni pixel.

Questo striscio i picchi, ma può essere che eventuali picchi di più di 'N'bits sono rumore comunque.

Un buon LZ77 / RLE ibrido con campane e wwhistles possono ottenere meraviglioso di compressione che è abbastanza veloce per decomprimere. Essi potranno anche essere più grande, compressori badder in file più piccoli a causa della mancanza di overhead biblioteca. Per una buona, ma GPLd implentation di questo, controlla PUCrunch

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top