2009-11-22 4 views
5

Così qui è il mio problema:immagine percettiva Downsampling

Ho un'immagine, l'immagine è grande (alta risoluzione) e ha bisogno di essere di piccole dimensioni (risoluzione molto più bassa).

Così faccio la cosa ingenua (uccido ogni altro pixel) e il risultato sembra scadente.

Così provo a fare qualcosa di più intelligente (filtraggio passa-basso usando una trasformata di Fourier e ricampionamento nello spazio di Fourier) e il risultato è un po 'migliore ma ancora piuttosto scadente.

Quindi, la mia domanda è che esiste un algoritmo (o implementazione) di campionamento sottocosto percettivamente motivato?

modifica: Mentre sono a conoscenza di una serie di tecniche di ricampionamento, la mia applicazione è più interessata a preservare le caratteristiche percettive piuttosto che produrre immagini uniformi.

EDIT2: è lecito ritenere che ho un certo livello di familiarità con l'elaborazione del segnale digitale, circonvoluzioni, trasformate wavelet, ecc

+0

OK, che tipo di immagini stai cercando di scala? Disegni lineari? Fotografie? Mi sono occupato principalmente di immagini video e gli algoritmi di ridimensionamento che funzionano bene con i video potrebbero non funzionare bene quando si tenta di preservare funzionalità specifiche (ad esempio le linee nell'animazione tradizionale, per esempio). –

+0

Per il momento diciamo che è l'immagine di un orso (rimosso dal suo sfondo) e una volta ridimensionato voglio che assomigli ancora ad un orso. – tzenes

+1

Orso disegnato a mano? Una fotografia di un orso? Pedobear? Con quale fattore stai scalando? Dalla tua descrizione ("uccidi ogni altro pixel") sembra che tu stia ridimensionando solo di un fattore 2, quindi un buon algoritmo generale dovrebbe funzionare bene (a meno che l'immagine non sia line art con linee larghe 1 pixel, in cui caso non sembrerà così bello ...) Sarei curioso di sapere come funziona questo approccio di vettorizzazione. –

risposta

2

Bicubic interpolation è generalmente considerato abbastanza buono, ma non esiste una soluzione perfetta, dipende le persone e le proprietà dell'immagine vengono ricampionati.

Link correlati:

Non ho nemmeno sapere che la nitidezza è stato chiamato anche acutance.

Aliasing è un problema che può verificarsi durante il downsampling ingenuo.

+2

Ho familiarità con le più banali tecniche di ricampionamento (gaussiano, bicubico, Lanczos), sono efficaci per l'upscaling, ma con il downscaling perdono troppe informazioni percettivamente importanti. Non avevo considerato l'utilizzo di una maschera di contrasto, che probabilmente risolverà la maggior parte dei miei problemi, ma ci saranno ancora alcuni problemi in cui le linee che dovrebbero scomparire conservate e viceversa, in base alle mie impostazioni. – tzenes

+1

In questo caso, oltre alla cucitura di carving già menzionata in un'altra risposta, vedo solo la "vettorizzazione dell'immagine ad alta risoluzione seguita dalla visualizzazione della versione vettoriale in risoluzione inferiore". –

+0

Un algoritmo di vettorizzazione sarebbe sicuramente di aiuto in questo. Forse potrei applicare una metrica di salienza (cioè Itti) per dare ai vettori pesi relativi e farli sparire oltre determinate soglie. Lasciami giocare un po 'con questo, potrebbe essere la soluzione che sto cercando. – tzenes

0

Si potrebbe provare un algoritmo di ridimensionamento sensibile al contenuto. Vedi: http://www.seamcarving.com/

+0

Mentre il retargetting delle immagini è più in linea con quello che sto cercando di fare, l'applicazione effettiva è insufficiente. il ritocco dell'immagine si basa sull'identificazione di caratteristiche importanti e sul ritaglio da uno "sfondo". Dove, come quello che sto guardando, sta prendendo l'immagine di dire, un orso e ricampionando quella cosa. – tzenes

1

Pascal ha ragione. Dipende dall'immagine e da ciò che vuoi. Alcuni fattori:

  • conservazione spigoli vivi
  • colori preservando
  • velocità algoritmo

Questo è your method.

Alcuni altri:

Nota che a volte il ricampionamento verso il basso si può ottenere un risultato più nitida rispetto, ad esempio, utilizzando una fotocamera a risoluzione inferiore, a causa ci saranno bordi nell'immagine ad alta risoluzione che non possono essere rilevati da un dispositivo a bassa risoluzione.

Nota a margine: molti algoritmi (in particolare il prossimo più vicino) possono essere ottimizzati se si ridimensiona di un intero (ad esempio dividendo per 4 o 6).

+0

Come la maggior parte delle persone, hai dimenticato il passaggio di fondamentale importanza del filtraggio passa-basso dell'immagine. L'uso di uno dei metodi di interpolazione che hai elencato si tradurrà in aliasing e l'immagine apparirà spazzatura. – Timmmm

5

Leggi questo:

http://www.dspguide.com/

OK, che è piuttosto una lettura. Ma comprendere la progettazione del filtro sarebbe utile.

In generale, il processo per ridimensionare un'immagine da W1 x H1 a W2 x H2 dove W1, W2, H1, H2 sono interi, è quello di trovare nuovi W3, H3 in modo che W1 e W2 siano fattori interi di W3 e H1 e H2 sono fattori interi di H3, quindi si riempie l'immagine originale con zeri (usati per spaziare i pixel dell'immagine originale) in modo che ora abbia dimensioni pari a W3 x H3. Questo introduce le alte frequenze a causa delle discontinuità nell'immagine, quindi applicate un filtro passa-basso all'immagine e quindi decimate l'immagine filtrata nella sua nuova dimensione (W2 x H2). Sembra che tu stia già tentando di farlo, ma il filtraggio può essere fatto nel dominio del tempo in modo che la trasformazione di Fourier non sia realmente necessaria.

In pratica, il processo che ho appena descritto è ottimizzato (noterete che quando si applica un filtro di convoluzione all'immagine upscaled la maggior parte dei termini sarà 0, quindi è possibile evitare la maggior parte delle operazioni di moltiplicazione nell'algoritmo, per esempio, e dato che finisci per buttare via molti dei risultati filtrati, non hai bisogno di calcolarli, quindi alla fine ottieni una manciata di moltiplicazioni e aggiunte per ogni pixel dell'immagine di destinazione, in pratica. capire quali coefficienti usare.)

libswscale nel progetto ffmpeg fa qualcosa del genere, credo. Check it out:

http://gitorious.org/libswscale

Come altri hanno sottolineato, (e apparentemente notato) decimando l'immagine introduce aliasing artefatti. Non posso essere sicuro della tua implementazione di ricampionamento, ma la tecnica ha dei trucchi interessanti a seconda della dimensione della finestra che usi e di altri dettagli di implementazione.

0
+0

Per quanto posso dire questo non filtra l'immagine correttamente e non dovrebbe essere usata per il downsampling. – Timmmm

+0

Dato che è _is_ utilizzato in Paint.NET per il downsampling, direi che fa bene il suo lavoro. Ho anche iniziato a usarlo nel mio software e i risultati vanno bene: http://braincrunch.tumblr.com/post/13459650973/maperitive-beta-subpixel-accuracy –

+1

@Timmmm Se hai qualcosa che senti è importante dire, spiegarlo correttamente nella tua risposta. Commentare tutte le risposte esistenti senza mai fornire dettagli non sembra molto costruttivo. Non è così che funziona questo sito. –

Problemi correlati