1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152
| clear all
clc
% Initialisation
compoHF=[];
compoDelta=[];
predicteur=[1 0 0 0];
% Chargement de l'image dans l'espace de travail
X = imread ('C:\Users\abouteiller\Documents\MATLAB\Code\Compression\Image 03.jpg');
X = double(X);
%% Choix Tuiles / Coefficient de qualite / nombre d'iteration
choixNbreTuiles = menu('Choix du nombre de tuiles','1x1 (1 tuile)','2x2 (4 tuiles)','4x4 (16 tuiles)','8x8 (64 tuiles)');
switch (choixNbreTuiles)
case 1
n=1;
case 2
n=2;
case 3
n=4;
case 4
n=8;
end
message = {'Entrer le coefficient de qualité (entre 0 et 100) : '};
titreDialogue = 'Choix de l''indice de qualité';
nbrLignes = 1;
valeurParDefault = {'50'};
qualite = cell2mat(inputdlg(message,titreDialogue,1,{'50'}));
qualite = str2num(qualite);
nbreIteration = 2; %menu('Sélection du nombre d''itération','1','2','3','4');
%% Calcul du seuil
seuil1=2^(15*(100-qualite)/100);
seuil2 = 2^(15*(100-(qualite-40))/100);
%% Décomposition des tuiles
%Dimension des tuiles
tailleImage=size(X);
T1=tailleImage(1)/10;
T2=tailleImage(2)/10;
M=tailleImage(1)/n; % 1 correspond aux lignes de l'image initiale
N=tailleImage(2)/n; % 2 correspond aux colonnes de l'image initiale
compo3=[];
t=0;
for l=1:n % n= nombre de tuiles en lignes
for c=1:n
debutLigne_Tuile=(l*M)-M+1;
finLigne_Tuile=l*M;
debutCol_Tuile=(c*N)-N+1;
finCol_Tuile=c*N;
Tuile1=X(debutLigne_Tuile:finLigne_Tuile,debutCol_Tuile:finCol_Tuile,1);
Tuile2=X(debutLigne_Tuile:finLigne_Tuile,debutCol_Tuile:finCol_Tuile,2);
Tuile3=X(debutLigne_Tuile:finLigne_Tuile,debutCol_Tuile:finCol_Tuile,3);
Tuile=cat(3,Tuile1,Tuile2,Tuile3);
Tuile=uint8(Tuile);
%% Compression de la tuile
%YCbCr
Tuile_YCbCr = rgbversycbcr(Tuile);
compo2 = [];
for composante = 1:3 % Adressage des composantes (Y, Cb ou Cr)
if composante == 1
seuil = seuil1; % Application du premier seuil de quantification (composante de luminance Y)
else
seuil = seuil2; % Application du second seuil de quantification (composantes de chrominance Cb et Cr)
end
seuil=uint8(seuil);
LL = Tuile_YCbCr(:,:,composante) - 128; % Sélection de la composante courante et ajustement de la dynamique
compoDELTA_prim = [];
%nombre d'iterations
for i=1:nbreIteration
%DWT
[LL,HL,LH,HH] = imgdwt(LL);
%Quantification des images hautes fréquences
[HLq,deltaHL] = quantificationHF(HL,seuil);
[LHq,deltaLH] = quantificationHF(LH,seuil);
[HHq,deltaHH] = quantificationHF(HH,seuil);
hl=HLq';
lh=LHq';
hh=HHq';
%Stockage des données en colonne
compoHF=[hl(:);lh(:);hh(:);compoHF];
compoDELTA_prim=[deltaHL;deltaLH;deltaHH;compoDELTA_prim];
i=i+1;
end
LL_dpcm = dpcm(LL,predicteur); %Codage DPCM sur l'image basse fréquence
compoDelta = [compoDelta;compoDELTA_prim];
compo1 = [LL_dpcm(:);compoHF]; % Composantes correspondant à une composante couleur dans une tuile
compo2 = [compo2;compo1]; % Composantes correspondant à une tuile
end
compo3 = [compo3;compo2];
%--- Passage de YCbCr vers les niveaux de gris ---%
I = double(Tuile_YCbCr)/255.0;
I = rgb2gray(I);
%--- Détection de contours ---%
% Filtre Prewitt
[Gh_prewitt,Gv_prewitt,G_prewitt,G_prewitt_seuil] = Prewitt(I); % Appel de la fonction Prewitt créée à part
%Affichage des tuiles
t=t+1;
figure(1)
subplot(n,n,t)
imshow(G_prewitt_seuil,[]);
G_prewitt_seuil_fin{l,c} = G_prewitt_seuil;
%% Essai de l'affichage de toutes les tuiles assemblées avec la fonction cell2mat mais sans succès
%image_reconstituee = size(G_prewitt_seuil);
%C = {[image_reconstituee]*n};
%A = cell2mat(C); % cell2mat(tableau)
end
%% Essai de l'affichage de toutes les tuiles assemblées avec une boucle mais sans succès
% for ligne = 1:l
% for colonne = 1:c
% image_reconstituee(ligne,colonne)=G_prewitt_seuil(t);
% end
% end
end
G_prewitt_seuil_fin = cell2mat(G_prewitt_seuil_fin);
figure(2)
imshow(G_prewitt_seuil_fin,[]);
msgbox('L''image a été compressée avec succès','Compte rendu') |
Partager