Actualmente me estoy sumergiendo en Wavelets y estoy un poco confundido acerca de ciertas cosas.
En primer lugar, esto NO es tarea. Es solo para codificación recreativa.
Para obtener una mejor comprensión, implementé el esquema de elevación para la wavelet LeGal 5/3 en C. Por lo que puedo ver, parece funcionar. Puedo invertirlo y las imágenes originales se reproducen correctamente. En pseudocódigo, mi dwt directo se ve así:
// deinterleave splits the low band from the high band // (eg 1 0 3 0 6 0 8 1 11 becomes 1 3 6 8 11 | 0 0 0 1) for each row in image: dwt1d(row) deinterleave(row) for each col in image: dwt1d(col) deinterleave(col)Pero lucho con un par de cosas.
Al aplicar el dwt, obtengo mi imagen transformada, pero los valores están fuera de rango [0 - 255]. Por lo tanto, los guardo en pantalones cortos. Algunos son negativos, y algunos son muy grandes. Ahora, ¿cómo puedo mostrarlos para obtener esas imágenes bonitas como se muestra aquí: ( http://www.whydomath.org/node/wavlets/images/Largetoplevelwt.gif )? Si muestro mi imagen en Matlab con imshow(image, []) , mi salida se ve así: http://i.imgur.com/dNaYwEE.jpg . Entonces, ¿tengo que hacer alguna transformación en mis subbandas? En caso afirmativo, ¿alguien puede señalarme una solución o decirme qué hacer?
En la literatura, a veces veo que las subbandas están ordenadas así: [ LL LH; HL HH ] ya veces así: [ LL HL; LHHH]. Este último, lo veo principalmente cuando el papel es sobre JPEG2000 y también es lo que produce mi algoritmo. Sin embargo, en Matlab, cuando se usa la función lwt2, devuelve el diseño anterior. Veo esto también cuando comparo mi salida con la salida de Matlab. Parece que LH y HL están mezclados. ¿Como puede ser? ¿Importa? ¿Tiene algo que ver con el uso de elevación en lugar de convolución?
¿Importa realmente si uno hace filas primero y luego columnas o viceversa? No veo ninguna diferencia en mi salida cuando cambio el orden. Lo único que sería diferente es que LH se convierte en HL y HL se convierte en LH. Sin embargo, eso no resuelve mi segunda pregunta porque el resultado es el mismo. Es solo notacional, supongo. Entonces, ¿importa? Vi papeles donde hacen col-fila y otros donde hacen fila-col. Ambos con respecto a JPEG2000.
Muchas gracias. Si alguien pudiera arrojar algo de luz sobre mis problemas, estaría muy agradecido.
Saludos amables, Markus
Escribí un blog sobre la construcción de un sistema de compresión de imágenes WDR. Usted puede leer más aquí:
http://trueharmoniccolours.co.uk/Blog/
(Notarás que no soy un blogger muy prolífico ;) ). Debe contener todo lo que necesita para implementar su propia versión C++ de la compresión de imágenes WDR. ¡Si no, no dudes en enviarme un mensaje y preguntar!
Sí, esta es una "característica" realmente poco documentada de lo que pude resolver. El valor devuelto por el DWT es en realidad corto y requiere el rango de -255 a +255. Ahora, por supuesto, -255 no se puede renderizar directamente cuando se usa color de 8 bits. Como tal, lo que la gente suele hacer es dividir el valor por 2 y agregar 128 para mostrar (no olvide que la pantalla es solo una herramienta para depurar). De esta manera, mueve 0 para que sea 128 y, por lo tanto, un "gris medio" en una imagen en escala de grises.
Realmente no importa siempre que haga la transformación inversa de la misma manera que hace la transformación directa.
No, no debería hacer ninguna diferencia. Al implementar, usted decide dónde escribir el píxel de destino para que pueda escribirlo donde desee (en una imagen completamente diferente, por ejemplo).
Editar : con respecto a su comentario, la ecuación de elevación Daub 5/3 es la siguiente:
d = s[n + 1] - ((s[n + 0] + s[n + 2]) / 2); Entonces, en el caso de una imagen de origen de 255, 0, 255 ... eso daría como resultado un anuncio de -255 . Comenzar con 0, 255, 0 daría el máximo de 255 , por lo que definitivamente debería estar en el rango -255 to +255 o hay algún problema con su implementación.