Professional Documents
Culture Documents
2009 - 2010
1 2
4 5
2.1
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
5 5 5 5 5 6
7
Les bibliothques de trac d'lments 2D . . . . . . . . . . . . . . . Les bibliothques d'interface utilisateur . . . . . . . . . . . . . . . . Les bibliothques 3D . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2.2 2.3
3
Choix d'une bibliothque de trac d'lments 2D . . . . . . . . . . . . . . . Choix d'une bibliothque d'interface utilisateur
3.1 3.2
4
OpenCV . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . GTK . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
7 7
9
4.1 4.2
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
9 9 9 9 10
11
Algorithmes
5.1
Transformations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.1.1 5.1.2 Rotations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Redimensionnement . . . . . . . . . . . . . . . . . . . . . . . . . . . Filtre personnalis (LUT) Luminosit/Contraste Inversion des couleurs Flou/Nettet . . . . . . . . . . . . . . . . . . . . . . .
11 11 11 13 13 14 15 15 17 17
19
5.2
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Organisation du travail
Chronologie
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
19 20 20
21
Conclusion
Chapitre 1 Introduction
Intitul du projet
Le but du projet est de raliser une petite interface en Gtk permettant d'acher une image et d'y appliquer un certain nombre de ltres (lissage, rhaussement de contraste,...). Le chargement de l'image et les ltres seront raliss avec OpenCV. On tudiera galement la possibilit de raliser ses traitements en temps rel sur des images issues de Web Cam.
Introduction
L'informatique permet d'automatiser des tches, c'est mme sa fonction principale. Cela permet de traiter un nombre d'informations immensement plus consquent que ne pourrait jamais le raliser un homme. Le traitement des images s'est donc trouv jamais modi avec l'arrive des premiers ordinateurs performants. Il est dsormais possible de traiter autorisant un panel de transformation quasi-inni ! La cration de logiciels de traitement d'image est aujourd'hui particulirement ais grce aux bibliothques graphiques.
chaque
pixel de l'image,
Infos pratiques
Site web sur lequel on peut tlcharger le logiciel et consulter les sources :
//www.ecole.ensicaen.fr/~chabot/projetOpenCV/
Bibliographie et crdits photographiques en n de rapport.
http:
2.1 Dnition
Les biliothques graphiques sont l'ensemble des fonctions permettant d'acher des lments graphiques, l'inverse des fonctions consoles. L'immense majorit des utilisateurs de l'informatique ne touchant jamais un terminal, on peut se douter de la trs grande importance de ces bibliothques. Rare sont les systmes d'exploitation qui ne sont pas fournis avec une bibliothque graphique intgre (au niveau application ou mme au niveau noyau). Devant la diversit de ces bibliothques, il faut marquer 3 catgories :
standard
trs
aise. Exemples : Motif, Qt, GTK (qui se base sur Cairo), GNOME, Win32 (intgre au
fonctionnel que sur Mac OS X. De mme, GDI est un sous-systme de Microsoft Windows.
CHAPITRE 2.
BIBLIOTHQUE GRAPHIQUE
Cairo est une bibliothque logicielle graphique libre et multi-plateformes qui dnit une
API de rendu vectoriel 2D indpendante du matriel. Elle est cependant essentiellement utilise pour la ralisation de dessin ou d'image vectoriels.
OpenCV propose ces oprations en traitement bas niveau des images : lecture et a-
chage d'une image ou d'une vido (chier ou camra), criture sur le disque. Elle utilise le C et elle est libre. Enn, c'est aussi pour ses grandes capacits dans le traitement des pixels que nous avons t amens l'utiliser.
graphique KDE, l'un des environnements de bureau les plus utiliss sur Linux. C'est une bibliothque dont le langage de programmation est le C++ donc inadapte pour notre projet de premire anne.
GTK+ est crit en langage C mais peut s'orienter vers la programmation oriente objet.
GTK+ est l'interface de dirents environnements de bureau comme GNOME, Xfce ou encore ROX ce qui permet une intgration parfaite. Cest une bibliothque libre et multi-plateformes. C'est donc la bibliothque que nous avons choisi pour le projet.
3.1 OpenCV
OpenCV (Open Computer Vision) est une bibliothque graphique libre. Elle est conue pour le traitement d'image en temps rel. Ociellement lanc en 1999, le projet OpenCV est dvelopp initialement par Intel pour optimiser les applications gourmandes en temps processeur. Cela faisait partie d'une srie de projets tel que l'achage d'un mur en 3 dimensions. Les principaux acteurs du projet sont l'quipe de dveloppement de bibliothque de chez Intel ainsi qu'un certain nombre d'experts dans l'optimisation de chez Intel Russie. Les objectifs de base du projet taient : Faire des recherches sur la vision par ordinateur en vue de fournir un logiciel libre et optimis. tablir une infrastructure commune s'appuyant sur les dveloppeurs pour obtenir un code plus lisible et transfrable. Continuer dvelopper en rendant le code portable et permettre des performances optimises gratuites avec une licence qui est libre de toutes contraintes commerciales. La premire version alpha d'OpenCV fut prsente lors de la confrence IEEE sur la vision par ordinateur et la reconnaissance de formes en 2000. Aprs cela, cinq versions bta ont t publies entre 2001 et 2005 et la premire version 1.0 a t publie en 2006. Au milieu de l'anne 2008, OpenCV obtient l'appui de la socit de robotique Willow Garage et la bibliothque est encore dveloppe ce jour. Une version 1.1 est sorti en octobre 2008 et un livre crit par deux auteurs d'OpenCV et publi par O'Reilly Media est sorti sur le march ce mme mois. La deuxime version majeure d'OpenCV ne en octobre 2009. Il s'agit d'OpenCV 2 incluant des changements majeurs au niveau du langage C++ servant facilit le dveloppement de nouvelles fonctions et amliorant les performances.
3.2 GTK
GTK a t conue et utilise pour le logiciel GNU Image Manipulation Program (GIMP) en remplacement de la bibliothque Motif. Peter Mattis, pour amliorer le systme d'interface graphique de GIMP, a commen ds 1996 crire sa propre bibliothque GUI appele la bibliothque graphique de GIMP et a russi remplacer Motif par ce qui allait devenir GTK pour la version 0.60 de GIMP. Elle a atteint sa premire version stable en avril 98. GTK + 1.0 contient alors les composants d'interfaces qui sont ncessaires pour soutenir GIMP. La prochaine version 1.2 (Fvrier 99) contient, quant elle, de nombreux nouveaux gadgets qui ont fait de GTK + une bibliothque adapte pour le dveloppement
CHAPITRE 3.
4.2 Fonctionnalits
4.2.1 Gestion des images
Ouverture Enregistrement Formats supports : jpg et png Historique et fonctions annuler/refaire Zooms d'achages divers
4.2.2 Transformations
Rotations Redimensionnement
CHAPITRE 4.
10
Chapitre 5 Algorithmes
5.1 Transformations
5.1.1 Rotations
IplImage* rotationHoraire(IplImage* img) ; IplImage* rotationAntihoraire(IplImage* img) ; IplImage* rotation180(IplImage* img) ; Fonctions situes dans src/openCv.c (header : include/openCv.h)
Ces fonctions sont trs simples : il s'agit uniquement d'une recopie pixel par pixel de l'image de base en modiant la position dans l'image. Exemple pour la rotation de +90 deg. :
5.1.2 Redimensionnement
Fonctions
redimension(IplImage* img, int nLargeur, int nHauteur) ; redimensionRapide(IplImage* img, int nLargeur, int nHauteur) ; zoomPlus(IplImage* img, int valeur) ; zoomMoins(IplImage* img, int valeur) ; situes dans src/openCv.c (header : include/openCv.h)
11
CHAPITRE 5.
ALGORITHMES
12
Redimensionnement avanc
Figure Re1
1. On repre la partie de l'image d'origine qui correspondera au nouveau pixel d'image destination. Sur le schma Re1, on veut calculer le pixel (2,1) de l'image 3x3 (destination). Elle recouvera entirement le pixel (4,2) et partiellement les pixels (3,1), (3,2), (3,3), (4,1) et (4,3) d'image 5x5 (source). 2. On rcupre les couleurs de chacune de ces cases. On garde galement l'information de la surface que chacun des pixels occupait dans le nouveau pixel. 3. On additionne les direntes couleurs pondres par leur surface... 4. ...puis on divise par la surface totale de la nouvelle case. C'est dire 1 si on a pris le 2 pixel destination en rfrence, (5/3) si on a plutt pris le pixel source (de l'image 5x5). En un mot, on fait la moyenne pondre par les surfaces. 5. La couleur ainsi calcule est la celle du pixel voulu, le (2,1) de l'image 3x3 (destination) ! Complexit en O(nL*nH*(aL/nL)*(aH/nH)) si aL > nL et aH > nH O(nL*nH) si aL < nL et aH < nH O nL, nH, aL et aH sont respectivement les nouvelles largeurs et hauteurs et les anciennes largeurs et hauteurs.
Redimensionnement Rapide
Nous avons implment un autre algorithme de redimensionnement car l'algorithme prcdement dcrit peut tre long l'excution. Or, pour un zoom par exemple, il n'est pas ncessaire d'avoir une opration optimale. Cette algorithme permet un redimensionnement en O(nbre de pixels) pour une qualit trs convenable.
CHAPITRE 5.
ALGORITHMES
13
Figure Re2
Le principe est de choisir 1 pixel parmi l'image d'origine pour tre le nouveau pixel dans l'image destination. Ici, on choisit de prendre celui qui est tout en haut gauche du nouveau pixel. Ce n'est pas la seule solution mais elle permet un code trs simple. En eet, ce pixel est trs facilement calculable : (x(ancienne_largeur/nouvelle_largeur),
y(ancienne_hauteur/nouvelle_hauteur)).
Complexit en O(nbre de pixels).
Ces fonctions sont des cas particuliers du redimensionnement rapide : elle ne s'appliquent qu'au redimensionnement vers une image de taille proportionnelle. Elles permettent d'allger (un peu) les calculs ainsi que le code. Ces fonctions ne sont pas rvolutionnaires et loin d'tre indispensables.
Les LUT (Look-Up Table) sont tout simplement l'application chaque pixel de l'image d'une fonction de [0, 255] dans [0, 255] pour chaque composante couleur (qui est un nombre entre 0 et 255).
CHAPITRE 5.
ALGORITHMES
14
Figures Lut1
La mthode est donc naturellement de parcourir un un les pixels de l'image et de leur appliquer la fonction. Les fonctions sont reprsentes sous forme de tableau de taille 255. Si le mode de LUT spar par composante est slctionn, on applique une fonction dirente chaque composante Rouge-Vert-Bleu. Dans le cas d'un LUT principal, on applique le mme ltre aux trois couleurs. Complexit en O(nbre de pixels).
5.2.2 Luminosit/Contraste
Fonction situe dans
IplImage* luminositeEtContraste(IplImage *img, int luminosite, int contraste) ; src/openCv.c (header : include/openCv.h)
Le ltre de luminosite/contraste est simplement l'application d'un LUT particulier. La fonction [0, 255] applique l'ensemble des composantes de couleur est une fonction ane dont le contraste dtermine la pente et la luminosit dtermine l'ordonne l'origine.
Figures Lc1
CHAPITRE 5.
ALGORITHMES
15
a = 127/(128contraste) dans le cas d'une augmentation de contraste (contraste => 1) a = (128+contraste)/127 dans le cas d'une diminution du contraste (contraste < 1) b = 2luminosite+128a128 : on s'arrange pour que f (128) = 128+luminosit.
y = f (x) = 255 x.
Figures In1
5.2.4 Flou/Nettet
IplImage* lissage(IplImage* img, int lRect, TypeLissage type) ; IplImage* nettete(IplImage* img, int lRect, TypeLissage type) ; Fonctions situes dans src/openCv.c (header : include/openCv.h)
Lissage (diminution de la nettet)
Cette fonction se base sur l'tude du voisinage. Pour chacun des pixels visits, on considre le carr de largeur lRect centr sur le pixel. Lisser, c'est homogniser le pixel avec son voisinage. A partir du carr ainsi dcoup, on va donc calculer une nouvelle valeur pour le pixel, qui sera soit la moyenne, soit la mdiane des valeurs du voisinage. Rq : le pixel en question fait partie du voisinage.
CHAPITRE 5.
ALGORITHMES
16
lRect).
Augmentation de la nettet
L'augmentation de la nettet, c'est l'inverse du lissage Cette phrase qui parat nave au premier abord est en fait parfaitement exacte et rsume entirement la mthode utilise ! Ainsi, la fonction de nettet marche en 2 tapes : 1. On calcule l'image oute en appellant la fonction
lissage...
2. ...on inverse la transformation : les modications survenues lors du lissage sont inverses. Par exemple, si le lissage a d'un entier N.
augment la composante de rouge d'un entier N, pour l'augmentation de la nettet, on diminuera cette mme composante de rouge
lRect).
CHAPITRE 5.
ALGORITHMES
17
Cette fonction renvoie une nouvelle image de taille 255x255 qui est la reprsentation de l'histogramme. Un histogramme est un graphique achant, en abscisse, les valeurs (intensit globale ou composante couleur) possibles (0 255) et en ordonne le nombre de pixels qui ont cette valeur. On reprsente l'histogramme dans un tableau de 255 entiers. Son calcul se rsume donc en 2 tapes : 1. Un parcours de l'image durant lequel, pour chaque pixel, on incrmente la cellule du tableau correspondant la valeur du pixel. On garde en mmoire le nombre maximum de pixels associs une valeur. 2. On utilise ce nombre pour talonner notre reprsentation de l'histogramme : les valeurs de l'ordonne vont de 0 ce nombre. Pour chaque valeur possible, on dessine une ligne plus ou moins haute.
de l'image sur tout le spectre disponible (0 255). Elle procde donc en 2 tapes : 1. Un parcours de l'image durant lequel on cherche les extremums des valeurs des pixels (si l'image est dj tire, ces valeurs seront le blanc et le noir). 2. On parcourt nouveau l'image. Cette fois, on rpartit proportionnellement les valeurs de chaque pixel entre les deux nouvelles valeurs extremums o ont t pousss les pixels les plus clairs et les plus foncs : le blanc et le noir.
CHAPITRE 5.
ALGORITHMES
18
Figures Eh1
Complexit en O(nbre_de_pixels).
6.1 Chronologie
2 mars Installation et familiarisation OpenCv et GTK. Tests et premires fonctions. 24 mars Premier rendez-vous. On nous aiguille sur Glade pour la gnration de l'inter-
face GTK.
30 mars - Version 0.1 Utilisant Glade et un drawingArea.
drawingArea.
Nous
dcidons de repartir de zro en codant directement le code GTK. Nous achons l'image en tant que premire version et
tout Gtk
lissage.
tirement d'histogramme
inverser,
nuler
et
refaire.
an-
bouton survol.
24 mai - Version 0.5 Ajout des fonctions de 24 mai - Version 0.6 Ajout de la fonction
avec fentre
de dialogue.
26 mai - Version 0.7 Ajout de la fonction de
Enregistrement d'image partir d'une fentre de dialogue. Des icones sur certains boutons.
29 mai - Version 0.8 Achage de l'histogramme. 30 mai - Version 0.9 Zoom sur l'image pour des zoom de 1/16, 1/8, 1/4, 1/2, 1, 2, 4, 8,
16 fois. Deux nouvelles sortes de fonctions de redimensionnement ont t ajoutes. Demande de conrmation quand les modications n'ont pas t enregistres.
30 mai - Version 0.10 Fonction d'enregistrement sans avoir choisir nouveau le che-
LUT, appliques au canal principal ou chaque composante sparment, appliques en modiant une courbe graphique. Ajout de la fonction Luminosit/Contraste se basant sur les LUT. Tous les boutons sont des icones.
des fonctions de
31 mai - Version 1.0 Possibilit d'appliquer un zoom personnalis. Amlioration du
menu.
19
CHAPITRE 6.
20
6.3 Problmes/Solutions
Problme 1 : Faire le lien entre GTK et les images utilises par OpenCv.
drawingArea,
widget GTK
dont on peut modier un un les pixels. Nous avions russi dessiner l'image mais il y avait des problmes de rafraichissement, nottamement lors d'un redimensionnement de la fentre. De plus, se basant sur Glade, nous utilisions des widgets de GTK que nous ne comprenions pas parfaitement.
Solution : Aprs un mois au point mort, s'embourber dans des codes modis mille
fois et dont ne connaissions pas la porte exacte, nous avons opt pour une
totale
refonte
du code.
Nous sommes partis sur des bases plus saines, en se demandant pourquoi ne pas utiliser tout simplement le widget type
GtkImage.
simples (simple remaniement des donnes) qui convertissent les images OpenCv (de
IplImage)
vers les
GtkImage.
dimensionnement d'image, nous avons essay d'optimiser en rapidit les algorithmes. Cependant, mme avec une complexit plafond en 0(nouveau nbre de pixels), nous avions de forts ralentissements avec les grandes images. Une solution qui
pourrait
directement
dans GTK, plutt que de passer par OpenCv. Nous conomisons ainsi
la conversion de format.
Chapitre 7 Conclusion
Enrichissement personnel
Ce projet a t un rel enrichissement personnel : vivant depuis des annes dans un monde d'interfaces graphiques, nous n'avions jamais eu l'opportunit d'en crer nousmme.
Apprentissage
Plus que de nous initier deux bibliothques (aussi rpendues soit-elles), il nous a familiaris la philosophie des bibliothques logicielles, notamment graphiques.
Perspectives
Nous avons d, par manque de temps, arrter le dveloppement du logiciel alors que certaines des fonctionnalits que nous avions en tte n'avait pas t ralise. Il est frustrant de savoir qu'il deviendra obsolte avant d'avoir atteint une relle maturit. Mais de toute faon, de nombreux logiciels de traitement d'images existent dj, forcment beaucoup plus complet, gratuit pour certains (Gimp en premier). Cependant notre logiciel pourra nous servir de support trs facilement modiable si, pour notre travail personnel, nous voulons implmenter un ltre particulier.
21
Bibliographie
Arnaud NoHaR.
siteduzero.com/tutoriel-3-8631-vision-par-ordinateur.html
[2] Opencv v2.1 documentation ocielle.
http://www.
documentation/c/index.html
[3] Cours GTK+. Site GtkFr. [4] GTK+ Reference Manual. [5] Historique de gtk
http://opencv.willowgarage.com/
http://www.gtk-fr.org/wakka.php?wiki=PageAccueil http://library.gnome.org/devel/gtk/stable/
http://people.redhat.com/mclasen/Usenix04/notes/x29.html http://en.wikipedia.org/wiki/OpenCV
Crdits photographiques
1. Photo nettet :
http://www.paris-beyrouth.org/tutoriaux-spip/article/renforcer-la-ne
22