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