Ich möchte eine diskrete 2D-Haar-Wavelet-Transformation und eine inverse DWT für ein Bild durchführen. Erklären Sie bitte die diskrete 2D-Haar-Wavelet-Transformation und die inverse DWT in einer einfachen Sprache und einem Algorithmus, mit dem ich den Code für 2D-Haar-DWT schreiben kannDie Informationen in Google waren zu technisch. Ich verstand die grundlegenden Dinge wie das Aufteilen des Bildes in 4 Unterbänder: LL, LH, HL, HH, aber ich kann nicht wirklich verstehen, wie man ein Programm schreibt, um DWT und IDWT auszuführen Ich habe auch gelesen, dass DWT besser ist als DCT, da es für das gesamte Bild ausgeführt wird, und dann gab es eine Erklärung, die über meinen Kopf ging. Ich könnte mich hier irren, aber ich denke, DWT- und DCT-Komprimierungstechniken weil sich die Bildgröße verringert, wenn DWT oder DCT an ihnen durchgeführt wird. Ich hoffe, ihr teilt einen Teil eures Wissens und erweitert mein Wissen.
Vielen Dank
Betreff: Hat dies etwas mit dem Bildformat zu tun? Was ist der "Wert des Pixels", der in DWT verwendet wird? Ich habe angenommen, dass es sich um den RGB-Wert des Bildes handelt.
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 nicht annähernd der tatsächlichen Ausgabe. Ich glaube, ich habe die Logik falsch interpretiert. Bitte weisen Sie auf die Fehler hin. Grüße
quelle
Antworten:
Es ist nützlich, sich die Wavelet-Transformation als diskrete Fourier-Transformation vorzustellen (aus einer Reihe von Gründen siehe unten). In der Fourier-Transformation zerlegen Sie ein Signal in eine Reihe von orthogonalen trigonometrischen Funktionen (cos und sin). Es ist wichtig, dass sie orthogonal sind, damit Sie Ihre Signale in eine Reihe von Koeffizienten (von zwei Funktionen, die im Wesentlichen UNABHÄNGIG voneinander sind) zerlegen und wieder zusammensetzen können.
Ist es unter Berücksichtigung dieses Orthogonalitätskriteriums möglich, neben cos und sin zwei weitere orthogonale Funktionen zu finden?
Ja, es ist möglich, solche Funktionen mit der zusätzlichen nützlichen Eigenschaft zu entwickeln, dass sie sich nicht bis ins Unendliche erstrecken (wie es die cos und die sin tun). Ein Beispiel für ein solches Funktionspaar ist das Haar Wavelet .
In Bezug auf DSP ist es vielleicht praktischer, diese beiden "orthogonalen Funktionen" als zwei FIR-Filter (Finite Impulse Response) und die diskrete Wavelet-Transformation als eine Reihe von Faltungen zu betrachten (oder mit anderen Worten, diese Filter nacheinander anzuwenden über einige Zeitreihen). Sie können dies überprüfen, indem Sie die Formeln des 1-D-DWT und die der Faltung vergleichen und gegenüberstellen .
Wenn Sie die Haar-Funktionen genau beobachten, sehen Sie die beiden elementarsten Tiefpass- und Hochpassfilter. Hier ist ein sehr einfaches Tiefpassfilter h = [0,5,0,5] (machen Sie sich im Moment keine Sorgen um die Skalierung), das auch als Filter für den gleitenden Durchschnitt bezeichnet wird, da es im Wesentlichen den Durchschnitt von jeweils zwei benachbarten Abtastwerten zurückgibt. Hier ist ein sehr einfaches Hochpassfilter h = [1, -1], das auch als Differenzierer bezeichnet wird, da es die Differenz zwischen zwei beliebigen benachbarten Abtastwerten zurückgibt.
Um DWT-IDWT für ein Bild durchzuführen, müssen lediglich die zweidimensionalen Versionen der Faltung verwendet werden (um Ihre Haar-Filter nacheinander anzuwenden).
Vielleicht können Sie jetzt sehen, woher die Teile LowLow, LowHigh, HighLow, HighHigh eines Bildes stammen, das DWT unterzogen wurde. Bitte beachten Sie jedoch, dass ein Bild bereits ZWEI DIMENSIONAL ist (möglicherweise ist dies manchmal verwirrend). Mit anderen Worten, Sie müssen die Low-High-Raumfrequenzen für die X-Achse und die gleichen Bereiche für die Y-Achse ableiten (aus diesem Grund gibt es zwei Tiefs und zwei Hochs pro Achse).
Sie müssen wirklich versuchen, dies anhand der ersten Prinzipien selbst zu codieren, damit Sie den gesamten Prozess verstehen. Es ist sehr einfach, einen fertigen Code zu finden, der genau das tut, wonach Sie suchen, aber ich bin mir nicht sicher, ob dies Ihnen langfristig wirklich helfen würde.
Hier "zahlt" es sich wirklich aus, an die DWT im Sinne der Fourier-Transformation zu denken. Aus folgendem Grund:
In der Fourier-Transformation (und natürlich auch in der DCT) transformieren Sie VIELE PROBEN (im Zeitbereich) in EINEN (komplexen) Koeffizienten (im Frequenzbereich). Dies liegt daran, dass Sie verschiedene Sinusoide und Cosinusoide konstruieren und diese dann mit Ihrem Signal multiplizieren und den Durchschnitt dieses Produkts erhalten. Sie wissen also, dass ein einzelner Koeffizient Ak eine skalierte Version einer Sinuskurve mit einer Frequenz (k) in Ihrem Signal darstellt.
Wenn Sie sich nun einige der Wavelet-Funktionen ansehen, werden Sie feststellen, dass sie etwas komplexer sind als die einfachen Sinuskurven. Betrachten Sie zum Beispiel die Fourier-Transformation des Hochpass-Haarfilters ... Der Hochpass-Haarfilter sieht aus wie eine Rechteckwelle, dh er hat scharfe Kanten (scharfe Übergänge) ... Was braucht es, um scharfe Kanten zu erzeugen? ... viele, viele verschiedene Sinuskurven und Co-Sinuskurven (!)
Die Darstellung Ihres Signals / Bildes mit Wavelets spart daher mehr Platz als die Darstellung mit den Sinuskurven einer DCT, da EIN Satz von Wavelet-Koeffizienten MEHR DCT-KOEFFIZIENZEN darstellt. (Ein etwas fortgeschritteneres, aber verwandtes Thema, das Ihnen helfen kann, zu verstehen, warum dies so funktioniert, ist Matched Filtering ).
Zwei gute Online-Links (zumindest meiner Meinung nach :-)) sind: http://faculty.gvsu.edu/aboufade/web/wavelets/tutorials.htm und; http://disp.ee.ntu.edu.tw/tutorial/WaveletTutorial.pdf
Persönlich fand ich die folgenden Bücher sehr hilfreich: http://www.amazon.com/A-Wavelet-Tour-Signal-Processing/dp/0124666051 (By Mallat) und; http://www.amazon.com/Wavelets-Filter-Banks-Gilbert-Strang/dp/0961408871/ref=pd_sim_sbs_b_3 (Von Gilbert Strang)
Beide sind absolut brillante Bücher zu diesem Thema.
ich hoffe das hilft
(Entschuldigung, ich habe gerade bemerkt, dass diese Antwort möglicherweise etwas zu lang ist: - /)
quelle
Ich habe vor der Antwort von @A_A angefangen, dies zu schreiben , aber diese Antwort ist ausgezeichnet. Trotzdem hoffe ich, dass das Folgende etwas zu Ihrem Verständnis beiträgt.
Die Idee hinter der Basiszerlegung des Signals ist, dass das Signal auf eine alternative Basis auf eine bessere Weise dargestellt werden kann. Mit besser meinen wir, dass das Signal irgendwie besser für die Verarbeitung oder das Verständnis oder was auch immer geeignet ist - es spielt keine Rolle.
Zu beachten ist, dass insbesondere bei orthonormalen Transformationen Ihr Signal immer noch Ihr Signal ist, egal auf welcher Basis es sich befindet. Sie sollten sich eine Basis nicht als die richtige Domäne vorstellen (ich verwende Domäne als Basis im allgemeinen Sinne). .
Nun haben verschiedene Basen unterschiedliche Eigenschaften. Ich bin sicher, Sie kennen den Faltungssatz, der die nützliche Beziehung zwischen der Fourier-Domäne und der Zeitdomäne beschreibt. Dies macht die Fourier-Domäne nützlich zum Ausführen von Zeitdomänen-Faltungsoperationen.
Im Allgemeinen kann davon ausgegangen werden, dass der Zeitbereich (oder Pixelbereich) eine hervorragende zeitliche (oder räumliche) Auflösung und eine schlechte Frequenzauflösung aufweist. Umgekehrt kann davon ausgegangen werden, dass die Fourier-Domäne eine ausgezeichnete Frequenzauflösung und eine schlechte zeitliche (oder räumliche) Auflösung aufweist.
Die Wavelet-Basen passen irgendwo in die Mitte der beiden oben genannten. Sie neigen dazu, eine gute Frequenzauflösung und eine gute zeitliche oder räumliche Auflösung zu haben. Eine Eigenschaft der Wavelet-Transformation ist die gute Sparsifikation natürlicher Bilder. Damit meine ich, dass die Energie aus dem Bild auf einige wenige große Koeffizienten und viele kleine Koeffizienten komprimiert wird. Dies bedeutet, dass der größte Teil der hervorstechenden Informationen des Signals durch einen relativ kleinen Satz von Werten dargestellt wird. Dies ist die Essenz der Komprimierung.
Unterschiedliche Wavelets haben unterschiedliche Eigenschaften. Zusätzlich zu den Referenzen von @A_A empfehle ich dieses IEEE-Tutorial zum DTCWT. Der Fokus des Tutorials liegt nicht auf der Wavelet-Transformation an sich , aber der Grund, den ich empfehle, ist der fantastische Einblick in die Probleme, die mit der DWT verbunden sind, und wie sie gelindert werden könnten (ich würde sagen, es erfordert ein grundlegendes Verständnis zuerst aber). Es verbindet wirklich ein Verständnis von Wavelets mit einem Verständnis der Fourier-Transformation und warum diese die schönen Eigenschaften hat, die sie hat.
Wenn Sie mehr Referenzcode für die Haar-Transformation wünschen , hat mein ehemaliger Supervisor einige Matlab-Beispiele auf seiner Webseite (die Zip-Datei unter "4F8 Image Coding Course", HAAR2D.M und IHAAR2D.M). Dies sind jedoch sehr viele Lehrbeispiele.
quelle