Projet Matlab/Octave : segmentation d'un ballon de couleur dans une image couleur et insertion d'un logo



Documents pareils
Projet Matlab : un logiciel de cryptage

Traitement bas-niveau

Fête de la science Initiation au traitement des images

IMAGES NUMÉRIQUES MATRICIELLES EN SCILAB

Géométrie discrète Chapitre V

Traitement numérique de l'image. Raphaël Isdant

Projet de traitement d'image - SI 381 reconstitution 3D d'intérieur à partir de photographies

Introduction à MATLAB R

Choisir entre le détourage plume et le détourage par les couches.

Séance 0 : Linux + Octave : le compromis idéal

Utilisation du logiciel ImageJ gratuit

Création d'un site dynamique en PHP avec Dreamweaver et MySQL

Analyse de la vidéo. Chapitre La modélisation pour le suivi d objet. 10 mars Chapitre La modélisation d objet 1 / 57

Traitement d un AVI avec Iris

TP : Gestion d une image au format PGM

Leica Application Suite

TD : Codage des images

LibreOffice Calc : introduction aux tableaux croisés dynamiques

Guide pour la réalisation d'un document avec Open Office Writer 2.2

Utilisation de XnView

DOSSIER D'ACTIVITES SUR TUXPAINT Dessiner avec Tuxpaint. Objectifs :

Master IMA - UMPC Paris 6 RDMM - Année Fiche de TP

MATLAB : COMMANDES DE BASE. Note : lorsqu applicable, l équivalent en langage C est indiqué entre les délimiteurs /* */.

PHPWEBSITE -Tutoriel image

Excel 2010 Intermediaire

Création de maquette web

Vision industrielle et télédétection - Détection d ellipses. Guillaume Martinez 17 décembre 2007

Les probabilités. Chapitre 18. Tester ses connaissances

Opérations de base sur ImageJ

S.P.S.N. Lac du Der 2008

RapidMiner. Data Mining. 1 Introduction. 2 Prise en main. Master Maths Finances 2010/ Présentation. 1.2 Ressources

REALISER UN SITE INTERNET AVEC IZISPOT SOMMAIRE

Formats d images. 1 Introduction

A- Observez la vidéo A présentant le fonctionnement de deux objets techniques que nous

L analyse d images regroupe plusieurs disciplines que l on classe en deux catégories :

Créer le schéma relationnel d une base de données ACCESS

Tp_chemins..doc. Dans la barre "arche 2" couleur claire 1/5 21/01/13

Structure du format BMP, sa lecture, sa construction et son écriture

Gestion de projet. GanttProject Didacticiel V novembre Gérard Gervois Frédéric Giamarchi

Date : Tangram en carré page

1. Introduction Création d'une macro autonome Exécuter la macro pas à pas Modifier une macro... 5

Création d une SIGNATURE ANIMÉE avec PHOTOFILTRE 7

INSERER DES OBJETS - LE RUBAN INSERTION... 3 TABLEAUX

Découverte du logiciel ordinateur TI-n spire / TI-n spire CAS

VOS PREMIERS PAS AVEC TRACENPOCHE

Initiation à linfographie

PLAN. Qui peut faire quoi? Présentation. L'internaute Consulte le site public

Tutoriel : logiciel de présentation Openoffice Impress

Date M.P Libellé Catégorie S.Catégorie Crédit Débit Solde S.B

Conception d'applications de base de données ios plus rapides Guide Pratique FileMaker

TP : Shell Scripts. 1 Remarque générale. 2 Mise en jambe. 3 Avec des si. Systèmes et scripts

UEO11 COURS/TD 1. nombres entiers et réels codés en mémoire centrale. Caractères alphabétiques et caractères spéciaux.

Chap17 - CORRECTİON DES EXERCİCES

Parcours FOAD Formation EXCEL 2010

Cours de numérisation sur Epson Perfection

Créer un tableau avec LibreOffice / Calc

Livre Blanc WebSphere Transcoding Publisher

Ripper vos DVD (extraire vos fichier du DVD pour les mettre sur votre pc)

RÉSOLUTION DE SYSTÈMES À DEUX INCONNUES

Traitement de texte : Quelques rappels de quelques notions de base

Dragon Naturally Speaking 13

COURS WINDEV NUMERO 3

Utilisation du visualiseur Avermedia

Logiciel SCRATCH FICHE 02

Pour le désactiver, décochez "Site web du logiciel au démarrage" dans le menu "Fichier"

Didacticiel de mise à jour Web

Optimisation, traitement d image et éclipse de Soleil

Présentation du langage et premières fonctions

Transmission d informations sur le réseau électrique

modélisation solide et dessin technique

Dessiner dans Galaad FRANÇOIS PALLUT

Détection des points d intérêt et Segmentation des images RGB-D. Présentée par : Bilal Tawbe. Semaine de la recherche de l UQO

LE PROBLEME DU PLUS COURT CHEMIN

Théorie et Codage de l Information (IF01) exercices Paul Honeine Université de technologie de Troyes France

IUT BREST UN LOGICIEL SCADA : PC VUE 2010 DEP.GMP

Mode d'emploi du plugin Grayscale_Granulometry

Comment faire des étiquettes

Tutoriel : Feuille de style externe

Utilisation de l'outil «Open Office TEXTE»

Algorithmique avec Algobox

TP SIN Traitement d image

Automatisation d'une Facture 4. Liste Déroulante Remises Case à cocher Calculs

Algorithme. Table des matières

JPEG, PNG, PDF, CMJN, HTML, Préparez-vous à communiquer!

MEMENTO D'UTILISATION Du T.N.I. SmartBoard (Version )

Prise en main du logiciel. Smart BOARD Notebook 10

3.2. Matlab/Simulink Généralités

Sage 50 Version 2014 Guide d installation. Sage Suisse SA

Réussir et traiter ses photos sous UV avec Photoshop

Module ebay pour PrestaShop Guide du vendeur

Créer des étiquettes avec les adresses d'un tableau Calc

IMAGE BASED MODELING généralités et utilisation des outils de photomodélisation. 123D Catch de Autodesk.

Vers l'ordinateur quantique

Tune Sweeper Manuel de l'utilisateur

ESPACE MULTIMEDIA DU CANTON DE ROCHESERVIERE

F7n COUP DE BOURSE, NOMBRE DÉRIVÉ

Les images et les animations sur le web. Guérineau Chloé BTS2 Année 2001/2012

INFO 2 : Traitement des images

Transcription:

Projet Matlab/Octave : segmentation d'un ballon de couleur dans une image couleur et insertion d'un logo Dans ce projet, nous allons réaliser le code qui permet d'insérer sur une image, un logo sur un objet de couleur unie (ici, un ballon de basket orange). La figure ci-dessus représente l'application. L'algorithme peut se décomposer de la manière suivante : 1. dans un premier temps de segmenter les zones de l'image qui ont une couleur proche de celle du ballon (à partir d'un modèle statistique de celle-ci). Comme celui-ci est quasiment le seul objet de couleur orange dans la scène, cela reviendra à segmenter le ballon (donc à déterminer quels sont les pixels qui ont cette couleur orange dans l'image). 2. Puis approximer certaines des caractéristiques géométriques du ballon dans l'image : son centre de gravité (les positions (Xc,Yc) du centre du ballon dans l'image) et son rayon. 3. A partir du rayon de la balle, nous pouvons calculer une nouvelle image «logo» (à partir de l'image «logo» originale) à la dimension de la balle. 4. A partir des positions (Xc,Yc), nous pouvons alors insérer notre logo à la bonne dimension dans l'image originale. La page suivante représente la structure globale du projet. A noter qu'il faudra non seulement réaliser un script «principal.m» qui réalisera l'insertion du logo (partie droite du schéma) dans un fichier que l'utilisateur pourra sélectionner. Mais aussi un autre script «creation_modele.m» qui calculera le modèle statistique couleur du ballon (partie à gauche du schéma) à partir d'une image particulière où le ballon occupe quasiment toute l'image. 1/13

Fichier ballon00275.bmp lecture_image.m Fichiers ballonxxxxx.bmp lecture_image.m selection_image.m segmente_image.m calcul_modele.m Moyennes couleur et matrice de covariances geometrie_ballon.m script creation_modele.m Positions (Xc,Yc) + Rayon (R) dimensionne_logo.m insere_logo.m script principal.m 2/13

I. Notions Importantes 1- Codage des images sous matlab/octave Une image n est autre que l extension d un signal à 2 dimensions. Une image couleur est la superposition de 3 composantes de base (Rouge Vert et Bleu). Sous Matlab/octave, une telle image peut être codée par une matrice tridimensionnelle. Elle correspond à la mise en cascade des 3 matrices (2D : de dimension N*M) correspondant aux 3 composantes primaires (Rouge Vert et Bleu, notée RGB ou RVB). Chacune de ces 3 matrices primaires (aussi appelées «plans couleur») contient le niveau de couleur pour chaque point de l image considérée. En général chaque niveau de couleur est codé entre 0 (canal colorimétrique éteint) et 255 (canal colorimétrique maximum) ce qui correspond à 2553 = 16 581 375 combinaisons de couleurs possibles. Dans le cas particulier des images en noir et blanc, les 3 composantes de chaque point de l image considérée (pixel) sont égales. Nous avons donc 256 niveaux de gris (de 0 pour le noir à 255 pour le blanc, en passant par un gris moyen pour 128). Rq : Lorsque l on charge une image sous matlab/octave, la matrice correspondante est de type uint8 (codage sur 8 bits non signés, autrement dit : 0-255). Pour simplifier les calculs et pouvoir utiliser toutes les fonctions octave/matlab sur ces données, il est préférable de les convertir en réels (commande «double»), puis après traitement les reconvertir en entier codé sur 8 bits nonsigné (commande «uint8» ) avant de sauvegarder en format bmp ou d'afficher l'image (commande «imagesc»). 3/13

2- Segmentation couleur et Distance de Mahalanobis Cette partie concerne la segmentation couleur de l'image. Elle sera nécessaire pour coder le script «creation_modele.m» et la fonction «segmente_image.m». Pour segmenter la couleur du ballon dans l'image, il faut rechercher les pixels qui ont une distance proche d'un modèle de la couleur du ballon. On obtient alors une image de distance, chaque pixel de cette image représente la distance entre la couleur dans l'image originale et le modèle couleur du ballon. Dans le schéma ci-dessous, la partie sombre (proche de 0) représente alors les pixels de couleur proche de celle du ballon. Il suffit alors de seuiller cette image pour obtenir la segmentation du ballon ; le seuillage consistera à mettre à 1 tous les pixels (de l'image de distance) inférieurs à une valeur dite seuil, et à 0 tous les pixels supérieurs ou égaux à cette valeur. image originale image des distances image segmentée (le blanc représente les pixels à 1et le noir les pixels à 0) La distance que nous utiliserons est la distance de Mahalanobis qui se définit ainsi : avec : * x=[r, v, b]' un vecteur colonne représentant la couleur d'un pixel (en RGB ou RVB) dans l'image originale * μ=[μ r, μ v, μ b ]' un vecteur colonne des moyennes selon les plans R, V et B ; ces moyennes doivent être calculées sur un ensemble de pixels appartenant au ballon. * Σ la matrice de covariance calculée sur un ensemble de pixels appartenant au ballon. Si on considère un ensemble de pixels X={x 1, x 2,,x i,...,x n } appartenant au ballon (extrait d'une image «ballon00275.bmp») avec x i = [r i, v i, b i ]', les moyennes μ=[μ r, μ v, μ b ]' et la matrice de covariance Σ seront définies par : μ r = E( r i ) = moyenne i ( r i ) μ v = E( v i ) = moyenne i ( v i ) μ b = E( b i ) = moyenne i ( b i ) Σ = E( (x - µ)(x µ)' ) = [σ r 2, σ rv, σ rb ; σ vr, σ v 2, σ vb ; σ br, σ bv, σ b 2 ] avec σ rv = σ vr = 1/n * somme i ( (r i μ r )*( v i μ v ) ), σ rb = σ br =... A noter qu'il existe une fonction «cov» sous Matlab et Octave qui calcule cette matrice à partir d'un ensemble de vecteurs. 4/13

II. Travail à réaliser L'algorithme que vous allez réaliser permet donc d'insérer un logo sur une image d'un ballon orange situé à une position et une taille a priori non connues. Ces positions et taille seront déterminées à partir d'une segmentation de la couleur du ballon dans l'image. Nous vous fournisons une série d'images acquises (fichiers «ballonxxxxx.bmp» de dimensions 320x240x3) à l'aide d'un camescope numérique et une image (fichier «logo.bmp» de dimensions 600x600x3) représentant le logo à insérer. Afin de constituer cet algortihme, nous vous conseillons de procéder par étapes et toujours valider chacune des étapes en visualisant les images en sortie : écrire la fonction «lire_image.m» qui permet de sélectionner une image (parmi les fichier «ballonxxxxx.bmp») dans le répertoire courant et la lire. écrire les fonctions utiles au script «creation_modele.m», une après l'autre, et les tester à fur et à mesure en y faisant appel dans le script «creation_modele.m» écrire les fonctions utiles au script «principal.m», une après l'autre, et les tester à fut et à mesure en y faisant appel dans le script «principal.m» en affichant les résultats obtenus. Ces affichages pourront être mis en commentaires lorsque le script sera complet. avant d'utiliser une fonction Matlab/Octave que vous ne maîtrisez pas, lisez bien l'aide. Testez la sur des matrices ou vecteurs de petites tailles pour lesquels vous pourrez vérifier les résultats de la fonction. Il sera important de créer une interface utilisateur transparente (c'est à dire que des personnes ne connaissant pas Matlab/Octave puissent l'utiliser) en utilisant les fonctions d'entrées-sorties («input», «disp»,...). 1. La fonction «lire_image.m» Cette fonction n'aura pas d'entrée et doit renvoyer la matrice correspondant à l'image. Elle devra demander à l'utilisateur dans quel répertoire se trouvent les images que l'on veut traiter. Lister les images ('ballon*.bmp') contenues dans ce répertoire et afficher cette liste. Et demander à l'utilisateur laquelle il veut sélectionner. Puis lire le fichier et renvoyer la matrice correspondante. Les fonctions Matlab/Octave dont vous aurez besoin sont listées en annexes. 2. Le script «creation_modele.m» Le script «creation_modele.m» fera appel successivement à 3 fonctions différentes : une fonction «lire_image.m» qui permettra de sélectionner l'image dont on veut extraire le modèle de couleur (composé des moyennes et de la matrice de covariance) 5/13

une fonction «selection_image.m» qui, à partir de données (positions approximatives d'un carré inclu dans le ballon) fournies par l'utilisateur, fournie en sortie une matrice 3xN des pixels inclus dans ce carré (où N est le nombre de pixels contenus dans le carré ; chaque contenant la valeur du pixel selon un des plans couleur) une fonction «calcul_modele.m» qui, à partir de la matrice précédente, fournie le modèle de la couleur du ballon (moyennes et matrice de covariance). Le script devra sauvegarder le vecteur moyenne et la matrice de covariance dans un fichier «modele.mat». Rq : nous vous conseillons d'utiliser l'image «ballon00275.bmp» pour construire le modèle. Le ballon apparaît en grand dans cette image. Et plus il y a de pixels utilisés pour construire le modèle, meilleur sera le modèle. 3. Le script «principal.m» Le script «principal.m» fera appel à 5 fonctions différentes : une fonction «lire_image.m» qui permettra de sélectionner l'image oùl'on veut segmenter le ballon et y ajouter le logo. une fonction «segmente_image.m» qui utilise le modèle défini par le script «creation_modele.m» en le chargeant pour calculer l'image des distances de Mahalanobis. Qui affiche l'image de distances obtenue ainsi qu'un histogramme de l'ensemble des distances contenues dans l'image. Un histogramme consiste en une représentation de la distribution d'un ensemble de valeurs (ici, les distances de mahalanobis pour l'ensemble des pixels). Puis demande à l'utilisateur le seuil qu'il veut appliquer sur l'image des distances afin d'obtenir la segmentation. La segmentation obtenue sera affichée. Il serait utile de fair ene sorte que si l'utilisateur n'est pas satisfait du résultat obtenu (et donc de son choix de seuil) qu'il puisse recommencer ce choix, jusqu'à ce qu'il soit satisfait. Enfin, l'ensemble des fenêtres utilisées dans cette fonction doivent être fermées, avant de la quitter. La fonction renverra l'image segmentée. Une fonction «geometrie_ballon.m» qui va approximer et renvoyer les positions (Xc,Yc) en pixels du centre du ballon dans l'image (si la segmentation est approximativement correcte, on pourra supposer qu'il s'agit du centre de gravité de l'ensemble des pixels à 1 dans l'image segmentée) et le rayon en pixels (qui pourra être approximés à partir de l'aire du ballon = nombre de pixels à 1 dans l'image segmentée). Une fonction «dimensionne_logo.m» qui va lire l'image «logo.bmp». Puis va redimensionner celle-ci en la sous-échantillonnant. Il s'agira de constituer une image constituée de pixels sélectionnés à intervalles réguliers sur l'image du logo. La diagonale de l'image redimensionnée vaudra 2 fois le rayon approximé du ballon (de sorte que le logo soit entièrement inclu dans le ballon). Une fonction «insere_logo.m» qui va insérer l'image logo redimensionnée dans le ballon. Cela consistera à additionner la valeur des pixels de l'image logo avec celles des pixels de 6/13

Indications : l'image originale au niveau du ballon. Comme la valeur du fond (partie noire) du logo vaut [0 0 0], l'addition du fond sur l'image ne changera pas la couleur de l'image. Comme la valeur de la partie blanche vaut 255, tous les pixels de ces zones sera supérieurs à 255 (en réalisant la convertion de l'image de double en uint8, tous ces pixels prendront la valeur 255). Nous vous conseillons de créer une fonction «distmaha.m» qui calcule à partir du modèle et de l'image à traiter l'image des distances. Cette fonction sera appelée dans «segmente_image.m». Plutôt que d'utiliser des boucles for, essayez de réaliser les calculs sous forme matricielle. Parfois séparer les plans couleur en trois matrices différentes, sera une bonne approche pour y arriver. Pour une image de distances, vous devriez obtenir cette forme d'histogramme (nombre de pixels en fonction de la distance) : nombre de pixels seuil Partie de l'histogramme correspondant au ballon Partie de l'histogramme correspondant au reste de l'image distance Exemple de sous-échantillonage d'une matrice 5x5 de sorte à obtenir une matrice 3x3 : 1 2 3 4 5 6 7 8 9 10 1 3 5 11 12 13 14 15 11 13 15 16 17 18 19 20 21 23 25 21 22 23 24 25 7/13

II.Améliorations Dans cette partie, nous proposons différentes améliorations de l'algorithme. 1. Changer la couleur du Logo Dans la fonction insere_logo.m précédente, nous ne sommes capables que d'ajouter le logo en blanc. Pour changer la couleur du logo inséré, nous allons exploiter le fait que le logo original est blanc (donc une valeur à 255). A lieu d'additioner la couleur du logo à celle de l'image, nous allons la combiner de la manière suivante : Inew(x,y,c)=( 255 - L(x,y,c) )/255*Iorig(x,y,c)+L(x,y,c)/255*Couleur(c) Inew(x,y,c) représente la valeur du pixel en (x,y) et dans le plan couleur c de l'image finale dans la zone d'insertion du logo Iorig(x,y,c) représente la valeur du pixel en (x,y) et dans le plan couleur c de l'image originale (avant insertion) Couleur représente la couleur voulue par l'utilisateur pour le logo L(x,y,c) représente la valeur du pixel en (x,y) et dans le plan couleur c (0 ou 255) du logo original (après redimensionnement) Il sera important de créer une fonction choisir_couleur.m, qui permettra à l'utilisateur de donner les valeurs des composantes RGB de la couleur voulue, de visualiser cette couleur et éventuellement la changer si elle ne le satisfait pas (ceci est important car le choix d'une couleur dans l'espace RGB n'est pas intuitive) avant d'insérer le logo. 2. Réaliser plusieurs fois les mêmes opérations sur différentes images Modifiez le script principal.m ainsi que les fonctions que vous jugerez nécessaires afin que l'utilisateur puisse réaliser les mêmes opérations sur différentes images sans sortir du programme et sans à avoir à modifier les paramètres (choix du seuil, de la couleur,...) qu'il aura choisi à la première itération de l'algorithme (sur une première image). Autrement dit, l'utilisateur devra choisir les paramètres pour la première image. Ensuite ces paramètres devront être conservés pour toutes les autres images qu'il traitera ensuite (sans sortir du programme). Indication : il serait bon de gérer cela en proposant ces paramètres comme des variables optionnelles des fonctions (que vous devrez gérer dans les fonctions en testant les variables nargin et nargout des fonctions). Vous pouvez aussi faire en sorte que le programme principal.m vérifie de lui-même si le modèle couleur modele.mat existe ou non. Si ce n'est pas le cas, il devra faire appel au script creation_modele.m afin d'y remédier avant de traiter les images. 3. Filtrer l'image segmentée L'image segmentée peut présenter des défauts (fausses alarmes ou trous). Les fausses alarmes sont des pixels qui n'appartiennent pas au ballon, mais qui sont reconnus comme tels. Les trous sont des pixels du ballon qui ne sont pas reconnus comme tel. 8/13

Exemples de fausses alarmes Exemples de trous Si ces défauts sont trop nombreux, il risque d'influencer les méthodes d'approximations du centre et du rayon du ballon. L'insertion du logo ne sera plus valable (logo trop grand, trop petit, pas au centre du ballon,...). Une manière de limiter ces défauts est de filtrer les fausses alarmes et les trous. Des outils de traitement d'images (dits opérateurs de morphologie mathématique) existent ; l'ouverture (pour éliminer les fausses alarmes) et la fermeture (pour éliminer les trous). La fermeture est une succession d'une dilatation puis d'une érosion (on dilate l'image segmentée, puis on érode le dilaté). L'ouverture est une succession d'une érosion et d'une dilatation. Une dilatation consiste à mettre à 1 tous les pixels de l'image en sortie qui sont dans un voisinage d'un pixel à 1 de l'image binaire originale. Une érosion consiste mettre à 0 tous les pixels de l'image en sortie qui sont dans un voisinage d'un pixel à 0 de l'image binaire originale. Pour représenter un voisinage, nous pouvons utiliser une matrice composée qui de 1 ; on appelle ce voisinage élément structurant ou masque. Pour obtenir une dilatation ou une érosion, nous convoluons d'abord l'image binaire avec le masque. La convolution d'une image I avec un masque F s'écrira sous la forme : + + ( I F)( x, y) = IF( x, y) = I ( x n, y m). F( n, m) n= m= Dans cette formule, on considère des dimensions infinies. En pratique les images et les masques sont de dimensions finies. Cependant, la formule ci-dessus reste valide en considérant des zéros en dehors de leurs zones de définition. L'exemple ci-dessous montre le résultat d'une convolution d'une image binaire (composée de 0 et 1) avec un masque M de dimensions 3x3 (et composé de 1). 1 2 2 1 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 1 2 2 1 0 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 2 2 2 2 4 4 4 3 3 3 2 0 1 1 0 0 0 2 4 7 7 7 6 6 6 4 0 1 1 0 0 0 2 6 9 9 9 9 9 9 6 0 1 1 0 0 1 4 7 9 9 8 8 8 9 6 0 0 0 1 1 1 1 1 0 1 1 1 0 0 2 5 8 9 9 8 8 8 9 6 masque 0 0 3 6 9 9 9 8 8 8 9 6 0 0 3 6 9 9 9 9 9 9 9 6 0 0 2 4 6 6 6 6 6 6 6 6 image originale image convoluée avec le masque 9/13

En seuillant l'image convoluée avec le masque par le nombre de 1 dans le masque, nous obtenons l'érodé : 1 2 2 1 0 0 0 0 0 0 0 0 1 2 2 1 0 1 1 1 0 0 0 0 1 2 2 2 2 4 4 4 3 3 3 2 0 0 0 2 4 7 7 7 6 6 6 4 0 0 0 2 6 9 9 9 9 9 9 6 0 0 0 0 0 1 1 1 1 1 1 0 0 0 1 4 7 9 9 8 8 8 9 6 0 0 0 0 0 1 1 0 0 0 1 0 0 0 2 5 8 9 9 8 8 8 9 6 0 0 0 0 0 1 1 0 0 0 1 0 0 0 3 6 9 9 9 8 8 8 9 6 0 0 0 0 1 1 1 0 0 0 1 0 0 0 3 6 9 9 9 9 9 9 9 6 0 0 0 0 1 1 1 1 1 1 1 0 0 0 2 4 6 6 6 6 6 6 6 6 image convoluée image érodée En seuillant l'image convoluée avec le masque de sorte à conserver tous les éléments supérieurs à 0, nous obtenons le dilaté : 1 2 2 1 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0 0 0 1 2 2 1 0 1 1 1 0 0 0 0 1 1 1 1 0 1 1 1 0 0 0 0 1 2 2 2 2 4 4 4 3 3 3 2 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 2 4 7 7 7 6 6 6 4 0 0 0 2 6 9 9 9 9 9 9 6 0 0 1 4 7 9 9 8 8 8 9 6 0 0 1 1 1 1 1 1 1 1 1 1 0 0 2 5 8 9 9 8 8 8 9 6 0 0 1 1 1 1 1 1 1 1 1 1 0 0 3 6 9 9 9 8 8 8 9 6 0 0 1 1 1 1 1 1 1 1 1 1 0 0 3 6 9 9 9 9 9 9 9 6 0 0 1 1 1 1 1 1 1 1 1 1 0 0 2 4 6 6 6 6 6 6 6 6 0 0 1 1 1 1 1 1 1 1 1 1 image convoluée image dilatée En dilatant l'érodé, on obtient une ouverture de l'image originale, où les fausses alarmes ont disparues : 0 0 0 0 0 1 1 1 1 1 1 0 0 0 0 0 0 1 1 0 0 0 1 0 0 0 0 0 0 1 1 0 0 0 1 0 0 0 0 0 1 1 1 0 0 0 1 0 0 0 0 0 1 1 1 1 1 1 1 0 0 0 0 0 1 1 1 1 1 1 1 1 0 0 0 0 1 1 1 1 1 1 1 1 0 0 0 0 1 1 1 1 1 1 1 1 0 0 0 1 1 1 1 1 0 1 1 1 10/13

image érodée image ouverte En érodant le dilaté, on obtient une fermeture de l'image originale, où les trous ont disparus : 1 1 1 1 0 0 0 0 0 0 0 0 1 1 1 1 0 1 1 1 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 0 0 1 1 1 1 1 1 1 1 1 1 0 0 1 1 1 1 1 1 1 1 1 1 0 0 1 1 1 1 1 1 1 1 1 1 0 0 1 1 1 1 1 1 1 1 1 1 0 0 1 1 1 1 1 1 1 1 1 1 image dilatée 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 0 0 0 0 1 1 1 1 1 1 1 1 0 0 0 0 1 1 1 1 1 1 1 1 image fermée Réalisez des fonctions dilatation.m, erosion.m, ouverture.m et fermeture.m de sorte à pouvoir les utiliser dans la fonction segmente_image.m. Dans la fonction segmente_image.m, vos ferez donc appel à une ouverture (pour éliminer les fausses alarmes) suivie d'une fermeture (pour éliminer les trous). Vous devrez créer une interface utilisateur afin qu'il puisse choisir la taille du masque à appliquer de manière interactive (vous devrez afficher le résultat obtenu pour la taille choisie, et proposer à l'utilisateur de la changer si le résultat ne lui convient pas). Si le résultat lui convient, il conviendra avant de sortir de la fonction segmente_image.m de fermer les fenêtres utilisées). 4. Créer du flou sur l'image du Logo Lorsqu'on zoome sur l'image obtenue après insertion du logo, on remarque que la méthode de souséchantillonage du logo de la fonction dimensionne_logo.m ne donne pas un résultat très satisfaisant dans des images où le ballon est petit ; le rendu final n'est pas correct (trop abrupte et pas naturel). Afin de rendre ce rendu plus naturel, il conviendrait de rendre flou l'image du logo à insérer. Une manière de faire est rendre floue l'image du logo en la convoluant avec un masque composée de 1 puis en normalisant le résultat de la convolution (diviser par le nombre de 1 dans le masque) avant de faire l'insertion. Cela correspondrait à réaliser un filtre moyenneur localement. Réaliser une fonction floue_image qui sera appelée dans dimensionne_logo.m. La taille du masque pourra être automatisée en la fixant à la distance entre 2 échantillons. 11/13

III. Annexes 1. Quelques fonctions utiles de Matlab/Octave Dans cette annexe, nous présentons une liste de fonctions Matlab qui pourraient vous être éventuellement utiles (en plus, de celles que vous connaissez déjà) dans ce projet. N hésitez pas à lire l aide Matlab/Octave (à l aide de la commande «help») pour comprendre comment elles fonctionnent et les utiliser. imread : permet de charger une image imwrite : permet de sauvegarder une image imagesc ou image : affiche une image. colormap : attribut aux différents pixels de l image la couleur correspondante. Pour afficher une image en niveau de gris (noir et blanc), il faut écrire colormap('gray') reshape : permet de réorganiser les lignes et colonnes d une matrice (changement de taille) repmat : permet d'à partir d'une matrice A (ou d'un vecteur V) de construire une matrice plus grande qui sera la répétition de A (ou de V). load : permet de lire un fichier de données Matlab/Octave save : permet de sauvegarder un fichier de données Matlab/Octave hist : permet de créer un histogramme à partir d'un vecteur de données double : convertit une matrice en matrice de double uint8 : convertit une matrice en matrice d'entier non signé codé sur 8bits ([0-255]) conv2 : réalise la convolution 2D des deux matrices entre elles 12/13

2. Notion d'histogramme Exemple (source wikipédia) : Soit la fabrication de rations alimentaires, la pesée des rations avant emballage donne la série de mesures suivantes en kg : 0,547 0,563 0,532 0,521 0,514 0,547 0,578 0,532 0,552 0,526 0,534 0,560 0,502 0,503 0,516 0,565 0,532 0,574 0,521 0,523 0,542 0,539 0,543 0,548 0,565 0,569 0,574 0,596 0,547 0,578 0,532 0,552 0,554 0,596 0,529 0,555 0,559 0,503 0,499 0,526 0,551 0,589 0,588 0,568 0,564 0,568 0,556 0,523 0,526 0,579 0,551 0,584 0,551 0,512 0,536 0,567 0,512 0,553 0,534 0,559 0,498 0,567 0,589 0,579 Les caractéristiques du relevé sont les suivantes : Le nombre d'échantillons : N=64 Valeur minimale : 0,498 kg Valeur maximale : 0,596 kg On peut en dessiner l'histogramme en prenant ces caractéristiques : Le nombre de classes est de 7 L'amplitude de classe est 0,098/7 = 0,014 kg que l'on arrondit à 0,015 kg (résolution de la balance : 0,001 kg) La valeur minimale de la première classe est de 0,498 (0,001/2) = 0,4975. Par souci de facilité pour l'interprétation, on peut arrondir cette valeur à 0,495 kg. On obtient l'histogramme suivant : 13/13