Trasformazione Wavelet


9

Voglio eseguire trasformate wavelet discrete 2D haar e DWT inverso su un'immagine. Spieghi per favore la trasformazione wavelet discreta 2D haar e il DWT inverso in un linguaggio semplice e un algoritmo con cui posso scrivere il codice per 2D haar dwt? Le informazioni fornite su Google erano troppo tecniche. Ho capito le cose di base come la divisione dell'immagine in 4 sotto-bande: LL, LH, HL, HH ma non riesco davvero a capire come scrivere un programma per eseguire DWT e IDWT su un'immagine. Ho anche letto che DWT è meglio di DCT in quanto viene eseguito sull'immagine nel suo insieme e quindi c'erano alcune spiegazioni che sono andate oltre la mia testa. Potrei sbagliarmi qui ma penso che le tecniche di compressione DWT e DCT perché la dimensione dell'immagine si riduce quando si esegue DWT o DCT su di essi. Spero che voi ragazzi condividiate una parte delle vostre conoscenze e ne migliori le conoscenze.

Grazie

Ri: Ha qualcosa a che fare con il formato dell'immagine. Qual è il "valore di pixel" che viene utilizzato in DWT? Ho assunto che sia il valore RGB dell'immagine.

import java.awt.event.*;
import javax.swing.*;
import java.awt.image.BufferedImage;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;
import java.io.*;
import javax.swing.JFileChooser;
import javax.swing.filechooser.FileFilter;
import javax.swing.filechooser.FileNameExtensionFilter;
import javax.imageio.ImageIO;
import java.awt.*;
import java.lang.*;
import java.util.*;

class DiscreteWaveletTransform

{

    public static void main(String arg[])
    { DiscreteWaveletTransform dwt=new DiscreteWaveletTransform();
      dwt.initial();
    }


    static final int TYPE=BufferedImage.TYPE_INT_RGB;
    public void initial()
    {
    try{

        BufferedImage buf=ImageIO.read(new File("lena.bmp"));
        int w=buf.getWidth();
        int h=buf.getHeight();
        BufferedImage dwtimage=new BufferedImage(h,w,TYPE);
        int[][] pixel=new int[h][w];
        for (int x=0;x<h;x++)
        {
            for(int y=0;y<w;y++)
            {
                pixel[x][y]=buf.getRGB(x,y);


            }
        }
        int[][] mat =  new int[h][w];
        int[][] mat2 =  new int[h][w];

        for(int a=0;a<h;a++)
        {
            for(int b=0,c=0;b<w;b+=2,c++)
            {
                mat[a][c]    = (pixel[a][b]+pixel[a][b+1])/2;
                mat[a][c+(w/2)]  = Math.abs(pixel[a][b]-pixel[a][b+1]);
            }
        }
        for(int p=0;p<w;p++)
        {
            for(int q=0,r =0 ;q<h;q+=2)
            {
                mat2[r][p]   = (mat[q][p]+mat[q+1][p])/2;
                mat2[r+(h/2)][p] = Math.abs(mat[q][p]-mat[q+1][p]);
            }
        }
        for (int x=0;x<h;x++)
        {
            for(int y=0;y<w;y++)
            {
                dwtimage.setRGB(x,y,mat2[x][y]);
            }
        }
        String format="bmp";
        ImageIO.write(dwtimage,format, new File("DWTIMAGE.bmp"));
        }

        catch(Exception e)
        {
            e.printStackTrace();
        }
    }
}

L'output è un'immagine nera con una linea sottile in mezzo, in breve da nessuna parte vicino all'output reale. Penso di aver interpretato la logica in modo errato. Si prega di sottolineare gli errori. Saluti



Il codice di cui sopra significa molto per me grazie .. puoi per favore fornirmi il codice Java per l'inverso della trasformazione 2D haar

Risposte:


15

Potresti spiegare la trasformazione wavelet discreta 2D haar e la DWT inversa in un linguaggio semplice

È utile pensare alla trasformazione wavelet in termini di trasformata discreta di Fourier (per una serie di motivi, vedere di seguito). Nella trasformata di Fourier, si decompone un segnale in una serie di funzioni trigonometriche ortogonali (cos e sin). È essenziale che siano ortogonali in modo che sia possibile scomporre i segnali in una serie di coefficienti (di due funzioni che sono essenzialmente INDIPENDENTI l'uno dall'altro) e ricomporlo nuovamente.

Tenendo presente questo criterio di ortogonalità , è possibile trovare altre due funzioni ortogonali oltre al cos e al peccato?

Sì, è possibile trovare tali funzioni con l'ulteriore caratteristica utile che non si estendono all'infinito (come fanno il cos e il peccato). Un esempio di tale coppia di funzioni è la Haar Wavelet .

Ora, in termini di DSP, forse è più pratico pensare a queste due "funzioni ortogonali" come due filtri di risposta agli impulsi finiti (FIR) e la trasformata discreta di wavelet come una serie di Convoluzioni (o in altre parole, applicando successivamente questi filtri nel corso di alcune serie storiche). Puoi verificarlo confrontando e contrastando le formule del DWT 1-D e quella della convoluzione .

Infatti, se noti da vicino le funzioni di Haar, vedrai i due filtri passa-basso e passa-alto più elementari. Ecco un filtro passa-basso molto semplice h = [0.5,0.5] (non preoccuparti del ridimensionamento per il momento) noto anche come filtro a media mobile perché essenzialmente restituisce la media di ogni due campioni adiacenti. Ecco un filtro passa-alto molto semplice h = [1, -1] noto anche come differenziatore perché restituisce la differenza tra due campioni adiacenti.

Per eseguire DWT-IDWT su un'immagine, si tratta semplicemente di utilizzare le versioni bidimensionali della convoluzione (per applicare successivamente i filtri Haar).

Forse ora puoi iniziare a vedere da dove provengono le parti LowLow, LowHigh, HighLow, HighHigh di un'immagine che ha subito DWT. TUTTAVIA, tieni presente che un'immagine è già DUE DIMENSIONALE (forse questo può confondere alcune volte). In altre parole, è necessario derivare le frequenze spaziali basso-alte per l'asse X e le stesse gamme per l'asse Y (ecco perché ci sono due bassi e due alti per asse)

e un algoritmo con cui posso scrivere il codice per 2D haar dwt?

Devi davvero provare a codificarlo da solo dai primi principi in modo da ottenere una comprensione dell'intero processo. È molto facile trovare un pezzo di codice già pronto che farà quello che stai cercando, ma non sono sicuro che questo ti aiuterà davvero a lungo termine.

Potrei sbagliarmi qui, ma penso che le tecniche di compressione DWT e DCT perché la dimensione dell'immagine si riduce quando DWT o DCT viene eseguito su di esse

Qui è dove "paga" pensare al DWT in termini di trasformata di Fourier. Per il seguente motivo:

Nella trasformata di Fourier (e ovviamente anche nel DCT), trasformi MOLTI CAMPIONI (nel dominio del tempo) in UNO (complesso) coefficiente (nel dominio della frequenza). Questo perché, costruisci diversi sinusoidi e cosinusoidi e poi li moltiplichi con il tuo segnale e ottieni la media di quel prodotto. Quindi, sai che un singolo coefficiente Ak rappresenta una versione in scala di una sinusoide di una certa frequenza (k) nel tuo segnale.

Ora, se guardi alcune delle funzioni wavelet noterai che sono un po 'più complesse dei semplici sinusoidi. Ad esempio, considera la Trasformata di Fourier del filtro Haar passa alto ... Il filtro Haar passa alto sembra un'onda quadra, cioè ha bordi acuti (transizioni nitide) ... Cosa serve per creare BORDI TAGLIENTI? .. ... Molte, molte diverse sinusoidi e co-sinusoidi (!)

Pertanto, rappresentare il tuo segnale / immagine usando le wavelet ti fa risparmiare più spazio che rappresentarlo con le sinusoidi di un DCT perché UN set di coefficienti wavelet rappresenta PIÙ COEFFICIENTI DCT. (Un argomento leggermente più avanzato ma correlato che potrebbe esserti di aiuto per capire perché funziona in questo modo è il filtro abbinato ).

Due buoni link online (almeno secondo me :-)) sono: http://faculty.gvsu.edu/aboufade/web/wavelets/tutorials.htm e; http://disp.ee.ntu.edu.tw/tutorial/WaveletTutorial.pdf

Personalmente, ho trovato molto utili i seguenti libri: http://www.amazon.com/A-Wavelet-Tour-Signal-Processing/dp/0124666051 (By Mallat) e; http://www.amazon.com/Wavelets-Filter-Banks-Gilbert-Strang/dp/0961408871/ref=pd_sim_sbs_b_3 (di Gilbert Strang)

Entrambi sono libri assolutamente geniali sull'argomento.

spero che questo possa essere d'aiuto

(scusa, ho appena notato che questa risposta potrebbe essere in esecuzione un po 'troppo a lungo: - /)


Sono entusiasta che tu abbia risposto. Grazie per aver risposto A_A. Sulla base dell'interpretazione matematica di DWT che ho trovato in un documento IEEE ho scritto un codice.Tuttavia, tutto ciò che ottengo è un'immagine nera, per favore, aiutami.
user1320483

Scrivere il codice per eseguire DWT significa davvero molto per me. (Per favore) ^ ∞. Sarò davvero grato. Ho pubblicato il codice sopra.
user1320483,

Ci sono due cose da notare nel tuo codice a) Ti preghiamo di rivedere la versione bidimensionale della convoluzione (in questo caso non c'è niente di più semplice di questo) eb) Nota che la tua "immagine" è un insieme di coefficienti che potrebbero essere molto piccolo o molto grande e comunque al di fuori della gamma dinamica comune di 255 colori. Pertanto, è necessario trovare l'intervallo dei coefficienti e ridimensionarlo nell'intervallo 0,255. Stai andando solo per un livello di decomposizione?
A_A

a) Si prega di rivedere la versione bidimensionale della convoluzione (in questo caso non c'è niente di più semplice di quello). Non sono sicuro di cosa intendiate con questo. "immagine" è un insieme di coefficienti che potrebbero essere molto piccoli o molto grandi e comunque al di fuori della gamma dinamica comune di 255 colori Ciò significa che dopo l'aggiunta devo verificare se il valore supera 255 e se inizia da 0? Stai andando solo per un livello di decomposizione? Sì, grazie mille
user1320483,

Ciò che intendo per (a) è che se si desidera applicare i filtri Haar (come da risposta sopra fornita) si dovrà rivedere come viene fatto attraverso l'operazione di convoluzione e nel caso dei filtri Haar questo è molto semplice. Sì, è necessario normalizzare i coefficienti nell'intervallo 0-255 per poterli "vedere". Per quanto riguarda RGB, ti preghiamo di concentrarti sulle immagini in scala di grigi (solo un valore). Devi prima capire cosa devi fare e poi farlo. Cercare "il codice" richiederà più tempo a lungo termine.
A_A

8

Ho iniziato a scrivere questo prima della risposta di @A_A , ma quella risposta è eccellente. Spero comunque che quanto segue possa aggiungere un po 'alla tua comprensione.

XHX~

X=HX~
HH

L'idea alla base della decomposizione base del segnale è che il segnale può essere rappresentato in qualche modo migliore in una base alternativa. Per meglio , intendiamo che il segnale è in qualche modo più suscettibile all'elaborazione, o alla comprensione, o altro - non importa davvero.

Un punto da notare è che, in particolare con le trasformazioni ortonormali, il tuo segnale è ancora il tuo segnale qualunque sia la base in cui si trova. Non dovresti pensare a una base come in qualche modo al dominio corretto (io uso il dominio per significare base in senso generale) .

Ora, basi diverse hanno proprietà diverse. Sono sicuro che sei ben consapevole del teorema di convoluzione che descrive l'utile relazione tra il dominio di Fourier e il dominio del tempo. Ciò rende il dominio di Fourier utile per eseguire operazioni di convoluzione nel dominio del tempo.

In generale, il dominio del tempo (o pixel) può essere considerato con una risoluzione temporale (o spaziale) eccellente e una cattiva risoluzione della frequenza. Al contrario, il dominio di Fourier può essere considerato con un'eccellente risoluzione in frequenza e una risoluzione in caso di brutto tempo (o spaziale).

Le basi wavelet si adattano da qualche parte nel mezzo delle due precedenti. Tendono ad avere una buona risoluzione in frequenza e un buon tempo o una risoluzione spaziale. Una proprietà della trasformata wavelet è la buona sparsificazione delle immagini naturali. Con questo intendo l'energia dall'immagine è compressa in pochi coefficienti grandi e in molti coefficienti piccoli. Ciò significa che la maggior parte delle informazioni salienti del segnale è rappresentata da un insieme relativamente piccolo di valori. Questa è l'essenza della compressione.

Le diverse wavelet hanno proprietà diverse. Oltre ai riferimenti di @A_A, consiglio anche questo tutorial IEEE sul DTCWT. Il focus del tutorial non è sulla trasformazione wavelet di per sé , ma il motivo per cui lo consiglio è a causa della fantastica intuizione che presenta sui problemi associati al DWT e su come potrebbero essere alleviati (direi che richiede una comprensione di base prima però). Collega davvero una comprensione delle wavelet con una comprensione della trasformata di Fourier e del perché quest'ultima abbia le belle proprietà che possiede.

Se desideri qualche altro codice di riferimento sulla trasformazione di Haar, il mio ex supervisore ha alcuni esempi di matlab sulla sua pagina web (il file zip in "Corso di codifica di immagini 4F8", HAAR2D.M e IHAAR2D.M). Questi sono comunque molti esempi di insegnamento.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.