Transformée en Ondelettes Complexes à Double Arbre (DTCWT)
Code des fonctions principales
Pour effectuer une DTCWT, on charge d'abord les filtres prédéfinis. Les coefficients des filtres near_sym_b et qshift_b sont stockés dans des fichiers MATLAB.
% Chargement des filtres préconfigurés (nécessite la toolbox dtcwt)
load('coeffs_biorthogonaux.mat'); % Contient les coefficients pour le filtre biorthogonal
load('coeffs_quarter_shift.mat'); % Contient les coefficients pour le décalage quart
% Décomposition DTCWT unidimensionnelle
function [approx, details] = dtcwt_1d(signal_input, decomposition_level, biort_name, qshift_name)
if nargin < 3, biort_name = 'near_sym_b'; end
if nargin < 4, qshift_name = 'qshift_b'; end
[approx, details] = dualtree(signal_input, decomposition_level, biort_name, qshift_name);
end
% Décomposition DTCWT bidimensionnelle
function [approx, details] = dtcwt_2d(image_input, decomposition_level, biort_name, qshift_name)
if nargin < 3, biort_name = 'near_sym_b'; end
if nargin < 4, qshift_name = 'qshift_b'; end
[approx, details] = dtwavexfm2(image_input, decomposition_level, biort_name, qshift_name);
end
% Reconstruction DTCWT unidimensionnelle
function reconstructed_signal = idtcwt_1d(approx, details, biort_name, qshift_name)
reconstructed_signal = idualtree(approx, details, biort_name, qshift_name);
end
% Reconstruction DTCWT bidimensionnelle
function reconstructed_image = idtcwt_2d(approx, details, biort_name, qshift_name)
reconstructed_image = dtwaveifm2(approx, details, biort_name, qshift_name);
end
Exemples d'application
Voici un exemple pour le traitement d'un signal unidimensionnel contenant du bruit.
% Création d'un signal de test
temps = linspace(0, 1, 101);
signal_original = sin(2*pi*5*temps) + 0.5*randn(1, 101);
% Décomposition DTCWT
[coeffs_bas, coeffs_haut] = dtcwt_1d(signal_original, 3, 'near_sym_b', 'qshift_b');
% Reconstruction pour vérification
signal_reconstruit = idtcwt_1d(coeffs_bas, coeffs_haut, 'near_sym_b', 'qshift_b');
% Visualisation
figure;
subplot(2,1,1); plot(temps, signal_original); title('Signal original');
subplot(2,1,2); plot(temps, signal_reconstruit); title('Signal reconstruit');
Pour le traitement d'image, on utilise une image standard de test.
% Chargement d'une image
image_chargee = imread('cameraman.tif');
image_double = im2double(image_chargee);
% Décomposition DTCWT
[coeffs_bas, coeffs_haut] = dtcwt_2d(image_double, 3, 'near_sym_b', 'qshift_b');
% Affichage de la sous-bande basse fréquence
figure; imshow(coeffs_bas(:,:,1), []); title('Sous-bande basse fréquence');
Transformée en Paquets d'Ondelettes Complexes à Double Arbre (DTCWPT)
Code des fonctions principales
% Décomposition DTCWPT bidimensionnelle
function resultat_paquet = dtwpt_2d(input_image, niveaux, filtre_biort, filtre_qshift)
[hauteur, largeur] = size(input_image);
resultat_paquet = cell(niveaux, 6); % 6 sous-bandes haute fréquence
% Décomposition initiale
[cA, cH, cV, cD] = dwt2(input_image, 'haar');
resultat_paquet{1,1} = cA;
% Décomposition récursive des sous-bandes
for niveau = 1:niveaux-1
for bande_idx = 1:6
sous_bande_actuelle = resultat_paquet{niveau,bande_idx};
if ~isempty(sous_bande_actuelle)
[cA, cH, cV, cD] = dwt2(sous_bande_actuelle, 'haar');
resultat_paquet{niveau+1,2*bande_idx-1} = cA;
resultat_paquet{niveau+1,2*bande_idx} = cH;
end
end
end
end
% Reconstruction DTCWPT
function image_reconstruite = idtwpt_2d(resultat_paquet, niveaux, filtre_biort, filtre_qshift)
% Reconstruction à partir de la sous-bande la plus basse
courant = resultat_paquet{niveaux,1};
for niveau = niveaux-1:-1:1
for bande_idx = 1:6
if ~isempty(resultat_paquet{niveau,2*bande_idx-1}) && ~isempty(resultat_paquet{niveau,2*bande_idx})
coefficients = [resultat_paquet{niveau,2*bande_idx-1}; resultat_paquet{niveau,2*bande_idx}];
courant = idwt2(coefficients(:,1), coefficients(:,2), 'haar');
end
end
end
image_reconstruite = courant;
end
Exemple d'appilcation
% Décomposition en paquets d'une image
image_entree = imread('rice.png');
image_norm = im2double(image_entree);
paquet_resultat = dtwpt_2d(image_norm, 3, 'near_sym_b', 'qshift_b');
% Affichage des résultats par niveau
figure;
for niv = 1:3
subplot(3,6,niv*2-1); imshow(paquet_resultat{niv,1}, []); title(sprintf('Niveau %d Bas', niv));
subplot(3,6,niv*2); imshow(paquet_resultat{niv,2}, []); title(sprintf('Niveau %d Haut', niv));
end
% Reconstruction
image_recon = idtwpt_2d(paquet_resultat, 3, 'near_sym_b', 'qshift_b');
figure; imshow(image_recon); title('Image reconstruite');
Cas d'application pratiques
Débruitage d'image via DTCWT
% Ajout de bruit gaussien
image_bruitee = imnoise(image_norm, 'gaussian', 0, 0.01);
% Décomposition DTCWT
[coeffs_bas, coeffs_haut] = dtcwt_2d(image_bruitee, 3, 'near_sym_b', 'qshift_b');
% Seuillage des coefficients
for niv = 1:3
coeffs_haut{niv} = wthresh(coeffs_haut{niv}, 's', 0.1*max(abs(coeffs_haut{niv}(:))));
end
% Reconstruction débruitée
image_debruitee = idtcwt_2d(coeffs_bas, coeffs_haut, 'near_sym_b', 'qshift_b');
Diagnostic de défauts mécaniques avec DTCWPT
% Chargement d'un signal de vibration
signal_vibration = load('mesures_vibratoires.mat');
% Décomposition en paquets
paquet_diag = dtwpt_2d(signal_vibration.data, 4, 'near_sym_b', 'qshift_b');
% Extraction de caractéristiques énergétiques
energie_sous_bandes = zeros(4,6);
for niv = 1:4
for bande = 1:6
energie_sous_bandes(niv,bande) = sum(paquet_diag{niv,bande}.^2, 'all');
end
end
% Logique de décision
seuil_defaut = 0.85;
if max(energie_sous_bandes(:,4)) > seuil_defaut
diagnostic = 'Défaut détecté : usure de roulement';
else
diagnostic = 'Fonctionnement normal';
end
La configuraton des paramètres tels que le nombre de niveaux de décomposition et les types de filtres doit être adoptée aux spécificités de chaque application, que ce soit en traitement du signal ou en analyse d'images.