Projet Programmation

1y ago
18 Views
2 Downloads
1.32 MB
52 Pages
Last View : 15d ago
Last Download : 3m ago
Upload by : Averie Goad
Transcription

Projet /1Api/Auteur / responsable du cours : Brice ColombierRelecteurs / intervenants : Dawood Al Chanti, Lionel Bastard,François Cayre, Michel Desvignes, Éric Moisan2021 – 2022

Projet programmation2021 – 2022Table des matières1 Présentation générale du projet1.1 Philosophie du projet . . . .1.2 Séances . . . . . . . . . . . .1.3 Évaluation . . . . . . . . . .1.4 Organisation . . . . . . . . .1.5 Environnement de travail . .333335.8881216.2222232429.35353638405 Évaluation5.1 Compétences . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .5.2 Évaluation formative . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .5.3 Évaluation sommative . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .47474748A Rappels de C49B Format PGM52.2 Sujet no 1 : Comptage de cellules2.1 Introduction . . . . . . . . . .2.2 Étapes préparatoires . . . . . .2.3 Version minimale . . . . . . .2.4 Pour aller plus loin . . . . . .3 Sujet no 2 : Percolation3.1 Introduction . . . .3.2 Étapes préparatoires3.3 Version minimale .3.4 Pour aller plus loin.4 Sujet no 3 : Simulation du problème à N corps4.1 Introduction . . . . . . . . . . . . . . . . . .4.2 Étapes préparatoires . . . . . . . . . . . . . .4.3 Version minimale . . . . . . . . . . . . . . .4.4 Pour aller plus loin . . . . . . . . . . . . . .2.

Projet programmation12021 – 2022Présentation générale du projet1.1Philosophie du projetCe projet a pour but de vous mettre dans la situation suivante : vous devez développer unprogramme informatique complet réalisant une tâche donnée, plus complexe que les exercicesisolés faits au premier semestre.L’objectif principal est d’aboutir à un projet finalisé. Vous devrez donc livrer un projetbien organisé, fonctionnel, et facilement utilisable. Nous privilégierons les projets simples,propres, et qui fonctionnent correctement, et ce même s’ils sont moins avancés d’un point devue algorithmique. Prenez ça en considération lorsque vous développez ! L’intitulé de ce coursest « Projet programmation », pas « Projet informatique », et c’est volontaire.Notre intention est que vous disposiez à l’issue de ce cours d’un projet que vous maîtrisez, dont vous êtes fier, et que vous pourriez montrer lors d’un entretien pour justifier d’unepremière expérience de développement informatique en C.1.2SéancesLe projet s’étale sur neuf semaines et est découpé en huit séances de quatre heures :1.3NoTypeContenu12345678encadréeIntroduction, choix des sujets, création des dépôts Git, etcencadréeTravail sur le projet en binôme, suiviencadréeTravail sur le projet en binôme, suivinon-encadrée Travail sur le projet en binôme sans suiviencadréeTravail sur le projet en binôme, suiviencadréeTravail sur le projet en binôme, suivi notéencadréeTravail sur le projet en binôme, suivisoutenanceDémonstration du projet et réponses aux questionsÉvaluationL’évaluation de ce projet est décrite en détail dans la Section 5.1.4OrganisationOrganisation du répertoire du projet Nous vous conseillons d’organiser le répertoire devotre projet de la manière présentée en Figure 1. C’est cette organisation qui est choisie dansle projet de départ fourni.3

Projet programmation{{{{{oo2021 – 2022Contient le(s) exécutable(s)Contient les fichiers d’en-tête .hContient les fichiers objets .oContient les fichiers sources .cContient les fichiers de test .cPour la compilation avec E.mdFigure 1 – Organisation conseillée pour le répertoire du projetOrganisation des fichiers sources Vous pouvez vous fixer les règles suivantes lors del’écriture de votre code :— Chaque fonction ne dépassera pas 30 lignes,— Chaque fichier source contiendra au maximum 10 fonctions.Pensez également à indenter correctement votre code. Même si vous compilez régulièrement, et on vous le conseille vivement, le compilateur passera toujours beaucoup moins detemps que vous à lire votre code. Écrivez donc votre code pour qu’il soit facile à lire pourvous.Programmation en binôme Nous vous conseillons de pratiquer la programmation en binôme. Dans cette méthode, on travaille à deux sur le même PC en étant à tour de rôle :— conducteur/trice : la personne qui code, en expliquant ce qu’elle fait,— observateur/trice : la personne qui observe, vérifie, corrige, suggère des améliorations.Il est très important, pour que cela fonctionne, d’échanger les rôles régulièrement. Mêmesi vos niveaux en programmation sont différents, chacun peut et doit assumer ces deux rôles.Figure 2 – Ken Thompson et Dennis Ritchie, concepteurs d’Unix et du langage C, pratiquantla programmation en binôme aux laboratoires Bell (Photo par Peter Hamer / CC BY-SA 2.0).Réusinage de code Le réusinage de code (refactoring en anglais) consiste à réécrire du codeafin de le rendre plus lisible. N’hésitez pas à en faire un usage immodéré, que ce soit sur lesparties du code que vous avez rédigées ou celles écrites par l’autre membre du binôme. Il estnormal d’écrire du code peu lisible lors des premières tentatives, il n’est pas acceptable de legarder dans cet état.4

Projet programmation1.52021 – 2022Environnement de travailMachine virtuelle Vous travaillerez sous Linux, dans l’environnement de développementde l’école que vous avez utilisé au premier semestre. Si vous souhaitez retrouver cet environnement sur votre ordinateur personnel, installez la machine virtuelle Phelma. Il est indispensableque le projet que vous rendrez compile sans avertissement ni erreur, et fonctionne sous cetenvironnement standard, car c’est celui que nous utiliserons pour l’évaluation finale.o Utilisation d’un autre environnement de développementVous pouvez faire le choix d’utiliser un autre environnement de développement (CodeBlocks, Visual Studio, XCode ou autre) mais, dans ce cas, vous en assumez l’entièreresponsabilité. Cela signifie que :— les enseignants ne fournissent pas de support des outils « non-standards ».— votre rendu final doit compiler sans avertissement ni erreur et être utilisable sousl’environnement standard décrit ci-dessus.Éditeur de texte Vous travaillerez avec un éditeur de texte disposant au minimum de lacoloration syntaxique. Atom est un bon choix.Collaboration avec Git Pour collaborer efficacement sur une même base de code, vousutiliserez Git. Vous trouverez sur le site tdinfo un guide de démarrage pour l’utilisation de Git.Une liste des questions fréquentes à propos de Git est également disponible sur ce site.Quelques exemples de dépôts Git bien tenus :— https://github.com/squidfunk/mkdocs-material— https://github.com/Ledger-Donjon/rainbow— https://github.com/etalab/DVF-appVotre utilisation de Git se limitera la plupart du temps à cette séquence de commandes :— git add fichier : suvire un fichier ou prendre en compte les modifications apportéessur un fichier,— git commit "message" : regrouper les modifications précédemment validées dans uncommit,— git push : pousser vos contributions locales sur le dépôt distant,La commande git push échouera si votre collègue a préalablement poussé des modifications que vous n’avez pas encore récupérées. Pour cela, lancez la commande git pull pourles récupérer, puis lancez à nouveau la commande git push, qui cette fois fonctionnera.o ConflitsIl faut éviter les conflits lors de l’écriture du code, c’est à dire travailler simultanémentsur une même section de code. En effet, dans ce cas, Git n’a aucun moyen de savoir quelleversion conserver et vous demandera de réaliser un merge manuel. Travaillez donc surdes sections de code distinctes, en vous répartissant les tâches au préalable.5

Projet programmation2021 – 2022 Bonnes pratiques lors de l’utilisation de GitNous vous conseillons les bonnes pratiques suivantes :— faites des commits concis, c’est à dire en ne travaillant que sur une seule chose àla fois, et choisissez un message de commit explicite décrivant ce que vous venezde coder,— travaillez sur des sections distinctes du code, pour éviter les conflits,— utilisez la commande git status pour connaître l’état courant de votre projetGit,— maintenez un fichier .gitignore pour éviter de suivre les fichiers inutiles : nesuivez que les fichiers que vous avez écrit vous-même.Compilation avec make Votre projet, puisqu’il est d’une certaine envergure, sera découpéen plusieurs fichiers .c et .h. Pour simplifier le processus de compilation, vous utiliserez make.Ce dernier trouvera les règles de compilation dans le fichier Makefile du projet. Vous trouverez sur le site tdinfo un document expliquant comment rédiger un fichier Makefile. CompilationPensez à compiler le plus souvent possible ! Le compilateur est très utile pour détecter au plus tôt les erreurs lors de l’écriture du code. Exploitez-le !Débogage avec gdb Dans le cas, probable, où le code que vous aurez écrit ne fonctionne pasdu premier coup, vous devrez le déboguer. La première solution, simple mais limitée, consisteà faire afficher la valeur des variables avec des printf. C’est très souvent suffisant.La deuxième solution, plus puissante, consiste à utiliser gdb pour placer des points d’arrêtdans votre code (breakpoint), faire afficher la valeur des variables (disp) et exécuter en modepas à pas (n ou s). L’utilisation de gdb est indispensable en cas d’erreur de segmentation, pouridentifier la ligne responsable.gdb s’utilise de la manière suivante : gdb ./bin/executable Exécutable avec argumentsSi votre exécutable prend des arguments, il faut passer l’option - -args à gcc : gdb --args ./bin/executable arg1 arg2Dans le cas contraire, gdb croira que les arguments arg1 et arg2 sont pour lui.6

Projet programmation2021 – 2022Vérification des fuites mémoire avec Valgrind Lorsqu’on doit allouer la mémoire dynamiquement en faisant des allocation dynamiques (avec malloc), il faut la libérer correctementensuite (avec free). Valgrind vérifie que toute la mémoire allouée a bien été libérée. Il vérifieégalement que les accès en lecture et écriture ne sont réalisés que dans la mémoire allouée.Exemple Ce programme alloue un tableau de dix entiers. On tente ensuite d’afficher lacase d’indice 20, puis d’écrire à la case d’indice 1000. Enfin, on ne libère pas le tableau.12#include stdio.h #include stdlib.h 345678int main(void) {int* tableau malloc(10 * sizeof(int));printf("%d\n", tableau[20]);tableau[1000] 5;}Voici une partie de la sortie de Valgrind, indiquant qu’à la fin de l’exécution, 40 octetsétaient encore utilisés, soit 10 entiers de 4 octets. Nous avons fait une allocation sans libération.Valgrind détecte aussi la lecture et l’écriture illégales et affiche le numéro des lignes fautives. 35802 35802 . 35802 35802 . 35802 35802 35802 36326 36326 36326 . 36326 Invalid read of size 4at 0x10918B: main (test.c:6)Invalid write of size 4at 0x1091AA: main (test.c:7)HEAP SUMMARY:in use at exit: 40 bytes in 1 blockstotal heap usage: 2 allocs, 1 frees, 1,064 bytes allocatedLEAK SUMMARY:definitely lost: 40 bytes in 1 blocksERROR SUMMARY: 2 errors from 2 contexts (suppressed: 0 from 0)7

Projet programmation22021 – 2022Sujet no 1 : Comptage de cellulesD’après des discussions avec M. Michel Desvignes.ObjectifL’objectif de ce projet est de compter les cellules présentes dans une image en niveauxde gris en les isolant par des méthodes de morphologie mathématique.2.1IntroductionLorsqu’on réalise une culture cellulaire, il est essentiel de pouvoir compter les cellulesprésentes dans la culture à un instant donné. Cela permet de savoir si la culture fonctionnecorrectement et si de nouvelles cellules s’y développent.Pour réaliser cette tâche, on peut compter les cellules manuellement. Pour simplifier le processus, on place généralement une grille au dessus de la culture, puis, à l’aide d’un microscope,on compte les cellules dans chaque case de la grille. En sommant finalement tous les comptesintermédiaires, on obtient le nombre total de cellules. Ce processus est long et fastidieux.Des méthodes de traitement d’images permettent heureusement de réaliser cette tâcheautomatiquement, à partir d’une image de la culture cellulaire comme celle de la Figure 3.C’est l’objectif de ce projet.Figure 3 – Image d’une culture cellulaire.2.22.2.1Étapes préparatoiresLecture d’une image au format PGMIl vous faudra donc dans un premier temps écrire une fonction qui lit une image au formatPGM et la stocke en mémoire dans un tableau à deux dimensions. Le format PGM binaire estdécrit dans l’annexe B.8

Projet programmation2021 – 2022Lors de l’allocation de la matrice des pixels, vous prendrez garde à réaliser une allocationmémoire contiguë. Ceci est illustré dans la Figure 4. On souhaite stocker un matrice de troislignes et quatre colonnes (voir Figure 4a). On souhaite également pouvoir accéder à un élémentde la matrice avec la syntaxe suivante : matrice[ligne][colonne].La première solution, présentée en Figure 4b, consiste à d’abord allouer un tableau de pointeurs pour les lignes, puis à allouer chaque ligne individuellement. Dans ce cas, lors des allocations successives des lignes, rien ne garantit que l’allocateur mémoire les placera côte à côteen mémoire. Cela peut avoir un coût en performances important, à cause des défauts de cache.Une autre solution, présentée en Figure 4c, consiste à d’abord allouer un tableau de pointeurs pour les lignes, comme précédemment, puis à faire une seule allocation pour l’intégralité de la matrice, sur le pointeur d’indice 0. Il faut ensuite faire pointer les pointeurs d’indice1 à nb lignes - 1 vers la bonne partie de la zone mémoire allouée.En plus des raisons de performances évoquées au dessus, le fait de réaliser une allocationcontiguë permet, lors de la lecture ou l’écriture d’un fichier, de travailler avec l’intégralité desdonnées à la fois, en les considérant comme un seul bloc binaire.01234567891011468(a) Matrice 3 4 à stocker050110113279(b) Allocation non-contiguë en mémoire1234567891011(c) Allocation contiguë en mémoireFigure 4 – Allocations mémoire (adapté de http://c-faq.com/aryptr/dynmuldimary.html).Lors de la lecture de l’image dans un fichier PGM, il peut être utile de conserver d’autresinformations utiles, comme le nombre de lignes et de colonnes. Vous définirez une structure,voire un nouveau type, adaptés pour représenter les images.Vous écrirez ensuite une fonction dont le rôle sera d’écrire une image dans un fichier. Vouscommencerez par écrire directement l’image lue. Cela vous permettra de vérifier que la lectureet l’écriture fonctionnent correctement.Vous pourrez vérifier que les deux fichiers sont identiques avec la commande suivante :9

Projet programmation2021 – 2022 diff image.pgm copie.pgmVous n’oublierez pas d’écrire des fonctions pour libérer la mémoire à la fin du programme !2.2.2Seuillage manuelLe premier traitement à appliquer à l’image consiste à la seuiller, c’est-à-dire à passer d’uneimage en niveaux de gris, dont la valeur des pixels va de 0 à 255, à une image binaire (ou “noiret blanc”), dont la valeur des pixels est de 0 ou 255.Le seuil définit, pour chaque pixel de l’image, s’il sera noir ou blanc après seuillage. Fixercorrectement la valeur de ce seuil est important, comme illustré en Figure 5, où l’image de laFigure 5a est seuillée avec différentes valeurs de seuil. Si le seuil est trop bas (Figure 5b) outrop haut (Figure 5c), on perd des détails de l’image. Un seuil bien choisi (Figure 5d) permet debien séparer les objets, qui deviennent blancs, de l’arrière-plan, qui devient noir.(a) Image de départ en (b) Image seuillée avec (c) Image seuillée avec (d) Image seuillée avecniveaux de grisun seuil trop basun seuil trop hautun seuil bien choisiFigure 5 – Image seuillée avec différentes valeurs de seuil.Écrivez une fonction qui réalise le seuillage d’une image et le programme de test associé.Vous écrirez le programme de test de façon à ce qu’il puisse prendre en paramètre le nom del’image à traiter. Vous pourrez faire en sorte que le seuil puisse être passé en paramètre luiaussi. Par exemple, pour un seuil fixé à 150, voici la commande que vous lancerez : ./bin/test seuillage image.pgm 1502.2.3Seuillage automatique : méthode d’OtsuLa méthode d’Otsu permet de déterminer automatiquement la valeur du seuil à partir del’histogramme de l’image.Histogramme L’histogramme d’une image représente la distribution des valeurs des pixelsde l’image. La Figure 6 montre une image et son histogramme. Sur cet histogramme, on observedeux modes, l’un autour de la valeur 100 et l’autre autour de la valeur 200. Le premier correspond à l’arrière-plan sombre, le second aux cellules plus claires. La méthode d’Otsu permet dedéterminer la valeur du seuil qui sépare au mieux ces deux modes.Écrivez une fonction qui calcule l’histogramme de l’image et le stocke dans un tableau.10

Projet programmation03264962021 – 2022128160192224255Figure 6 – L’image et son histogramme.Méthode d’Otsu La méthode d’Otsu énumère toutes les valeurs possibles du seuil, de 0 à255, et trouve celle qui maximise la variance inter-classe, c’est-à-dire celle qui sépare le mieuxles deux modes. La variance inter-classe σb2 est définie dans l’équation (1).σb2 (s) ω0 (s)ω1 (s)[µ0 (s) µ1 (s)]2(1)où ω0 (s) et ω1 (s) sont les probabilités de classe, définies dans l’équation (2)ω0 (s) s 1Xh(i)etω1 (s) i 0255Xh(i)(2)i set µ0 (s) et µ1 (s) sont les moyennes empiriques des classes, définies dans l’équation (3).s 1Xµ0 (s) 255Xih(i)i 0ω0 (s)etµ1 (s) ih(i)i sω1 (s)(3)Le seuil calculé est la valeur de s pour laquelle la variance inter-classe σb2 (s) est maximale.Vous écrirez une fonction qui réalise le seuillage automatique, puis vous écrirez un programme de test qui permet de seuiller automatiquement une image dont le nom est passé enparamètre.2.2.4Utilitaire de génération d’images de testPour tester le fonctionnement de vos programmes, nous vous fournissons un utilitaire écriten Python qui permet de générer un image PGM.Par exemple, pour générer une image de 3 3 pixels noire avec un pixel blanc au centre,vous lancerez la commande suivante : python2.7 generate test image.py NNN NBN NNN11

Projet programmation2.32.3.12021 – 2022Version minimaleOpérations booléennesNous aurons besoin pour la suite de réaliser des opérations booléennes, ou logiques, entredeux images. Nous définissons donc les trois opérations suivantes : intersection (ET logique),union (OU logique) et OU exclusif.Les tables de vérité de ces opérations sont rappelées dans la Table 1.imA [i][j]NNBBimB [i][j]NBNBimINTERSECTION [i][j]NNNBimUNION [i][j]NBBBimXOR [i][j]NBBNTable 1 – Tables de vérité des opérations intersection, union et OU exclusif.Toutes ces opérations pré-supposent que les images d’entrée sont de même dimension. Ilserait intéressant de le vérifier grâce à assert.o Mot-clé du langage Cunion est un mot-clé du langage C, vous ne pouvez donc pas l’utiliser comme nom defonction.2.3.2Opérations morphologiques basiquesLa morphologie mathématique est une branche des mathématiques très utile pour le traitement des images. Elle définit des opérations applicables à des images, en particulier cellesen noir et blanc, ce qui nous intéressera dans ce projet. Nous nous limiterons aux opérationssimples dans le cadre de ce projet.Érosion L’opération d’érosion consiste à calculer le minimum local de chaque groupe de3 3 pixels dans l’image de départ. Si dans un groupe de 3 3 pixels tous les pixels sontblancs, alors le pixel en sortie de l’opération est blanc. Si dans un groupe de 3 3 pixels il y aau moins un pixel noir, alors le pixel en sortie de l’opération est noir.L’opération d’érosion est illustrée en Figure 7 où deux exemples de son application sontdonnés. L’érosion réduit la surface des zones blanches dans l’image.Dilatation L’opération de dilatation consiste à calculer le maximum local de chaque groupede 3 3 pixels dans l’image de départ. Si dans un groupe de 3 3 pixels tous les pixels sontnoirs, alors le pixel en sortie de l’opération est noir. Si dans un groupe de 3 3 pixels il y a aumoins un pixel blanc, alors le pixel en sortie de l’opération est blanc.12

Projet programmation(a) Avant érosion(b) Après érosion(c) Avant érosion2021 – 2022(d) Après érosionFigure 7 – Deux exemples d’application de l’opération d’érosion.L’opération de dilatation est illustrée en Figure 8 où deux exemples de son application sontdonnés. La dilatation augmente la surface des zones blanches dans l’image.(a) Avant dilatation(b) Après dilatation(c) Avant dilatation(d) Après dilatationFigure 8 – Deux exemples d’application de l’opération de dilatation.2.3.3ReconstructionUne autre opération importante de morphologie est la reconstruction. Cette dernière consisteà faire croître une image graine dans l’image. On dilate la graine dans les zones blanches del’image, jusqu’à ce que ces dernières soient complètement remplies. La reconstruction est décrite dans l’Algorithme 1.Algorithme 1 Reconstruction morphologique1: graine dilatee dilatation(graine)2: image reconstruite intersection(image, graine dilatee)3: faire4:graine dilatee dilatation(image reconstruite)5:image reconstruite intersection(image, graine dilatee)6: tant que image reconstruite changePour écrire cette fonction, vous aurez besoin de comparer deux images, afin de savoir siimage reconstruite a changé. Vous utiliserez memcmp pour ça.13

Projet programmation2021 – 2022La Figure 9 illustre l’opération de reconstruction sur un exemple. À chaque itération dela boucle while, la graine croît dans les zones blanches de l’image, jusqu’à remplir complètement la zone du bas. La boucle s’arrête ensuite car l’image reconstruite ne change plus. Lareconstruction est terminée : on a bien “reconstruit” la zone blanche du bas de l’image.(a) Image(b) Graine(c) Première répétition (d) Deuxième répétitionFigure 9 – Illustration des étapes de l’opération de reconstruction morphologique.L’opération de reconstruction définie ci-dessus est très utile pour “sélectionner” certainséléments de l’image. L’effet que la reconstruction aura sur l’image dépend donc de la graine.2.3.4Suppression des cellules au bordPour supprimer les cellules au bord de l’image, on applique l’opération de reconstruction enutilisant comme graine un cadre blanc d’un pixel au bord de l’image, sur fond noir. La Figure 10montre quelques étapes de cette reconstruction. Les cellules au bord sont “sélectionnées” parla reconstruction. On termine en faisant le OU-exclusif entre l’image reconstruite et l’imageinitiale (Figure 11).Figure 10 – Étapes de la reconstruction d’un cadre blanc dans l’image seuillée. Figure 11 – Suppression des cellules au bord par OU-exclusif avec un cadre reconstruit.14

Projet programmation2.3.52021 – 2022Bouchage des trousCertaines cellules de l’image seuillée présentent un trou. Ce trou correspond à une zonesombre au milieu de ces cellules dans l’image initiale en niveaux de gris. La Figure 12 montretrois cellules pour lesquelles ce phénomène se produit.(a) Image seuillée(b) Image en niveaux de grisFigure 12 – Mise en évidence dans l’image seuillée et l’image en niveaux de gris des cellulesprésentant un trou dans l’image seuillée.Pour supprimer les cellules avec un trou, on applique l’opération de reconstruction surl’image inversée avec la même graine que précédemment : un cadre blanc d’un pixel sur fondnoir, de la taille de l’image. Cela remplit progressivement l’espace entre les cellules, ne laissantfinalement que les cellules elles-mêmes.La Figure 13 montre quelques étapes de la reconstruction du cadre dans l’image inversée.Le fond est progressivement rempli, ne laissant finalement que des cellules sans trou. Il fautfinalement inverser à nouveau l’image pour obtenir l’image seuillée initiale avec les trousbouchés.Figure 13 – Étapes de la reconstruction d’un cadre blanc dans l’image seuillée.2.3.6Érosion manuelleDans l’image finalement obtenue, certaines cellules se touchent. C’est un problème pourles compter. Pour séparer ces cellules, on érode l’image un certain nombre de fois, fixé manuellement. La Figure 14 montre une image avec les cellules bien séparées.Nous avons fait le choix ici de réaliser cette érosion manuelle à la fin, mais nous aurionsaussi pu la réaliser avant de supprimer les cellules au bord.2.3.7Comptage des composantes connexes par parcours en profondeurLa dernière étape consiste à compter les composantes connexes de l’image. Deux pixelsappartiennent à la même composante connexe s’ils sont en contact par un de leurs quatre15

Projet programmation2021 – 2022Figure 14 – Cellules bien séparées après érosion.côtés : on considère donc la 4-connectivité. On considèrera que des pixels qui sont en contactpar un angle n’appartiennent pas à la même composante connexe, ce qui serait le cas si onconsidérait la 8-connectivité.Pour compter les composantes connexes, on se basera sur un algorithme de parcours enprofondeur (DFS pour depth-first search) récursif sur les pixels blancs de l’image. Celui-ci estdécrit dans l’Algorithme 2.Algorithme 2 Algorithme de recherche en profondeur dans les pixels d’une image1:2:3:4:5:6:7:8:fonction DFS(image, ligne, colonne)si image[ligne][colonne] n’a pas encore été visité alorssi image[ligne][colonne] est blanc alorsMarquer image[ligne][colonne] comme visitéDFS(image, ligne-1, colonne). Visite du voisin du hautDFS(image, ligne 1, colonne). Visite du voisin du basDFS(image, ligne, colonne-1). Visite du voisin de gaucheDFS(image, ligne, colonne 1). Visite du voisin de droiteUne fois cet algorithme implémenté, on comptera les composantes connexes en effectuantune recherche à partir de tous les pixels de l’image. On prendra garde de ne pas visiter despixels que l’on aura déjà visités. Chaque nouvelle recherche réussie correspondra à une nouvelle composante connexe.2.42.4.1Pour aller plus loinÉrodés ultimesDans la section 2.3.6, nous avons réalisé une érosion manuelle : nous avons fixé arbitrairement le nombre de répétitions afin de séparer suffisamment les cellules qui se touchaient,sans les faire disparaître. Il serait plus intéressant de réaliser ces érosions successives en déterminant le nombre d’itérations de manière automatique.Un problème qui apparaît alors est que certaines cellules sont plus grosses que d’autres.En conséquence, les érosions successives supprimeront les plus petites cellules, tandis qu’ellesconserveront les plus grosses. Comment savoir alors quand arrêter l’érosion ?16

Projet programmation2021 – 2022Une solution consiste à identifier les érodés ultimes, c’est-à-dire, pour chaque cellule, sadernière version érodée avant qu’elle ne disparaisse. L’Algorithme 3 décrit cette méthode. Sonprincipe est le suivant :— on érode l’image (ligne 4) puis on reconstruit la version érodée dans l’image de départ(ligne 6),— on détecte avec un OU-exclusif les éléments que l’érosion avait fait disparaître (ligne 7) :ce sont les résidus,— on accumule les résidus avec une union (ligne 8),— l’image courante devient l’image érodée (ligne 9),— on répète ces opérations tant que l’image courante n’a pas été complètement érodée(ligne 10), c’est-à-dire tant qu’elle n’est pas vide.Pour une cellule de taille suffisante, l’érosion puis la reconstruction réalisées aux lignes 4 et 6s’annulent. En revanche, pour un érodé ultime, la reconstruction est impossible puisque l’érosion l’a fait disparaître. Ces deux cas sont discriminés par l’opération OU-exclusif puis les casoù la cellule a disparu, correspondant aux érodés ultimes, sont accumulés.Algorithme 3 Érodés ultimes1: erodes ultimes, erodee, residus, reconstruite : des images vides2: courante image3: faire4:erodee erosion(courante)5:Effacer reconstruite6:reconstruite reconstruction(courante, erodee)7:residus OU exclusif(reconstruite, courante)8:erodes ultimes union(residus, erodes ultimes)9:échanger erodee et courante10: tant que courante n’est pas videLa Figure 15 montre un exemple d’érodés ultimes.Figure 15 – Érodés ultimes.Dilatation finale Les érodés ultimes obtenus peuvent avoir des formes variées. En particulier, il est possible d’obtenir trois pixels, disposés en diagonale. Dans ce cas, ils ne seront pas17

Projet programmation2021 – 2022identifiés comme faisant partie de la même composante connexe par l’Algorithme 2, car onconsidère seulement la 4-connectivité.Une solution consiste à réaliser une dilatation finale, qui connectera ces pixels. Il ne fautpas faire plusieurs dilatations à cette étape, sinon on risque de faire se toucher à nouveau descellules qui ont été séparées lors de la détermination des érodés ultimes.2.4.2Étiquetage en composantes connexes : algorithme de Hoshen–KopelmanLa méthode utilisée précédemment pour l’étiquetage des composantes connexes, décritedans la section 2.3.7, n’est pas efficace, car elle parcourt chaque case beaucoup plus de fois quenécessaire.L’algorithme de Hoshen-Kopelman permet d’étiqueter les composantes connexes en seulement deux passes sur l’image. Cet algorithme fait appel à une structure de données union-find,qui permet d’exprimer des relations d’équivalence entre des éléments. Ces éléments sont alorsregroupés, ou non, dans des classes d’équivalence. Il faut donc dans un premier temps implémenter cette structure de données.Structure de données union-find Une structure union-find permet d’exprimer des relations d’équivalence entre des éléments. Deux méthodes sont définies sur cette structure dedonnées :— find(i) : trouve la classe de l’élément i,— union(i, j) : fusionne les classes des éléments i et j.Implémentation d’une structur

L'intitulé de ce cours est « Projet programmation », pas « Projet informatique », et c'est volontaire. Notre intention est que vous disposiez à l'issue de ce cours d'un projet que vous maîtri-sez, dont vous êtes er, et que vous pourriez montrer lors d'un entretien pour justi er d'une première expérience de développement informatique en C. 1.2 Séances Le projet s .

Related Documents:

La programmation objets expliquée aux programmeurs Si vous êtes programmeur, mais habitué aux langages de programmation "procéduraux" (pascal, fortran, C, perl, etc.), ce chapitre est pour vous: il essaie d'expliquer comment on peut passer de la programmation procédurale à la programmation objet, via la programmation structurée.

Projet 1: acquisition d’un logiciel Projet 4: développement d’un produit Projet 5: modification d’une organisation Projet n: xyz Scénarios Portefeuille de gestion d’une organisation Figure 1: Scénarios et portefeuille de projets Le chef de projet choisit le scénario qui convient pour son projet. Il planifie le projet

Cours c et programmation orientée objet Programmation orientée objet 3 UMMTO Apparu dans les années 60s au sein de MIT Offre une grande souplesse de travail maintenance aisée Objet en programmation objet dans le monde réel Objet propriétés (attributs ) actions (méthodes ) Objet en C Structure de données (objet simple ) Classe

Programmation pour la physique Ce cours est une introduction a plusieurs sujets importants pour la programmation scienti que : R evision de la programmation procedurale avec le langage Python Initiation aux principes el ementaires de la programmation orient ee objet Probl emes choisis de l'algorithmique : Algorithmes de tri Probl emes choisis de l'analyse num erique : Recherche des z eros .

Programmation Orientée Objet en C# 1 Introduction 1.1 Présentation Tout bon développeur le sait, le code d'un programme doit être propre, commenté, facile à maintenir et à améliorer. Vous êtes adepte de la programmation procédurale et souhaitez apprendre la programmation objet ? Alors ce tutoriel est fait pour vous.

Programmation orientée objet dans Visual Basic _ 14/01/2007 Page : 1 Programmation orientée objet dans Visual Basic Les objets jouent un rôle central dans la programmation Visual Basic. Les formulaires et les contrôles sont des objets, ainsi que les bases de données. Si

34 Programmation objet 34.1 Programmation objet 34.2 Mot clé new 34.3 Object methods and fields 34.4 Function et prototype 34.5 mot clé this 34.6 paradigme de programmation classe/objet 35 Notation JSON 35.1 Tableau 35.2 Objet 35.3 Imbrications 35.4 Voir aussi 36 Ajax 36.1 Ajax : comment créer un sommaire 36.1.1 Intérêt de l'utilisation d .

However, the machining of these typically difficult-to-cut materials poses a challenge for conventional manufacturing technologies due to the high tool wear. Abrasive water jet (AWJ) machining is a promising alternative manufacturing technology for machining difficult-to-cut materials,