Je veux effectuer une transformée en ondelettes discrète 2D haar et un DWT inverse sur une image. Pourriez-vous expliquer la transformée en ondelettes discrète 2D haar et DWT inverse dans un langage simple et un algorithme à l'aide duquel je peux écrire le code pour 2D haar dwt"Les informations fournies dans google étaient trop techniques. J'ai compris les choses de base comme la division de l'image en 4 sous-bandes: LL, LH, HL, HH mais je ne comprends pas vraiment comment écrire un programme pour exécuter DWT et IDWT sur une image.J'ai aussi lu que DWT est meilleur que DCT car il est effectué sur l'image dans son ensemble et puis il y a eu quelques explications qui sont allées au-dessus de ma tête.Je peux me tromper ici mais je pense que les techniques de compression DWT et DCT parce que la taille de l'image diminue lorsque DWT ou DCT est exécuté sur eux. J'espère que vous partagez une partie de vos connaissances et améliorez mes connaissances.
Merci
Re: Cela a-t-il quelque chose à voir avec le format d'image. Quelle est la "valeur de pixel" qui est utilisée dans DWT? J'ai supposé que c'était la valeur RVB de l'image.
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 sortie est une image noire avec une fine ligne entre les deux, en bref nulle part près de la sortie réelle.Je pense que j'ai mal interprété la logique.Veuillez signaler les erreurs. Cordialement
la source
Réponses:
Il est utile de penser à la transformée en ondelettes en termes de transformée de Fourier discrète (pour un certain nombre de raisons, voir ci-dessous). Dans la transformée de Fourier, vous décomposez un signal en une série de fonctions trigonométriques orthogonales (cos et sin). Il est essentiel qu'ils soient orthogonaux afin qu'il soit possible de décomposer vos signaux en une série de coefficients (de deux fonctions essentiellement indépendantes l'une de l'autre) et de le recomposer à nouveau.
Avec ce critère d'orthogonalité à l'esprit, est-il possible de trouver deux autres fonctions orthogonales en plus du cos et du sin?
Oui, il est possible de proposer de telles fonctions avec la caractéristique supplémentaire utile qu'elles ne s'étendent pas à l'infini (comme le cos et le sin). Un exemple d'une telle paire de fonctions est l' ondelette de Haar .
Maintenant, en termes de DSP, il est peut-être plus pratique de penser à ces deux "fonctions orthogonales" comme deux filtres à réponse impulsionnelle finie (FIR) et à la transformée en ondelettes discrète comme une série de convolutions (ou en d'autres termes, d'appliquer ces filtres successivement sur certaines séries chronologiques). Vous pouvez le vérifier en comparant et en contrastant les formules du DWT 1-D et celle de la convolution .
En fait, si vous remarquez de près les fonctions Haar, vous verrez les deux filtres passe-bas et passe-haut les plus élémentaires. Voici un filtre passe-bas très simple h = [0,5,0,5] (ne vous inquiétez pas pour la mise à l'échelle pour le moment) également connu sous le nom de filtre de moyenne mobile car il renvoie essentiellement la moyenne de tous les deux échantillons adjacents. Voici un filtre passe-haut très simple h = [1, -1] également connu sous le nom de différenciateur car il renvoie la différence entre deux échantillons adjacents.
Pour effectuer DWT-IDWT sur une image, il s'agit simplement d'utiliser les versions bidimensionnelles de convolution (pour appliquer successivement vos filtres Haar).
Peut-être que maintenant vous pouvez commencer à voir d'où viennent les parties LowLow, LowHigh, HighLow, HighHigh d'une image qui a subi un DWT. TOUTEFOIS, veuillez noter qu'une image est déjà EN DEUX DIMENSIONS (cela peut être source de confusion parfois). En d'autres termes, vous devez dériver les fréquences spatiales basses-hautes pour l'axe X et les mêmes plages pour l'axe Y (c'est pourquoi il y a deux basses et deux hautes par axe)
Vous devez vraiment essayer de coder cela par vous-même à partir des premiers principes afin de comprendre tout le processus. Il est très facile de trouver un morceau de code prêt à l'emploi qui fera ce que vous cherchez, mais je ne suis pas sûr que cela vous aiderait vraiment à long terme.
C'est là qu'il est vraiment «payant» de penser au DWT en termes de transformée de Fourier. Pour la raison suivante:
Dans la transformée de Fourier (et bien sûr le DCT également), vous transformez DE NOMBREUX ÉCHANTILLONS (dans le domaine temporel) en UN (complexe) coefficient (dans le domaine fréquentiel). En effet, vous construisez différentes sinusoïdes et cosinusoïdes, puis vous les multipliez avec votre signal et obtenez la moyenne de ce produit. Donc, vous savez qu'un seul coefficient Ak représente une version à l'échelle d'une sinusoïde d'une certaine fréquence (k) dans votre signal.
Maintenant, si vous regardez certaines des fonctions d'ondelettes, vous remarquerez qu'elles sont un peu plus complexes que les simples sinusoïdes. Par exemple, considérons la transformée de Fourier du filtre Haar passe-haut ... Le filtre Haar passe-haut ressemble à une onde carrée, c'est-à-dire qu'il a des arêtes vives (transitions nettes) ... Que faut-il pour créer des BORDS SHARP? .. ... Beaucoup, beaucoup de sinusoïdes et de co-sinusoïdes différents (!)
Par conséquent, représenter votre signal / image à l'aide d'ondelettes vous permet d'économiser plus d'espace que de le représenter avec les sinusoïdes d'un DCT car UN ensemble de coefficients d'ondelettes représente PLUS DE COEFFICIENTS DCT. (Un sujet légèrement plus avancé mais connexe qui pourrait vous aider à comprendre pourquoi cela fonctionne de cette façon est le filtrage adapté ).
Deux bons liens en ligne (à mon avis au moins :-)) sont: http://faculty.gvsu.edu/aboufade/web/wavelets/tutorials.htm et; http://disp.ee.ntu.edu.tw/tutorial/WaveletTutorial.pdf
Personnellement, j'ai trouvé très utiles les livres suivants: http://www.amazon.com/A-Wavelet-Tour-Signal-Processing/dp/0124666051 (By Mallat) et; http://www.amazon.com/Wavelets-Filter-Banks-Gilbert-Strang/dp/0961408871/ref=pd_sim_sbs_b_3 (par Gilbert Strang)
Ce sont deux livres absolument brillants sur le sujet.
J'espère que ça aide
(désolé, je viens de remarquer que cette réponse est peut-être un peu trop longue: - /)
la source
J'ai commencé à écrire ceci avant la réponse de @A_A , mais cette réponse est excellente. J'espère néanmoins que ce qui suit pourrait ajouter un peu à votre compréhension.
L'idée derrière la décomposition de base du signal est que le signal peut être mieux représenté d' une autre manière. En plus , nous voulons dire que le signal est en quelque sorte plus favorable au traitement, ou comprendre, ou quel que soit - il ne compte pas vraiment.
Un point à noter est que, en particulier avec les transformations orthonormales, votre signal est toujours le signal quelle que soit base , il est. Vous ne devriez pas penser à une base comme étant en quelque sorte le bon domaine (j'utilise domaine à base moyenne dans le sens général) .
Maintenant, différentes bases ont des propriétés différentes. Je suis sûr que vous connaissez bien le théorème de convolution décrivant la relation utile entre le domaine de Fourier et le domaine temporel. Cela rend le domaine de Fourier utile pour effectuer des opérations de convolution dans le domaine temporel.
En général, le domaine temporel (ou pixel) peut être considéré comme ayant une excellente résolution temporelle (ou spatiale) et une mauvaise résolution fréquentielle. Inversement, le domaine de Fourier peut être considéré comme ayant une excellente résolution en fréquence et une mauvaise résolution temporelle (ou spatiale).
Les bases d'ondelettes s'insèrent quelque part au milieu des deux ci-dessus. Ils ont tendance à avoir une bonne résolution en fréquence et une bonne résolution temporelle ou spatiale. Une propriété de la transformée en ondelettes est la bonne sparsification des images naturelles. Par cela, je veux dire que l'énergie de l'image est compressée en quelques grands coefficients et en de nombreux petits coefficients. Cela signifie que la plupart des informations saillantes du signal sont représentées par un ensemble relativement petit de valeurs. C'est l'essence même de la compression.
Différentes ondelettes ont des propriétés différentes. En plus des références de @A_A, je recommande également ce tutoriel IEEE sur le DTCWT. Le didacticiel ne se concentre pas sur la transformation en ondelettes en soi , mais la raison pour laquelle je le recommande est en raison de la perspicacité fantastique qu'il présente sur les problèmes associés au DWT et comment ils pourraient être atténués (je dirais qu'il nécessite une compréhension de base d'abord cependant). Il relie vraiment une compréhension des ondelettes avec une compréhension de la transformée de Fourier et pourquoi cette dernière a les belles propriétés qu'elle possède.
Si vous souhaitez plus de code de référence sur la transformation Haar, mon ancien superviseur a quelques exemples de matlab sur sa page Web (le fichier zip sous "4F8 Image Coding Course", HAAR2D.M et IHAAR2D.M). Ce sont des exemples très pédagogiques.
la source