Sujet

Transcription

Sujet
Université Joseph Fourier
UE MAP110/120
DLST
Année 2013-14
Thème Image - TP1 - Images au format bitmap
Compte-rendu
Il vous est demandé de rédiger un compte-rendu pour ce TP.
Ouvrez en parallèle un document Open Office Writer dans lequel vous allez mettre pour chaque exercice
les différents résultats obtenus, les commandes qui vous ont permis de les obtenir, et les réflexions et
commentaires que cela vous inspire.
• Quelques indications pour la rédaction du rapport :
– Indiquer vos noms et prénoms en début du rapport.
– Pour copier un ensemble d’instructions dans le compte-rendu faire un copier-coller à partir de l’éditeur
puis mettre l’ensemble d’instructions avec la police de caractère Courier.
– Pour copier une image à partir de Scilab, dans le menu File/Fichier, choisir l’item Export/Exporter
puis sauvegarder au format GIF avec un nom de fichier terminant par l’extension .gif
– Pour inclure ensuite l’image dans le rapport, choisir dans le menu Insertion, l’item Image/Picture
et l’item A partir du fichier/From a file, et sélectionner le fichier GIF précédemment sauvegardé
à partir de Scilab. L’image peut éventuellement être réduite ou agrandie dans le traitement de texte.
Le compte-rendu devra être exporté au format PDF puis envoyé par e-mail
avant le mardi 28 janvier à l’adresse [email protected]
et en indiquant comme sujet [MAP120]-TP1-IMAGE-noms et prenoms du binome .
Récupération des fichiers nécessaires à la séance machine
Un certain nombre de fichiers sont nécessaires à cette séance machine. Pour récupérer ces fichiers :
– créez dans votre répertoire personnel, un répertoire nommé TP1-IMAGE,
– sur le site ALFRESCO - Espaces collaboratifs
https://espaces-collaboratifs.grenet.fr/share/page/site/UJFueDDMAP110120/dashboard
dans la partie Espace documentaire et le répertoire Theme Image/TP1, récupérez le fichier _archive1.zip,
en cas de problème avec le site ALFRESCO - Espaces collaboratifs, utiliser l’URL
http://www-ljk.imag.fr/membres/Nicolas.Szafran/ENSEIGNEMENT/L1/DDMAP110-120/
– placez le fichier _archive1.zip dans votre répertoire TP1-IMAGE, décompactez l’archive et vérifiez
ensuite que les fichiers suivants sont présents
afficher_image_gris.sci bastille.bmp ciel.bmp degrade-1.bmp
degrade-2.bmp desert.bmp ex_operation1.sce ex_operation2.sce
fruits.bmp init_tp_image.sce lire_imageBMPgris.sci manoir.bmp
masque-desert.bmp papillon.bmp sculpture.bmp
– démarrez SCILAB et placez-vous dans votre répertoire TP1-IMAGE
MAP110/120 - 2013-14
1
TP1-Image
1 - Création et affichage d’images en noir et blanc
1.1 - Image définie par un tableau de valeurs 0 ou 1
Pour créer une image en noir et blanc, il faut définir un tableau de chiffres binaires (0 ou 1) puis
l’afficher avec 2 niveaux de gris.
• Exemple : créez le fichier suivant en le nommant ex1imageNB.sce et exécutez-le :
// chargement des fonctions necessaires au TP
exec("init_tp_image.sce",-1);
// l’image du caractère 2
// image de dimensions L=7 et H=9 : tableau avec 9 lignes et 7 colonnes
// IMPORTANT : séparer chaque valeur par un espace
IMAGE2 = [
1 1 1 1 1 1 1;
1 1 0 0 0 1 1;
1 0 1 1 1 0 1;
1 1 1 1 1 0 1;
1 1 1 1 0 1 1;
1 1 1 0 1 1 1;
1 1 0 1 1 1 1;
1 0 0 0 0 0 1;
1 1 1 1 1 1 1];
// affichage de l’image dont le tableau est IMAGE2 avec 2 niveaux de gris
// et une échelle 1
afficher_image_gris(IMAGE2,2,1);
• Pour afficher l’image en plus grand, il faut modifier le troisième paramètre de la fonction d’affichage
afficher_image_gris .
Par exemple, dans le fichier ex1imageNB.sce
remplacez les lignes :
par les lignes :
// et une échelle 1
afficher_image_gris(IMAGE2,2,1);
// et une échelle 20
afficher_image_gris(IMAGE2,2,20);
Exercice 1 :
Complétez le fichier ex1imageNB.sce afin de créer d’autres tableaux correspondants à d’autres
images en noir et blanc, par exemple les images des caractères
A, M, P, 0 et 1, en faisant en sorte que chaque image ait la même hauteur (égale à 9 dans l’exemple).
1.2 - Concaténation d’images
Une fois ces images créées, concatènez-les pour former des images plus grandes :
par exemple si IMAGE0 est le tableau de l’image du caractère 0, IMAGE1 est le tableau de l’image du
caractère 1 et IMAGE2 est le tableau de l’image du caractère 2, on peut créer l’image du nombre 2012
en concaténant les tableaux [ IMAGE2 IMAGE0 IMAGE1 IMAGE2 ] en un seul :
IMAGE2001 = [ IMAGE2 IMAGE0 IMAGE0 IMAGE2 ];
afficher_image_gris(IMAGE2001,2,10);
Exercice 2 :
Avec le même principe, créez l’image du sigle MAP110 ou MAP120.
MAP110/120 - 2013-14
2
TP1-Image
1.3 - Image créée par programme
Une image peut aussi être créée pixel par pixel en utilisant une boucle d’instructions.
• Exemple : créez le fichier ex2image.sce suivant et exécutez-le :
exec("init_tp_image.sce",-1);
// création d’une image de dimension 50 x 50 avec tous les pixels noirs
IMAGE = zeros(50,50);
for i=1:50
for j=1:50
// pixel blanc si i+j multiple de 7
if modulo(i+j,7)==0 then
IMAGE(i,j) = 1;
end
end
end
// affichage de l’image
afficher_image_gris(IMAGE,2,4);
• Exemple : de la même manière, créez le fichier ex3image.sce suivant afin de créer une image de taille
100 × 100 d’un disque noir de centre (xC = 50, yC = 50) et rayon r = 40 sur fond blanc :
un pixel (i, j) est noir si et seulement si (i − yC)2 + (j − xC)2 < r 2
exec("init_tp_image.sce",-1);
// création d’une image de dimension 100 x 100 avec tous les pixels blancs
L = 100; H = 100; // dimensions de l’image
IMAGE = ones(H,L);
xC=50; yC=50; r=40; // paramètres du disque
for i=1:H
for j=1:L
// pixel noir s’il appartient au disque
if (i-yC)^2+(j-xC)^2 < r^2 then
IMAGE(i,j) = 0;
end
end
end
afficher_image_gris(IMAGE,2,4);
On pourra ensuite comparer le résultat en remplaçant le signe <= (inférieur ou égal) par le signe <
(strictement inférieur).
1.4 - Transformations de base sur des images
Certaines opérations sur les tableaux permettent de faire des transformations de base sur les images.
• Renversement vertical de l’image :
il suffit de permuter la première ligne de l’image
avec la dernière, la 2ème avec l’avant-dernière, etc ...
// récupération de la hauteur de l’image
H = size(IMAGE2,1);
// permuter les lignes
IMAGEB = IMAGE2(H:-1:1,:);
afficher_image_gris(IMAGEB,2,20);
MAP110/120 - 2013-14
3
TP1-Image
• Renversement horizontal de l’image :
il suffit de permuter la première colonne de
l’image avec la dernière, la 2ème avec l’avant-dernière, etc ...
// récupération de la largeur de l’image
L = size(IMAGE2,2);
// permuter les colonnes
IMAGEB = IMAGE2(:,L:-1:1);
afficher_image_gris(IMAGEB,2,20);
• Transposition :
les lignes de l’image deviennent les colonnes et inversement (c’est un
”renversement” par rapport à la diagonale)
// transposer les lignes et les colonnes
IMAGEB = IMAGE2’;
afficher_image_gris(IMAGEB,2,20);
Exercice 3 :
En utilisant les opérations de renversement et de transposition, créez les opérations de rotation d’un
quart de tour, d’un demi-tour et trois quarts de tour (dans le sens des aiguilles d’une montre).
Image initiale
Rotation 1/4 tour
Rotation 1/2 tour
Rotation 3/4 tour
Dans le rapport, mettre les instructions permettant d’obtenir ces images.
2 - Création d’images en niveaux de gris
Les images créées précédemment étaient en noir et blanc (deux niveaux de gris).
Sur le même principe, on peut créer des images en N niveaux de gris, pour 2 < N ≤ 256 à l’aide
d’un tableau de valeurs entières comprises entre 0 et N − 1
2.1 - Images en 4 niveaux de gris
• Exemple : créez le fichier ex1image4.sce suivant et exécutez-le
exec("init_tp_image.sce",-1);
// une image 4 x 4
IMAGE = [
0 1 2 3 ;
1 2 3 2 ;
2 3 2 1 ;
3 2 1 0];
afficher_image_gris(IMAGE,4,50); // deuxieme parametre : N=4
MAP110/120 - 2013-14
4
TP1-Image
• Exemple : créez le fichier ex2image4.sce suivant
et exécutez-le
exec("init_tp_image.sce",-1);
// image de taille 50 x 50 et de couleur noir
IMAGE = zeros(50,50);
// carré de couleur 1 - gris foncé
for i=20:40
for j=20:40
IMAGE(i,j) = 1;
end
end
// ligne de verticale couleur 3 - blanc
for i=5:45
IMAGE(i,30)=3;
end
afficher_image_gris(IMAGE,4,2);
Exercice 4 :
Ecrire un script SCILAB permettant de créer
l’image ci-contre en 4 niveaux de gris
avec les dimensions L = H paires
(par exemple L = H = 100).
Dans le rapport, mettre l’ensemble du script
et l’image obtenue.
2.2 - Images en 256 niveaux de gris
• Exemple : créez le fichier image_degrade256.sce suivant et exécutez-le
exec("init_tp_image.sce",-1);
// image de taille hauteur 50 et largeur 256
IMAGE = zeros(50,256);
for i=1:50
for j=1:256
IMAGE(i,j) = j-1;
end
end
afficher_image_gris(IMAGE,256,1);
• Lecture d’image en 256 niveaux de gris
La lecture d’images se fait à l’aide de la fonction lire_imageBMPgris qui permet de lire des images
en 256 niveaux de gris et au format BMP.
Par exemple, tapez les instructions suivantes :
IMAGE=lire_imageBMPgris("papillon.bmp");
afficher_image_gris(IMAGE,256,1);
De la même manière, chargez et affichez les images correspondant aux fichiers desert.bmp, manoir.bmp,
fruits.bmp, bastille.bmp, sculpture.bmp .
MAP110/120 - 2013-14
5
TP1-Image
3 - Opération sur une image
On peut effectuer une transformation d’une image en modifiant le niveau de gris par une fonction
f : v ′ = f (v).
• Exemple : pour avoir le négatif d’une image, la fonction est f (v) = 1 − v.
Récupérer le fichier ex operation1.sce et exécutez-le.
Modifiez le script précédent afin de tester différentes images et d’autres fonctions dont celles vues
en cours :
f (v) = v/2 + 0.5, f (v) = 2v − 0.5, f (v) = v 0,6 , f (v) = v 1,5 , . . .
3.1 - Histogramme d’une image
Le tracé d’un histogramme d’une image permet d’avoir certaines informations sur l’image et
éventuellement la corriger par la suite.
Un histogramme permet de visualiser la répartition d’un ensemble de valeurs suivant différents
intervalles (classes).
• Exemple : le script suivant trace l’histogramme d’une image en 256 niveaux de gris pour n = 10
classes. Créez-le en le nommant ex histogramme.sce et exécutez-le
exec("init_tp_image.sce",-1);
// lecture et affichage d’une image
IMAGE=lire_imageBMPgris("papillon.bmp");
afficher_image_gris(IMAGE,256,1);
// passer en valeurs entre 0 et 1 pour chaque pixel
v = IMAGE/255;
// les classes
n = 10;
classes = linspace(0,1,n+1);
// tracer l’histogramme
scf();
histplot(classes,v);
Le vecteur classes contient les 10 classes (intervalles) équiréparties entre 0 et 1 :
[0, 0.1] [0.1, 0.2] [0.2, 0.3] [0.3, 0.4] [0.4, 0.5] [0.5, 0.6] [0.6, 0.7] [0.7, 0.8] [0.8, 0.9] [0.9, 1]
soit n + 1 = 11 valeurs entre 0 et 1 (classes = linspace(0,1,n+1))
Cette image montre un histogramme assez bien réparti avec le plus de valeurs correspondant aux
gris moyens.
Les images étant en 256 niveaux de gris, on peut utiliser 256 classes pour être plus précis sur
l’information donnée par l’histogramme.
Dans le script précédent, remplacer n=10 par n=256 et tracer l’histogramme correspondant.
Exercice 5 :
Tracer le graphe des histogrammes correspondants à n = 10 et n = 64 de l’image bastille.bmp
Dans le rapport, mettre les instructions permettant de tracer les histogrammes ainsi que les images
des histogrammes.
MAP110/120 - 2013-14
6
TP1-Image
4 - Correction d’une image en niveaux de gris
La correction d’une image en niveaux de gris consiste à lui appliquer une ou plusieurs fonctions afin
d’avoir un rendu visuel meilleur (dans le cas d’une sous-exposition ou sur-exposition, d’un manque de
contraste, . . .)
Pour corriger une image, on peut se servir des informations données par l’histogramme.
• Exemple : A l’aide du script précédent, tracer l’histogramme de l’image desert.bmp.
L’image est claire et peu contrastée ; on peut remarquer sur l’histogramme que les valeurs de l’image
sont pratiquement toutes comprises entre 0,3 et 0,9 avec une majorité de valeurs supérieures à 0,5 :
– la majorité des valeurs étant supérieures à 0.5, l’image est globalement claire
– les valeurs sont comprises dans l’intervalle [v1 , v2 ] = [0.3, 0.9] (intervalle des valeurs significatives)
plus petit que l’intervalle [0, 1], l’image est donc peu contrastée.
Deux corrections sont possibles et peuvent être combinées si nécessaire.
4.1 - Correction affine - étalement de l’histogramme
L’étalement de l’histogramme consiste à appliquer une fonction qui va agrandir l’intervalle des
valeurs significatives de manière à ce qu’il soit le plus grand possible. Une manière simple de faire est
d’appliquer à l’image une fonction affine f (t) = a t + b avec a > 0.
• Exemple : Pour l’image desert.bmp appliquer la fonction f pour les cas suivants :
a = 0, 6 b = 0
a = 5/3 b = 0
a=1
b=0
a = 1 b = −0, 1 a = 1 b = 0, 1
a = 5/3 b = −0, 5 a = 5/3 b = −1 a = 2, 5 b = −1
→ Remarque :
– pour une même valeur de a :
– plus b augmente, plus l’image est claire,
– plus b diminue plus l’image est foncée
– plus la valeur de a est grande, moins l’image est contrastée, et inversement
– il faut donc choisir a et b correctement pour que l’image soit ni trop pâle, ni trop contrastée, ni trop
claire, ni trop foncée.
Pour l’image desert.bmp, le meilleur résultat visuel est obtenu pour a = 5/3 et b = −0, 5 qui
permet d’étaler de manière optimale (entre 0 et 1) l’intervalle des valeurs signicatives de l’histogramme
de l’image initiale) : en effet, l’intervalle des valeurs significatives est
[v1 , v2 ] = [0, 3 , 0, 9] et on a bien f (v1 ) = 0 et f (v2 ) = 1.
Exercice 6 :
a) Si on connaı̂t les valeurs v1 et v2 de l’intervalle des valeurs significatives, trouver les expressions
de a et b en fonction de v1 et v2 pour que f (v1 ) = 0 et f (v2 ) = 1.
b) En vous servant du tracé de l’histogramme, modifier l’étalement de l’histogramme à l’aide
d’une fonction affine pour les images bastille.bmp, desert.bmp, manoir.bmp, papillon.bmp,
fruits.bmp, sculpture.bmp
MAP110/120 - 2013-14
7
TP1-Image
4.2 - Correction gamma
Une correction gamma consiste à appliquer à l’image en niveaux de gris la fonction g(t) = tα avec
α un réel strictement positif.
• Exemple : Pour l’image desert.bmp, appliquer une correction gamma et visualiser l’histogramme et
l’image après correction (tester α = 0.5, α = 0.8, α = 1, α = 1.5, α = 2)
Exercice 7 :
Pour chacune des images suivantes,
bastille.bmp, desert.bmp, manoir.bmp, papillon.bmp, fruits.bmp, sculpture.bmp,
en testant différentes valeurs de α, trouver celle qui (pour vous) donne visuellement la meilleure
correction.
Dans le rapport, indiquez seulement pour chaque image, quelle valeur de α vous semble la meilleure.
4.3 - Corrections combinées
Les deux corrections (affine et gamma) peuvent être combinées pour améliorer encore la qualité
visuelle de l’image.
Exercice 8 :
a) Effectuer sur l’image fruits.bmp la correction affine f (t) = 4t puis la correction gamma g(t) = t0.7
b) Refaire la correction sur l’image fruits.bmp
en commençant d’abord par la correction gamma g(t) = t0.7 puis la correction affine f (t) = 4t
Pourquoi n’obtient-on pas le même résultat ?
c) Refaire la correction sur l’image fruits.bmp
en commençant d’abord par la correction gamma g(t) = t0.5 puis la correction affine f (t) = 2t
Exercice 9 :
a) Pour l’image desert.bmp, appliquer la fonction de correction gamma g(t) = t1,5 .
b) Tracer l’histogramme de l’image ainsi modifiée, puis déterminer la meilleure fonction de correction
affine f (t) = a t+b pour étendre au mieux le contraste de l’image obtenue après la correction gamma
g(t) = t1,5
Dans le rapport, mettre l’image initiale, l’image corrigée par la fonction g et l’image corrigée par
les fonctions g puis f , ainsi que les valeurs des constantes a et b de la fonction f .
MAP110/120 - 2013-14
8
TP1-Image
5 - Combinaison d’images
5.1 - Opération entre deux images
On peut effectuer une opération entre 2 images par une fonction f sur les niveaux de gris :
v ′ = f (v1 , v2 )
Par la suite, on utilisera les opérations entre images suivantes :
Operation entre
les 2 images p1 et p2
produit
somme
et l’opération négatif notée p′ =
Notation
F (p1 , p2 ) = p1
F (p1 , p2 ) = p1
p2
p2
Fonction correspondante
sur les niveaux de gris
f (v1 , v2 ) = v1 × v2
f (v1 , v2 ) = Min(v1 + v2 , 1)
(p) correspondant à la fonction v ′ = f (v) = 1 − v.
Récupérer le fichier ex operation2.sce et exécutez-le.
Ce programme effectue le produit entre les images papillon.bmp et degrade-1.bmp :
papillon.bmp
degrade-1.bmp
Exercice 10 :
Modifier le fichier ex operation2.sce pour calculer les images suivantes :
papillon.bmp
papillon.bmp
papillon.bmp
papillon.bmp
degrade-2.bmp
degrade-1.bmp
degrade-2.bmp
(degrade-1.bmp)
papillon.bmp
(degrade-2.bmp)
produit entre l’image papillon.bmp et l’image degrade-2.bmp
somme entre l’image papillon.bmp et l’image degrade-1.bmp
somme entre l’image papillon.bmp et l’image degrade-2.bmp
produit entre l’image papillon.bmp
et le négatif de degrade-1.bmp
somme entre l’image papillon.bmp
et le négatif de degrade-2.bmp
Dans le rapport, mettre les images obtenues.
Exercice 11 :
En utilisant les fonctions negatif
Image D
desert.bmp
, somme
et produit
et les images
Image C
ciel.bmp
Image M
masque-desert.bmp
C
déterminer l’image I = D M
(M)
Dans le rapport, mettre les instructions Scilab et l’image I obtenue.
MAP110/120 - 2013-14
9
TP1-Image