Wavelet Transform

  • Ich möchte eine zweidimensionale diskrete Wavelet-Transformation und inverse DWT auf einem Bild ausführen. Bitte erläutern Sie die zweidimensionale diskrete Wavelet-Transformation und inverse DWT in einer einfachen Sprache und einem Algorithmus, mit dem ich Kann den Code für 2D-Haar-dwt schreiben? Die Informationen in Google waren zu technisch. Ich verstand die grundlegenden Dinge wie das Unterteilen des Bildes in 4 Unterbänder: LL, LH, HL, HH, aber ich kann nicht wirklich Ich verstehe, wie man ein Programm schreibt, um DWT und IDWT für ein Bild auszuführen. Ich lese auch, dass DWT besser ist als DCT, da es für das Bild als Ganzes ausgeführt wird und dann gab es einige Erklärungen, die über meinen Kopf gingen Vielleicht ist hier falsch, aber ich denke, DWT- und DCT-Komprimierungstechniken, weil die Bildgröße reduziert wird, wenn DWT oder DCT auf ihnen ausgeführt wird. Ich hoffe, dass Sie einen Teil Ihres Wissens mit anderen teilen und mein Wissen erweitern

    Vielen Dank

    Re: Hat es etwas mit dem Bildformat zu tun. Was ist "Pixelwert" in DWT? Ich habe Ärsche Es sollte der rgb-Wert des Bildes sein.

     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();
            }
        }
    }
     

    Die Ausgabe ist ein schwarzes Bild mit einer dünnen Linie dazwischen, kurz gesagt, nicht in der Nähe der tatsächlichen Ausgabe. Ich glaube, ich habe die Logik falsch interpretiert. Bitte weisen Sie auf die Fehler hin. Grüße

    23 April 2012
    Tim
1 answer
  • Erklären Sie bitte die zweidimensionale diskrete Wavelet-Transformation und inverse DWT in einer einfachen Sprache.

    Es ist nützlich, sich die Wavelet-Transformation in Bezug auf die Diskrete Fourier-Transformation vorzustellen (eine Reihe von Gründen finden Sie hier.) unten). Bei der Fourier-Transformation zerlegen Sie ein Signal in eine Reihe orthogonaler trigonometrischer Funktionen (cos und sin). Sie müssen unbedingt orthogonal sein, damit Sie Ihre Signale in einer Reihe von Koeffizienten (von zwei Funktionen, die im Wesentlichen INDEPENDENT sind) zerlegen und wieder zusammensetzen können.

    Mit diesem Kriterium der Orthogonalität können zwei weitere Funktionen gefunden werden, die neben cos und orthogonal sind Sünde?

    Ja, es ist möglich, solche Funktionen mit der zusätzlichen nützlichen Eigenschaft hervorzubringen, dass sie nicht bis ins Unendliche reichen (wie das cos und das sin). Ein Beispiel für ein solches Funktionspaar ist das Haar Wavelet .

    Jetzt In Bezug auf DSP ist es vielleicht praktischer, diese beiden "orthogonalen Funktionen" als zwei Finite Impulse Response (FIR) -Filter und die Diskrete Wavelet-Transformation als eine Reihe von Faltungen (oder anders ausgedrückt, das Anwenden dieser Filter über mehrere Zeitreihen hinweg). Sie können dies überprüfen, indem Sie die Formeln der 1-D-DWT und der der Faltung vergleichen und einander gegenüberstellen.

    Wenn Sie feststellen, dass die Haar-Funktionen eng zusammenpassen, werden Sie die beiden elementarsten Tiefpass- und Hochpassfilter sehen. Hier ist ein sehr einfacher Tiefpassfilter h = [0,5,0,5] (machen Sie sich im Moment keine Gedanken über die Skalierung), auch bekannt als Filter für gleitenden Durchschnitt , da er im Wesentlichen den Durchschnitt von jeweils zwei benachbarten Abtastwerten zurückgibt. Hier ist ein sehr einfacher Hochpassfilter h = [1, -1], auch bekannt als differentiator , da er die Differenz zwischen zwei benachbarten Stichproben zurückgibt.

    So führen Sie DWT-IDWT für ein Bild aus Es handelt sich lediglich um die Verwendung der zweidimensionalen Versionen der Faltung (um Ihre Haar-Filter nacheinander anzuwenden).

    Vielleicht können Sie jetzt anfangen zu sehen, wo LowLow, LowHigh, HighLow, HighHigh Teile eines Bildes, das DWT durchlaufen hat, stammen aus. Beachten Sie jedoch, dass ein Bild bereits ZWEI DIMENSIONAL ist (möglicherweise ist das einige Male verwirrend), dh Sie müssen die Low-High-Spatial-Frequenzen für die X-Achse und die gleichen Bereiche für die Y-Achse (deshalb gibt es zwei Lows und zwei Highs pro Achse)

    und einen Algorithmus, mit dem ich den Code schreiben kann für 2D haar dwt?

    Sie müssen es wirklich versuchen, dies aus den ersten Prinzipien selbst zu codieren, damit Sie den gesamten Prozess verstehen können. Es ist sehr einfach, ein fertiges Stück Code zu finden, das das tut, wonach Sie suchen, aber ich bin nicht sicher, ob dies Ihnen auf lange Sicht wirklich helfen würde.

    Ich bin hier möglicherweise falsch, aber ich denke, DWT- und DCT-Komprimierungstechniken , weil die Bildgröße reduziert wird, wenn DWT oder DCT auf ihnen ausgeführt wird

    Hier lohnt es sich wirklich, an die DWT als Fourier-Transformation zu denken. Aus folgendem Grund:

    Bei der Fourier-Transformation (und natürlich auch der DCT) transformieren Sie VIELE SAMPLES (im Zeitbereich) in einen (komplexen) Koeffizienten (in) der Frequenzbereich). Dies liegt daran, dass Sie verschiedene Sinusoide und Cosinusoide konstruieren und diese dann mit Ihrem Signal multiplizieren und den Durchschnitt dieses Produkts ermitteln. Sie wissen also, dass ein einzelner Koeffizient Ak darstellt

    23 April 2012
    Chris