tnorth ~ blog

Aller au contenu | Aller au menu | Aller à la recherche

dimanche, septembre 27 2009

L'algorithme de Dijkstra appliqué à des images

Maintenant que l'année académique recommence, il est temps de publier un travail effectué dans le cadre des études : je ne vais pas m'étendre là dessus, et les intéressés pourrons consulter le poster associé ici.

Dans ce travail, le très connu algorithme de Dijkstra a été utilisé pour chercher un plus court chemin dans des images du fond de l'oeil.

Introduction

L'algorithme en question peut s'appliquer à énormément de choses différentes. Il est par exemple utilisé dans le protocole ''open shortest path first'' pour le routage IP, ou autres applications "graphes et réseaux". De même, il sert à assister des algorithmes d'intelligence artificielle pour déterminer le chemin le plus court pour déplacer, dans l'exemple d'un jeu, un personnage d'un endroit à un autre d'une manière efficace.

Revenons au cas d'une image: la création d'un graphe dans ce cas devient bien moins générale, et se réduit à des réseaux ou chaque sommet du graphe n'est relié qu'à ses voisins (géographiques) directs. Chaque lien est doté d'un coût, qui décrit s'il est aisé ou non de passer du pixel actuel au pixel visé. On pourra ainsi associer à chaque pixel de l'image un sommet, et à chaque lien entre ce pixel et ses voisins une arête.

Et de façon similaire, on pourrait créer une grille représentant un terrain virtuel. Le coût de déplacement pourrait être représentatif de l'altitude à grimper, ou du type d'obstacles à franchir.

Implémentation C

Il existe donc beaucoup d'implémentations de cet algorithme dans pas mal de langages de programmation différents. Néanmoins, je n'ai pas réellement trouvé d'algorithme écrit en C pur qui implémentent Dijkstra avec une complexité en dessous de O(N²). En voici donc une version, écrite pour appliquer l'algorithme sur des images, pour le moment restreint à deux dimensions. Il serait très facile de le modifier pour ajouter une 3ème dimension!

Astuces pour réduire le temps d'exécution

Exécuter Dijkstra prend du temps pour deux choses:

  1. Il faut créer un graphe à partir des données (l'image par exemple), en temps O(N)N est le nombre de sommets
  2. Il faut calculer le chemin le plus court pour arriver du point de départ au point de destination, en temps O(|E+N| log(N))E est le nombre d'arêtes.

Dans le cas d'images, augmenter chaque cote d'un facteur deux revient à multiplier par 4 le nombre de sommets. Autant la création du réseau que l'algorithme vont nécessiter du temps de calcul !

La proposition est alors la suivante : redimensionner le graphe (= l'image) pour y calculer un plus court chemin. Ensuite, définir une zone de travail autour de ce chemin, et recalculer le chemin le plus court sur l'image pleine résolution. Attention: la garantie d'obtenir le plus court chemin est perdue. Par contre, cela permet d'obtenir rapidement un "suffisamment" bon chemin.

Multi-res_scale Indication du temps de calcul en fonction de la taille de l'image (cf légende). Utiliser la multi-résolution permet de gagner beaucoup de temps sur les grosses images, ainsi que de l'occupation mémoire.

Applications

Aperçu interactif de l'algorithme

Peut-être visualisé dans un navigateur à jour ici : Dijkstra pas à pas Chaque click fait avancer l'algorithme d'un pas.

Labyrinthes

Il est possible de résoudre des labyrinthes:

Dijkstra_maze

Il a fallu moins de 2 secondes pour charger les images et retrouver le chemin sur l'image complète (clickez l'image)

Suivi de vaisseaux sanguins

vaisseau

Récupérer le code

Tout est disponible sur bitbucket.

Code C pur

Il faut regarder le dossier tests/ et s'en inspirer pour utiliser Dijkstra. Pour le moment, aucune interface robuste ou programme user-friendly n'a été préparé pour l'utiliser.

Module C pour Python

Une fois compilé avec la méthode standard, le module ne comporte que 3-4 fonctions très simples à utiliser. On se référera au fichier de test disponible dans le dossier du module.

mardi, décembre 16 2008

Fin du semestre

glace1_mLe froid arrive et la glace se fait omniprésente, les 13 semaines du semestre d'automne et les examens sont déjà derrière: cela a passé évidemment plus vite que prévu.

Ces dernières semaines ont été assez intense niveau travail. Chaque branche a apporté son lot de devoirs à faire et à rendre, et une bonne quantité de lectures. Le bilan est par contre largement positif: j'ai appris beaucoup de ces cours et des contacts avec les autres étudiants et colocataires étudiants en ingénieurerie, philosophie, théâtre, musique ou théologie.

Une pause est donc bienvenue, je ne supporte plus vraiment mon écran, et les réveils (très) matinaux pour vite encore réviser quelque chose commencent à avoir raison de moi.

Les vacances s'annoncent donc, leur programme exact reste à définir, mais je devrais trouver de quoi les occuper (sans rester derrière un PC, si c'est cela que vous voulez entendre :-) ).

Elles vont se terminer avec un week-end de 3 jours à Boston pour aller au Fedora User and Developer Conference, malgré la diminution de mon activité due aux études.

Encore deux choses pour finir :

Musique

Ecoute d'une pièce jouée par l'orchestre de l'Université de Montréal avec l'orchestre symphonique de musique de Montréal, dans lequel une de nos colocataire jouait de la contrebasse.

orchestre_uni_montreal_conservatoire1 Un moment reposant et inoubliable grâce au travail de ces nombreux musiciens parfaitement synchronisés.

Infographie

Et finalement, un petit mot sur le travail de Fabien Weibel qui nous a pondu il y a quelques jours un film d'animation 3D impressionnant (créé à l'aide du logiciel libre et gratuit Blender). C'est par ici que ça se passe pour les détails de la réalisation du projet, là pour voir la séquence en question en streaming, et sous ce lien pour la télécharger au format DivX (37Mb). (miroir pour préserver sa bande passante)

Freddys world

Ce que je retiens en particulier :

  • La gestion de la lumière, dans les pièces fermées. (A l'extérieur ce n'est pas toujours parfait, mais c'est une autre paire de manches !)
  • Le soucis du détail: grand nombre d'objets modélisés, et détails dans ceux-ci (lampe, barrage)
  • Les fluides sortent très bien (barrage, eau calme, aquarium)

Bref, une excellente maîtrise de Blender, je serai heureux de savoir en faire le pourcent :-)

lundi, septembre 1 2008

Montréal et l'université McGill

La présentation obligatoire (et sommaire) de la ville et de l'uni, maintenant que je m'y suis passablement promené.

Voici une vue depuis le Mont-Royal, qui domine la ville de ses 230 mètres d'altitude...

Montreal_mtroyal

La grisaille apparente de cette ville est équilibrée par le cette colline, sur laquelle on retrouve de la forêt, des espaces verts, et du calme.

Montreal_mtroyal_feuille

L'université, elle, est composée de vieux bâtiments ainsi que de plus récents. Le campus est du coup assez joli et bien moins gris que celui de l'EPFL... la faculté de médecine est principalement au nord, l'ingénieurerie plutôt à l'est, avec la biologie et la chimie.

mcgill_james

Maintenant que mes cours sont choisis et les formalités administratives effectuées, au travail pour un semestre de quatorze semaines.