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
fuente
Respuestas:
Es útil pensar en la transformada wavelet en términos de la Transformada discreta de Fourier (por varias razones, consulte a continuación). En la Transformada de Fourier, descompone una señal en una serie de funciones trigonométricas ortogonales (cos y sin). Es esencial que sean ortogonales para que sea posible descomponer sus señales en una serie de coeficientes (de dos funciones que son esencialmente INDEPENDIENTES entre sí) y recomponerlas nuevamente.
Con este criterio de ortogonalidad en mente, ¿es posible encontrar otras dos funciones que sean ortogonales además del cos y el pecado?
Sí, es posible crear tales funciones con la característica útil adicional de que no se extienden hasta el infinito (como lo hacen el cos y el pecado). Un ejemplo de ese par de funciones es el Haar Wavelet .
Ahora, en términos de DSP, quizás sea más práctico pensar en estas dos "funciones ortogonales" como dos filtros de Respuesta de Impulso Finito (FIR) y la Transformación de Onda Discreta como una serie de Convoluciones (o en otras palabras, aplicar estos filtros sucesivamente en algunas series de tiempo). Puede verificar esto comparando y contrastando las fórmulas del DWT 1-D y la de convolución .
De hecho, si observa las funciones de Haar de cerca, verá los dos filtros de paso bajo y paso alto más elementales. Aquí hay un filtro de paso bajo muy simple h = [0.5,0.5] (no se preocupe por la escala por el momento) también conocido como filtro de promedio móvil porque esencialmente devuelve el promedio de cada dos muestras adyacentes. Aquí hay un filtro de paso alto muy simple h = [1, -1] también conocido como diferenciador porque devuelve la diferencia entre dos muestras adyacentes.
Para realizar DWT-IDWT en una imagen, es simplemente un caso de usar las versiones bidimensionales de convolución (para aplicar sus filtros Haar sucesivamente).
Quizás ahora pueda comenzar a ver de dónde provienen las partes LowLow, LowHigh, HighLow, HighHigh de una imagen que ha sufrido DWT. SIN EMBARGO, tenga en cuenta que una imagen ya es DOS DIMENSIONALES (tal vez esto sea confuso algunas veces). En otras palabras, debe derivar las frecuencias espaciales baja-alta para el eje X y los mismos rangos para el eje Y (es por eso que hay dos bajos y dos altos por eje)
Realmente debe intentar codificar esto por su cuenta desde los primeros principios para que pueda comprender todo el proceso. Es muy fácil encontrar un código listo que haga lo que está buscando, pero no estoy seguro de que esto realmente lo ayude a largo plazo.
Aquí es donde realmente "vale la pena" pensar en el DWT en términos de la Transformada de Fourier. Por la siguiente razón:
En la Transformada de Fourier (y, por supuesto, también la DCT), transforma MUCHAS MUESTRAS (en el dominio del tiempo) en UN coeficiente (complejo) (en el dominio de la frecuencia). Esto se debe a que construyes diferentes sinusoides y cosinusoides y luego los multiplicas con tu señal y obtienes el promedio de ese producto. Entonces, usted sabe que un solo coeficiente Ak representa una versión escalada de una sinusoide de cierta frecuencia (k) en su señal.
Ahora, si observa algunas de las funciones wavelet, notará que son un poco más complejas que las simples sinusoides. Por ejemplo, considere la Transformada de Fourier del filtro de Haar de paso alto ... El filtro de Haar de paso alto parece una onda cuadrada, es decir, tiene bordes afilados (transiciones agudas) ... ¿Qué se necesita para crear BORDES AFILADOS? .. ... Muchos, muchos sinusoides y co-sinusoides diferentes (!)
Por lo tanto, representar su señal / imagen usando wavelets le ahorra más espacio que representarlo con las sinusoides de un DCT porque UN conjunto de coeficientes wavelet representa MÁS COEFICIENTES DCT. (Un tema un poco más avanzado pero relacionado que podría serle de ayuda para comprender por qué esto funciona de esta manera es el Filtrado combinado ).
Dos buenos enlaces en línea (al menos en mi opinión :-)) son: http://faculty.gvsu.edu/aboufade/web/wavelets/tutorials.htm y; http://disp.ee.ntu.edu.tw/tutorial/WaveletTutorial.pdf
Personalmente, he encontrado muy útiles los siguientes libros: http://www.amazon.com/A-Wavelet-Tour-Signal-Processing/dp/0124666051 (Por Mallat) y; http://www.amazon.com/Wavelets-Filter-Banks-Gilbert-Strang/dp/0961408871/ref=pd_sim_sbs_b_3 (Por Gilbert Strang)
Ambos son libros absolutamente brillantes sobre el tema.
espero que esto ayude
(lo siento, acabo de notar que esta respuesta puede estar ejecutándose demasiado tiempo: - /)
fuente
Comencé a escribir esto antes de la respuesta de @A_A , pero esa respuesta es excelente. Aún así, espero que lo siguiente pueda agregar un poco a su comprensión.
La idea detrás de la descomposición de la base de la señal es que la señal se puede representar de alguna manera mejor en una base alternativa. Por mejor , queremos decir que la señal es de alguna manera más susceptible de procesamiento, comprensión o lo que sea , en realidad no importa.
Un punto a tener en cuenta es que, particularmente con las transformaciones ortonormales, su señal sigue siendo su señal, sea cual sea la base en la que se encuentre. No debe pensar que una base es de alguna manera el dominio correcto (uso dominio para significar base en el sentido general) .
Ahora, diferentes bases tienen diferentes propiedades. Estoy seguro de que conoce bien el teorema de convolución que describe la relación útil entre el dominio de Fourier y el dominio del tiempo. Esto hace que el dominio de Fourier sea útil para realizar operaciones de convolución en el dominio del tiempo.
En general, se puede considerar que el dominio de tiempo (o píxel) tiene una excelente resolución de tiempo (o espacial) y una resolución de baja frecuencia. Por el contrario, se puede considerar que el dominio de Fourier tiene una resolución de frecuencia excelente y una resolución de mal tiempo (o espacial).
Las bases de wavelet encajan en algún lugar en el medio de las dos anteriores. Tienden a tener buena resolución de frecuencia y buen tiempo o resolución espacial. Una propiedad de la transformada wavelet es la buena dispersión de las imágenes naturales. Con esto, quiero decir que la energía de la imagen se comprime en unos pocos coeficientes grandes y muchos coeficientes pequeños. Esto significa que la mayor parte de la información destacada de la señal está representada por un conjunto relativamente pequeño de valores. Esta es la esencia de la compresión.
Las diferentes wavelets tienen diferentes propiedades. Además de las referencias de @A_A, también recomiendo este tutorial de IEEE sobre el DTCWT. El enfoque del tutorial no está en la transformación wavelet per se , pero la razón por la que lo recomiendo es por la fantástica información que presenta sobre los problemas asociados con el DWT y cómo podrían aliviarse (yo diría que requiere una comprensión básica primero sin embargo). Realmente une la comprensión de las wavelets con la comprensión de la transformada de Fourier y por qué esta última tiene las buenas propiedades que tiene.
Si desea obtener más código de referencia sobre la transformación de Haar, mi antiguo supervisor tiene algunos ejemplos de matlab en su página web (el archivo zip en "4F8 Image Coding Course", HAAR2D.M e IHAAR2D.M). Sin embargo, estos son muchos ejemplos de enseñanza.
fuente