2011-12-28 16 views
5

Devo ridimensionare e decomprimere un set di immagini JPG di dimensioni 4608 x 3456. Al momento, sono già stato in grado di decomprimere correttamente le immagini in formato RGB e convertirle in bitmap.Downscaling JPG durante decompressione JPG

Ora ho bisogno di implementare il downscale e da quello che ho letto fino ad ora per ridimensionare correttamente un'immagine si dovrebbe usare l'Interpolazione Bilineare. Quindi dovrei sostituire i pixel (2x2) che sono stati usati per l'interpolazione dal pixel risultante dall'interpolazione. Ho bisogno del circa a 1/4 della sua dimensione attuale.

Non sono così preoccupato per la qualità delle immagini downscaled, come sono circa la velocità con cui è fatto. L'intero processo dovrebbe essere il più veloce possibile.

La mia domanda è, quando Devo eseguire l'interpolazione bilineare durante la fase di decompressione del JPG. Devo farlo dopo l'IDCT (Inverse Discrete Cosine Transform) o dovrei eseguire l'interpolazione prima dell'IDCT?

È intelligente utilizzare i coefficienti DCT e fare l'interpolazione su di essi, quindi utilizzare i valori risultanti nell'IDCT?

+0

Chi ha detto che dovresti usare bilineare? Questo è il peggior modo possibile oltre al campionamento di punti. Inoltre è importante prestare attenzione a gestire correttamente la gamma. –

+0

@AxelGneiting Questo era semplicemente quello che ho trovato dalla mia ricerca, se puoi suggerire un modo migliore, per favore fallo. –

+0

@AxelGneiting, in questa particolare applicazione bilineare sarà matematicamente equivalente a prendere una media di tutti e 4 i pixel. Dovrebbe essere una qualità molto veloce e accettabile. È possibile ottenere una qualità superiore a scapito della velocità. Lo stesso per la gestione della gamma: risultati migliori, meno velocità. –

risposta

3

In generale, non credo che ci sia un modo ragionevole per farlo in termini di coefficienti DCT.

Tuttavia, se si desidera ottenere specificamente un'immagine di metà della dimensione in ogni dimensione, è possibile ottenere un'immagine grossolana sottosopra eliminando i coefficienti delle alte frequenze e eseguendo un IDCT 4x4.

+0

Non è un'idea così ridicola - ho lavorato con una libreria che ha utilizzato questo approccio per la generazione di miniature. Purtroppo non ho mai imparato i dettagli di come funzionava. –

+0

@Oli puoi darmi un po 'più di dati su come questo sarebbe stato fatto? –

+1

@Tony: ad ogni blocco 8x8 dell'immagine è applicato un DCT 2D (sono sicuro che lo sai già). Ogni coefficiente rappresenta l'ampiezza di una particolare frequenza spaziale 2D. Si desidera eseguire il downsampling, che fondamentalmente comporta il filtraggio delle frequenze alte prima (questo è ciò che sta facendo l'interpolazione). Otterrai un effetto simile impostando i coeffs ad alta frequenza a 0. In alternativa, potresti semplicemente ignorarli e mantenere solo i coeffs a bassa frequenza 4x4 da ciascun blocco ed eseguire un IDCT 4x4 su di loro (vedi la pagina di Wikipedia su DCT per la matematica). –