2015-07-11 14 views
7

Attualmente mi sto immergendo in Wavelet e sono un po 'confuso su certe cose.Trasformata Wavelet discreta LeGal 5/3 con sollevamento (valori negativi, visualizzazione, confusione LH HL)

Prima di tutto, questo NON è compito. È solo per la codifica ricreativa.

Per ottenere una migliore comprensione, ho implementato lo schema di sollevamento per l'wavelet LeGal 5/3 in C. Per quanto posso vedere, sembra funzionare. Posso invertire e le immagini originali sono riprodotte correttamente. In pseudo-codice, il mio dwt avanti assomiglia a questo:

// deinterleave splits the low band from the high band 
// (e.g. 1 0 3 0 6 0 8 1 11 becomes 1 3 6 8 11 | 0 0 0 1) 

for each row in image: 
    dwt1d(row) 
    deinterleave(row) 
for each col in image: 
    dwt1d(col) 
    deinterleave(col) 

Ma io lotta con un paio di cose.

  1. Quando si applica il dwt, torno la mia immagine trasformata, ma i valori sono fuori range [0 - 255]. Pertanto li conservo in pantaloncini. Alcuni sono negativi e alcuni sono molto grandi. Ora come posso visualizzarli al fine di ottenere quelle immagini dall'aspetto gradevole come mostrato qui: (http://www.whydomath.org/node/wavlets/images/Largetoplevelwt.gif)? Se mostro la mia immagine in Matlab con imshow (immagine, []), il mio risultato è il seguente: http://i.imgur.com/dNaYwEE.jpg. Quindi, devo fare qualche trasformazione nelle mie sottobande? Se sì, qualcuno può indicarmi una soluzione o dirmi cosa fare?

  2. In letteratura, vedo a volte che le sottobande sono ordinate in questo modo: [LL LH; HL HH] ea volte così: [LL HL; LH HH]. Quest'ultimo, vedo soprattutto quando il documento parla di JPEG2000 ed è anche ciò che produce il mio algoritmo. In Matlab tuttavia, quando si utilizza la funzione lwt2, restituisce il layout precedente. Lo vedo anche quando paragono il mio output con l'output di Matlab. Sembra che LH e HL siano confusi. Come può essere? Importa? Deve fare qualcosa con l'uso del sollevamento invece della convoluzione?

  3. Ha importanza se si eseguono prima le righe e poi le colonne o viceversa? Non vedo differenze nella mia produzione quando cambio l'ordine. L'unica cosa che sarebbe diversa è che LH diventa HL e HL diventa LH. Tuttavia, questo non risolve la mia seconda domanda perché l'output è lo stesso. È solo notazionale, immagino. Quindi importa? Ho visto documenti in cui fanno il col-row e altri dove fanno row-col. Entrambi rispetto a JPEG2000.

Grazie mille. Se qualcuno potesse far luce sui miei problemi, sarei molto grato.

Cordiali saluti, Markus

+0

Posso vedere alcuni problemi con questa domanda. *** 1 ***. Hai messo tre domande in una. Dividili invece in domande separate. *** 2 ***. Non fornisci [mcve] (http://stackoverflow.com/help/mcve). È molto difficile rispondere alle tue domande, a meno che tu non lo faccia. *** 3 ***. Le vostre domande potrebbero essere viste come correlate alla teoria delle wavelet e alcuni potrebbero (non sto dicendo che lo siano, ma alcuni potrebbero) pensare che appartengano altrove. Affrontarli probabilmente ti aiuterà più di una taglia. – kkuilla

+0

Per quanto riguarda il punto 3: dove penseresti sarebbe questo? –

+0

Non ne sono sicuro, ho paura. L'ultimo punto probabilmente diventerebbe irrilevante se avessi indirizzato 1 e 2. – kkuilla

risposta

4

ho scritto un blog su di costruzione di un sistema di compressione delle immagini WDR. Si può leggere di più qui:

http://trueharmoniccolours.co.uk/Blog/

(Avrete notato che io non sono un blogger molto prolifico;)). Dovrebbe contenere tutto il necessario per implementare la propria versione C++ della compressione delle immagini WDR. Se non mi senti libero di licenziarmi un messaggio e chiedi!

  1. Sì questa è una "funzione" davvero sotto documentata da quello che potrei elaborare. Il valore restituito da DWT è in realtà un breve e richiede l'intervallo da -255 a +255. Ora ovviamente -255 non è direttamente renderizzabile quando si usa il colore a 8 bit. Di conseguenza, ciò che le persone fanno di solito è dividere il valore per 2 e aggiungere 128 per la visualizzazione (non dimenticare che display è solo uno strumento per il debug).In questo modo puoi spostare 0 per essere un 128 e quindi un "grigio medio" su un'immagine in scala di grigi.

  2. Non importa se si esegue la trasformazione inversa nello stesso modo in cui si esegue la trasformazione in avanti.

  3. No, non dovrebbe fare alcuna differenza. Quando implementi decidi dove scrivere il pixel di destinazione in modo che tu sia libero di scriverlo dove preferisci (ad esempio un'immagine completamente diversa).

Edit: Per quanto riguarda il commento l'equazione di sollevamento Daub 5/3 è la seguente:

d = s[n + 1] - ((s[n + 0] + s[n + 2])/2); 

Quindi, nel caso di un'immagine fonte di 255, 0, 255 ... che si tradurrebbe in annuncio di -255. A partire da 0, 255, 0 darebbe il massimo di 255 quindi dovresti essere sicuramente nel range -255 to +255 o c'è qualcosa di sbagliato nella tua implementazione.

+0

Hey Goz, grazie mille per le tue risposte. Per quanto riguarda 1: la mia immagine trasformata è effettivamente nel raggio d'azione (-185, +295) .. forse perché faccio il 5/3? Quindi se divido per 2 e aggiungo 128, sono ancora fuori dall'intervallo uint8. L'immagine non sembra ancora molto buona quando viene visualizzata tramite matlab. –

+0

@markus_p: Sono un po 'arrugginito in matematica ma sono abbastanza sicuro che i risultati debbano essere compresi nell'intervallo da -255 a 255. Ho appena controllato la matematica e questo ha senso. Se riesci a pubblicare il tuo codice, potrei essere in grado di dirti dove il codice sta andando male. – Goz

Problemi correlati