2013-03-07 12 views
5

Sto osservando il problema di ridurre lo spazio di archiviazione durante l'archiviazione di più immagini JPEG insieme come un'unica immagine più grande. L'intuizione di base è che le immagini tendono ad avere alcune somiglianze (come quelle prese nello stesso luogo o intorno allo stesso punto del tempo) e possiamo sfruttare questa somiglianza per risparmiare spazio?Compressione immagine JPEG

Il flusso complessivo è: ingresso JPG Immagini -> Ogni immagine convertiti in RGB Tiles Immagine -> Riorganizza simili RGB piastrelle insieme -> Ancora una volta a trasformare in formato JPG. Naturalmente, durante il recupero delle immagini, sarà necessario il invertire il processo.

Utilizzando il coefficiente DC del componente Y come misura di somiglianza per la riorganizzazione delle piastrelle, ho ottenuto un risparmio di spazio dell'8% per 10 immagini. Quando lo faccio per 100 immagini, i risparmi si riducono a ~ 3%.

  • Come posso ottenere risparmi dopo tegola riorganizzazione - vale a dire quale parte del processo di codifica JPEG sfrutta questa immagine Mattonelle di riorganizzazione?

  • Invece di coefficiente DC del componente Y, ci sono alcune altre metriche si potrebbe pensare che sarà meglio sfruttato dai codifica JPEG


revisione:

c'è qualche altro formato immagine oltre a JPG che può sfruttare questo tipo di somiglianza meglio quando si aggregano più immagini? Ad esempio PNG?

risposta

5

Probabilmente stai usando JFIF per la codifica.

Non sono sicuro di come si prevede che questo metodo funzioni. Se ho capito bene, stai dividendo le immagini in tessere, aggregandole in una mega-immagine, con tessere "simili" disposte l'una vicina all'altra.

AFAIK, le implementazioni JPEG eseguono un DCT separato per singola tessera 8x8 in un'immagine, denominata macroblocco . In altre parole, JPEG non può sfruttare la coerenza tra i macroblocchi adiacenti (che sembra essere l'assunto fondamentale per la tua tecnica di compressione).

Se le tue tessere sono più grandi dei macroblocchi, non vedrai alcun miglioramento oltre ai risparmi nello spazio dell'intestazione dell'immagine.

Ad esempio: 10 intestazioni di immagine JPG sostituite da 1 consentono di risparmiare il 90% di spazio, ma solo nell'intestazione. Quando si guarda il file generale, l'intestazione è una piccola parte dell'intero file, quindi i risparmi di spazio sono scarsi. Quando si sostituiscono 100 intestazioni di immagine di 1, si salva il 99%, ma di nuovo solo nell'intestazione. In entrambi i casi, tutti i macroblocchi continuano a essere codificati e memorizzati esattamente come prima.

+0

Grazie, ha molto senso! Io uso libjpeg per fare la codifica e la decodifica. Come JPEG fa DCT all'interno di macroblocchi 8x8, la somiglianza tra le tessere (più grande dei macroblocchi) probabilmente non aiuta molto. Ma, penso che i coefficienti DCT dei macroblocchi vicini siano codificati relativamente, e questo potrebbe essere migliorato da questa riorganizzazione delle tessere in una certa misura. Ho rivisto la mia domanda - per favore dai un'occhiata. – user655617

+0

Contento di poter aiutare a chiarire le cose. Sì, libjpeg è l'implementazione JFIF di riferimento dello standard JPEG di IJG. Non ricordo i coefficienti DCT che usano la codifica delta (tra macroblocchi vicini). AFAIR, ogni macroblocco diventa una singola matrice 8x8 di coefficienti, che viene quindi decimata (divisa per ridurre il numero di bit necessari per memorizzarli - ed è qui che la "perdita" nella compressione con perdite viene da), e letta in zig -Zag moda. Questo ordine produce long run di 0, che vengono compressi in modo efficiente tramite la codifica run-length (invece di memorizzare 17 zeri, noi memorizziamo 17, 0). –

2

Ci sono due aree dove potrete vedere i benefici:

In primo luogo, quando si mette regioni simili uno accanto all'altro (soprattutto se i bordi delle immagini corrispondono perfettamente con discontinuità - anche se questo sarà molto raro), la parte DCT (frequency space) dell'algoritmo jpeg funziona approssimando progressivamente le regioni big-ish (non è sicuro quale sia la dimensione maggiore), quindi osservando l'errore tra l'approssimazione della regione grande e di più regioni più piccole, e produrre una correzione più localizzazione.

Sospetto che questo effetto sia piccolo, a meno che le immagini non siano molto simili a o molto piccole (in modo che i loro bordi siano lunghi proporzionalmente alla loro area).

secondo, la Huffman coding parte della compressione JPEG vedrà un vantaggio perché gli stessi schemi di bit apparirebbero in più sotto-immagini, ed essere compressi con lo stesso (breve) token).

Questo aspetto non dipende dalla disposizione in cui vengono compresse le immagini, purché si trovino nella stessa immagine.

+0

Grazie per la risposta! Non sono sicuro della tua prima parte. Ma, penso che la codifica di huffman possa sfruttarla a tal punto che divida l'output finale in più immagini, ognuna con tessere simili. Ma, non penso che questo spieghi il risparmio di spazio che ottengo. Ho riformulato la mia domanda - per favore date un'occhiata. – user655617