• Aucun résultat trouvé

Laboratoire 1 Reconstruction d’une image par la description de ses formes à l’aide du code de Freeman

N/A
N/A
Protected

Academic year: 2022

Partager "Laboratoire 1 Reconstruction d’une image par la description de ses formes à l’aide du code de Freeman"

Copied!
12
0
0

Texte intégral

(1)

École de technologie supérieure Génie de la production automatisée

GPA665

Structures de données et algorithmes

Laboratoire 1

Reconstruction d’une image par la description de ses formes à l’aide du code de Freeman

Responsable du cours : Mohamed Cheriet, ing., Ph. D.

Rédaction du laboratoire : Jean-Christophe Demers Révision et barème de correction : Yan Levasseur & Mathieu Binette Temps alloué pour ce laboratoire : 4 périodes de laboratoire

Résumé

La perception humaine utilise des informations visuelles comme la couleur, les contours et les formes des objets qui lui sont représentés. La reconnaissance de forme et l’inspection automatisée par vision utilisent les mêmes informations pour faire l’analyse de scènes visuelles. De nos jours, des descripteurs appropriés sont utilisés pour faciliter l’acquisition et les calculs relatifs aux données provenant d’images numériques.

Ce laboratoire est une introduction au descripteur de contour appelé code de Freeman. Il vous est demandé de recréer une image contenant des formes et d’en calculer les propriétés selon un fichier d’entrée contenant le code de Freeman pour un ou plusieurs contours d’objets.

Les notions pratiquées dans ce laboratoire sont la gestion dynamique de la mémoire (tableaux dynamiques 1D et 2D), la lecture et écriture de fichiers textes, les fonctions avec passage de paramètres par référence, les fonctions récursives. Finalement, vous devrez

(2)

Problème

Dans le domaine de la vision artificielle, il existe un nombre considérable d’algorithmes qui permettent d’extraire les principaux constituants d’une image. Par exemple, le contour d’une forme présente sur l’image est un descripteur de forme puissant et facile à obtenir.

En connaissant les éléments du contour d’une forme, il est possible de trouver plusieurs informations très utiles telles que l’aire, le périmètre, le centroïde, certains moments d’inertie, les axes principaux et bien d’autre chose. Il existe un algorithme simple et efficace qui permet de décrire le contour d’une forme basé sur la définition du code de Freeman.

Pour ce laboratoire vous devez, à partir d’une description à l’aide du code de Freeman, reconstruire l’image originale. Vous aurez donc à l’entrée du processus, un fichier texte contenant la description de toutes les formes qui sont comprises dans l’image initiale.

Après avoir lu ce fichier, vous devrez générer un fichier texte contenant l’image représentant les formes décrites dans le fichier d’entrée. De plus, vous aurez à remplir l’intérieur des formes décrites par les contours ainsi que calculer l’aire et le périmètre de chacune de ces dernières.

Informations supplémentaires

Définition du référentiel de l’image

Habituellement, le référentiel image utilisé en informatique est le suivant.

Image y

x (0, 0)

C’est donc le standard que nous utiliserons.

(3)

Définition du code de Freeman

Le code de Freeman est une technique très utile pour représenter le contour d’un objet sur l’image. Elle consiste à décrire le contour d’une forme en indiquant les pixels voisins immédiats par l’une des 8 directions possibles. Les 8 directions indiquent les 8 voisins immédiats possibles du pixel analysé.

0

1

2 3

4 7 5

6

Ainsi l’image illustrée ci-haut à droite possèdera le code de Freeman suivant, le point d’origine étant celui identifié par un X se trouvant en (4, 1) :

(4, 1) : 1-2-1-1-2-3-4-5-5-3-4-4-6-6-7-7-7-0

De plus, le code de Freeman décrit toujours une forme dans le sens anti-horaire et commence par le pixel les plus en haut à gauche de cette dernière.

Définition du périmètre et de l’aire

Le périmètre

Le périmètre se calcul directement par le code de Freeman. Il suffit de parcourir les éléments du code de Freeman et d’ajouter 1 pour les directions orthogonales (0, 2, 4 et 6) et 2 pour les directions diagonales (1, 3, 5 et 7).

Par exemple, le code de Freeman vue précédemment (1-2-1-1-2-3-4-5-5-3-4-4-6-6-7-7-7- 0) vaut : 8  1 + 10  2  22.14

L’aire

L’aire se calcule simplement en additionnant 1 pour tous les éléments du contour et tous les pixels compris à l’intérieur de la forme. C’est donc lors du remplissage de la forme que vous calculerez l’aire de la partie interne de la forme.

Encore une fois, en prenant l’exemple précédent nous aurons une aire de 35.

(4)

Standard adopté pour le fichier d’entrée

Le fichier d’entrée est un fichier texte dans lequel nous retrouvons toutes les informations utiles pour reconstruire chacune des formes comprises dans l’image. Sur la première ligne du fichier se trouve la dimension même de l’image (X  Y – où les deux dimensions sont séparées par un espace), se trouve sur la ligne suivante le nombre de formes (N formes) et ensuite se trouvent N lignes sur lesquelles se trouvent les 3 informations suivantes (séparées par des espaces) :

Les coordonnées du premier point x et y

Le nombre d’éléments pour le code de Freeman (M)

Les M éléments du code de Freeman

Voici un exemple d’image avec le code de Freeman des formes incluses et du fichier associé.

Image

Informations sur l’image Dimension de l’image : 21  21 3 formes

Information sur la première forme - Coordonnées de départ : (3, 2)

- Nombre d’éléments constituant le code de Freeman : 21 - Code de Freeman : 1-2-1-2-4-3-4-5-5-4-3-4-5-6-7-0-0-0-7-0-0

Information sur la deuxième forme - Coordonnées de départ : (17, 3)

- Nombre d’éléments constituant le code de Freeman : 16 - Code de Freeman : 1-1-2-2-1-2-3-4-5-5-5-7-6-5-7-0

(5)

Information sur la troisième forme - Coordonnées de départ : (6, 10)

- Nombre d’éléments constituant le code de Freeman : 28

- Code Freeman : 1-1-1-2-1-2-2-1-2-4-4-4-5-5-3-3-4-4-4-6-7-6-6-7-6-7-7-7

Fichier d’entrée

21 21 3

3 2 21 1 2 1 2 4 3 4 5 5 4 3 4 5 6 7 0 0 0 7 0 0 17 3 16 1 1 2 2 1 2 3 4 5 5 5 7 6 5 7 0

6 10 28 1 1 1 2 1 2 2 1 2 4 4 4 5 5 3 3 4 4 4 6 7 6 6 7 6 7 7 7

Standard adopté pour le fichier de sortie

Le fichier de sortie doit respecter le standard suivant :

Le nom du fichier d’entrée

Une ligne vide

L’image résultante (dessiner par des espaces (pour les blancs) et des astérisques (pour les noirs) en plus d’être encadrée par des %)

Une ligne vide

Le nombre d’objet dans l’image (exemple : Il y a 3 objets dans l’image)

Le périmètre et l’aire pour chacun des objets, distribué sur N lignes.

(6)

L’exemple suivant est le fichier de sortie qui devrait être généré avec le fichier d’entrée montré en exemple précédent.

FileIn.txt

%%%%%%%%%%%%%%%%%%%%%%%

% %

% %

% *** %

% ******** ** %

% ********* **** %

% ********** **** %

% ***** ** **** %

% ** ***** %

% ***** %

% **** %

% * ** %

% *** %

% ***** %

% ******* %

% ******* %

% ********* %

% ********* %

% ********* %

% ***** ***** %

% **** **** %

% %

% %

%%%%%%%%%%%%%%%%%%%%%%%

Il y a 3 objets dans l’image

Objet no. 1 : Perimetre = 24.73 Aire = 39 Objet no. 2 : Perimetre = 20.14 Aire = 30 Objet no. 3 : Perimetre = 33.80 Aire = 68

Contraintes d’implantation

1. Vous devez utiliser le logiciel Visual C++ pour réaliser votre programme. Vous devez réaliser votre logiciel en mode console (mode texte). Il est possible de programmer en en C ou en C++, pour ceux qui connaissent déjà ce langage.

2. Lorsque votre programme est lancé, ce dernier demande à l’usager quel fichier traiter en entrée. Il effectue automatiquement le traitement et crée le fichier de sortie avec le même nom mais avec l’extension SDA. Après la création du fichier de sortie, votre programme demande à l’usager s’il désire poursuivre avec un autre fichier ou quitter le programme.

(7)

3. La taille de l’image de sortie est dynamique et définie par les premières lignes de votre fichier d’entrée.

4. Vous devrez implanter une structure de données qui vous est imposée.

Lors de la lecture du fichier d’entrée, vous devez construire la structure de données *Shapes (ci-bas) qui est basée sur un tableau de structures contenant chacun un tableau, le tout étant de taille variable.

Vous devez donc créer dynamiquement ces tableaux de données.

Pour commencer, vous avez une structure (nommé SShape) possédant trois entiers et un pointeur de « unsigned char ». Vous devez créer un tableau de SShape d’une taille égale au nombre de formes dans l’image. Ensuite, vous devez créer un tableau de « unsigned char » pouvant contenir tous les éléments du code de Freeman pour chacune des formes.

Voici les déclarations que vous devrez utiliser :

typedef struct 

int CoordX; /* Coordonnée en X du premier pixel de la forme */

int CoordY; /* Coordonnée en Y du premier pixel de la forme */

int NbrFreeman; /* Nombre d’éléments dans le code de Freeman */

unsigned char *CodeFreeman; /* Pointeur qui sert de référence vers le tableau de données qui contient les éléments du code de Freeman */

 SShape;

SShape *Shapes; /* Pointeur qui sert de référence vers le tableau de description des formes */

Le graphique suivant illustre la structure de données telle qu’elle devra être implantée après la lecture du fichier d’entrée déjà présenté.

(8)

1 1 1 2 1 2 2 1 2 4 4 4 5 5 3 3 4 4 4 6 7 6 6 7 6 7 7 7 1

2 1 2 4 3 4 5 5 4 3 4 5 6 7 0 0 0 7 0 0

1 1 2 2 1 2 3 4 5 5 5 7 6 5 7 0 3

2 21

17 3 16

6 10 28

5. Après avoir lu le fichier d’entrée et construit votre structure de données, vous devez construire votre image dans un tableau interne de données. Puisque la taille du tableau est dynamique, vous devez gérer vous-même l’allocation et la libération de la mémoire. Votre tableau image doit être déclaré de la façon suivante :

unsigned char **Image;

6. Vous ne devez utiliser aucune variable globale.

(9)

7. Vos fonctions doivent être de taille minimale (idéalement pas plus de 25 lignes de code incluant la fonction principale « main », en excluant les commentaires). De plus, vous devez créer au moins une fonction pour laquelle vous utilisez le passage de paramètres par référence.

8. Votre fonction de remplissage doit être une fonction récursive.

9. Votre code doit être lisible et bien documenté.

Contrainte supplémentaire

Vous devez valider une partie de l’information qui se trouve dans le fichier d’entrée. Voici la liste des conditions que le fichier d’entrée doit respecter :

 les coordonnées initiales se trouvent à l’intérieur de l’image de X par Y (n’oubliez pas que les coordonnées (0, 0) est le pixel se trouvant en haut à gauche et que le pixel se trouvant en bas à droite possède les coordonnées (Taille_X - 1, Taille_Y - 1)) ;

 chacune des directions du code de Freeman est valide (comprise entre 0 et 7) ;

 chacun des éléments du contour est compris dans l’image de X par Y ;

 la forme est fermée (le dernier pixel décris par le code de Freeman est le même que celui de départ – décris par les coordonnées du premier pixel).

Si le fichier d’entrée ne respecte pas ces critères de base, votre programme doit arrêter le processus et informer l’usager de l’erreur par un message pertinent.

(10)

Les formes à traiter

Pour simplifier le problème, vous pouvez considérer que les formes que votre programme doit être en mesure de traiter sont des formes simples. Voici les cas que vous ne devez pas considérer.

Plusieurs surfaces fermées distinctes

Des éléments de contours qui se touchent sans être les

suivants ou les précédents

Un contour qui revient sur lui-même

Évaluation

L’évaluation de ce laboratoire se fera par la remise d’un rapport à la période qui suit la quatrième période allouée à ce laboratoire. Le rapport doit contenir un organigramme général du déroulement de votre programme (une page).

Ensuite, vous devez aussi remplir la grille d’évaluation de la page 11.

Finalement, répondez aux questions suivantes, sur une à deux pages.

 Quelle est la pertinence de la structure de données utilisée dans ce laboratoire? En quoi cette structure est-elle adaptée ou non au problème du contour? Donnez les avantages de la structure de données imposée pour ce problème. Parlez de modifications que vous apporteriez à la structure de données pour l’améliorer. (10)

 Discutez des avantages et des inconvénients des fonctions récursives.

Comment se prévenir des effets pervers qui apparaissent lors d’un grand nombre d’appels récursifs? (10)

 Imaginons de nouvelles spécifications pour le problème. Nous disposons d’images en niveaux de gris (chaque pixel pourrait valoir de 0 à 255 par exemple). Indiquez comment il est possible de modifier la structure de données utilisée dans ce laboratoire pour stocker l’information additionnelle du niveau de gris pour chaque élément du contour. (10)

(11)

La remise se fait par un fichier ZIP correspondant aux éléments suivants :

 Le dossier principal de votre projet Visual C++ incluant tous ses dépendants (sauf les librairies principales du C/C++). N’oubliez pas de bien documenter votre code source.

 Une version exécutable de votre programme.

 Un PDF de votre rapport.

 Le fichier doit être nommé :

GPA665_LAB1_Freeman_VotreNom.ZIP

Le tout doit être remis par courriel au chargé de laboratoire avant la date prescrite.

(12)

Grille d’évaluation

En guise d’autoévaluation, imprimez et remplissez vous-même cette section.

Mentionnez une référence (nom de fichier et numéro de ligne) lorsque demandé pour faciliter la vérification par le correcteur.

Spécifications techniques Oui Non Référence (fichier, ligne)

5 Validation du fichier d’entrée _____________________

2.5 Gestion correcte des fichiers textes 10 Résultats attendu pour la reconstruction et

calcul de l’aire et du périmètre _____________________

2.5 Demande itérative du traitement d’un autre

fichier d’entrée _____________________

Spécifications de programmation Oui Non

5 Utilisation de la structure de données

imposées (SShape) _____________________

5 Gestion dynamique de la mémoire et

libération de l’espace alloué _____________________

5 Utilisation de fonction avec passage de

paramètre par référence _____________________

5 Utilisation d’une fonction récursive pour le

remplissage des formes _____________________

(-10) Aucune variable globale

Qualité logicielle T.B. Bon Pauvre Référence (fichier, ligne) 5 Modularité : usage généralisé de fonctions

et regroupement logique en modules

_____________________

_____________________

5 Robustesse : Précaution pour éviter les problèmes de données erronées, etc.

_____________________

_____________________

5 Documentation : Commentaires pertinents qui accélèrent la compréhension du code

_____________________

_____________________

5 Clarté du code : Code concis et court utilisant les fonctions adaptées

_____________________

_____________________

60 TOTAL

Section réservée au correcteur :

/ 10 Organigramme

/ 30 Réponses aux questions

/ 60 Respect des spécifications

/ 100 Total

Références

Documents relatifs

Listes chaînées: principales opérations Listes chaînées: principales opérations Longueur d'une liste: (récursive). Longueur d'une liste:

Le P3 signifie que les couleurs sont en ASCII (L'American Standard Code for Information Interchange : norme de codage de caracteres),. par 3 colonnes et

La couleur associée à chaque pixel est calculée à partir de photosites R, V et B (généralement dans des proportions respectives de 25 %, 50 %, 25 %) et les intensités captées par

Cela permet au smartphone d’enregistrer deux images très légèrement décalées, d’analyser la profondeur de la scène grâce à la parallaxe, et de mettre en avant le sujet.. Le

Nous pouvons enchaîner directement avec le composant d’apprentissage que nous allons chercher dans l’onglet CLASSIFY.. Nous ne modifions pas les paramètres du

Il est d’usage avec les réseaux de neurones d’utiliser une fraction des données d’apprentissage, appelé « ensemble de validation » pour suivre l’évolution

Pour pr´ evoir des pics d’ozone, Air Breizh uti- lise 11 donn´ ees (ou pr´ evisions) m´ et´ eorologiques du jour ainsi que la concentration maximum d’ozone du jour pr´ ec´

Seuils de visualisation des images fonctionnelles pour une signification correspondant à une publication scientifique : sous Edu Anatomist : seuil inférieur à 75 et seuil supérieur