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