Quiero realizar una transformación de wavelet discreta de haar 2D y DWT inverso en una imagen. ¿Podría explicar la transformación de wavelet discreta de haar 2D y DWT inverso en un lenguaje simple y un algoritmo con el que puedo escribir el código para dwt de haar 2DLa información dada en Google era demasiado técnica. Comprendí las cosas básicas como dividir la imagen en 4 sub-bandas: LL, LH, HL, HH, pero realmente no puedo entender cómo escribir un programa para realizar DWT e IDWT en una imagen. También leí que DWT es mejor que DCT, ya que se realiza en la imagen como un todo y luego hubo alguna explicación que me pasó por la cabeza. Podría estar equivocado aquí, pero creo que las técnicas de compresión DWT y DCT porque el tamaño de la imagen se reduce cuando se realiza DWT o DCT en ellos. Espero que ustedes compartan una parte de su conocimiento y mejoren mi conocimiento.
Gracias
Re: ¿Tiene algo que ver con el formato de imagen. ¿Cuál es el "valor de píxel" que se utiliza en DWT? He asumido que es el valor rgb de la imagen.
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();
}
}
}
La salida es una imagen en negro con una línea delgada en el medio, en resumen, ni mucho menos cerca de la salida real. Creo que he interpretado la lógica de manera incorrecta. Señale los errores. Saludos