Implémentation MATLAB de la Transformée en Ondelettes Complexes à Double Arbre et de sa Décomposition en Paquets

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.

Étiquettes: MATLAB DTCWT DTCWPT Transformée en Ondelettes traitement du signal

Publié le 5 juillet à 16h25