Note sur Grafite
Transcription
Note sur Grafite
Notice explicative, Laurent Goutière le 13/11/2007 Grafite 1. Grafite ? Grafite, acronyme de “GRAnular Fow Imaging Techniques”, est une librairie développée en Matlab par Hervé Capart et Benoît Spinewine depuis 1999, permettant l’analyse d’écoulements granulaires par techniques d’imagerie digitale. Une documentation html partielle de cette librairie a été écrite et en décrit les fonctions principales. Cette librairie est en ce moment développée en C++ afin de l’optimiser. Les fonction d’édition, edit, et d’aide, help, Matlab sont disponibles pour les routines de la librairie. 2. Une image en Matlab 2.1. Définition Les images en Matlab sont représentées par des matrices : o les images couleurs par une matrice en 3D de dimensions MxNxP, où M est la largeur de l’image en pixels, N est la hauteur de l’image en pixels et P vaut 3 et permet de définir le code RGB (red, green, blue) d’un pixel. Un élément de la matrice représente un pixel et a une valeur entre 0 et 256 : o sa position dans les dimensions M et N représente la position du pixel dans l’image o suivant qu’il soit d’indice 1, 2 ou 3 dans la troisième dimension, sa valeur représente, respectivement, l’intensité de couleur rouge, verte ou bleue du pixel o Les images en noir et blanc par une matrice “image” en 2D de dimensions MxN associée à une matrice “colormap” de dimensions 256x3, où M est la largeur de l’image en pixels et N est la hauteur de l’image en pixels. Un élément de la matrice représente un pixel et a une valeur comprise entre 0 et 256 : o sa position dans les dimensions M et N représente la position du pixel dans l’image o sa valeur est un indice d’une ligne de la colormap associée qui défini 256 niveaux de gris, du noir au blanc. 2.2. Quelques fonctions o imread : lit une image à partir d’un fichier o image couleur : im = imread(filename), im est une matrice 3D 1/6 Notice explicative, Laurent Goutière le 13/11/2007 o image N/B : [im,cm] = imread(filename), im est la matrice 2D et cm la colormap o imshow : affiche une image : imshow(im) 3. Le fonctionnement de Grafite 3.1. Les accès Pour faciliter l’accès aux différentes routines de la libraire Grafite, une fonction Matlab permet simplement d’ajouter les chemins d’accès des répertoires de la librairie dans les chemins d’accès de Matlab. Pour ce faire il faut : 1. placer le fichier grafite.m dans le “workspace” par défaut de Matlab. 2. modifier le chemin d’accès des répertoires des routines, la variable name. 3. mettre en commentaire ou enlever des commentaires les répertoires des routines qui seront utilisées ou non. 4. lancer la fonction grafite.m pour que les chemins d’accès soient ajoutés et les routines seront utilisables directement. Les étapes 1, 2 et 3 ne sont généralement à faire qu’une seule fois, tandis que l’étape 4 permettra d’ajouter les chemins d’accès quand il vous est nécessaire d’utiliser les routines d’imagerie. 3.2. Initialisation des paramètres Il est nécessaire de définir certains paramètres propres aux séquences et aux particules pour appliquer les routines de traitement d’image. Ces paramètres sont définis par des structures en Matlab. Les paramètres propres aux séquences : La structure seq qui peut être définie à partir de la routine initseq.m dont les variables sont : o path : le chemin d’accès des images de la séquence, type : string o name : le nom générique des images, type : string o begindex : le premier indice de la séquence d’images à analyser, type : integer o endindex : le dernier indice de la séquence d’images à analyser, type : integer o format : le format des images, type : string o window : la taille de la fenêtre d’intérêt des images. Cette fenêtre est définie par un vecteur de 4 valeurs qui correspondent, respectivement au minimum et au maximum des valeurs en X et au minimum et au maximum des valeurs en Y, l’origine de l’image étant le coin supérieur gauche de l’image et les valeurs en Y étant négatives. Par exemple, pour une image de 800 x 600 pixels dont toute l’image est la zone d’intérêt, la valeur de window est [0 799 -599 0], le premier pixel étant en coordonnée (0,0). 2/6 Notice explicative, Laurent Goutière le 13/11/2007 Les paramètres propres aux particules : La structure par qui peut être définie à partir de la routine initpar.m dont les variables sont : o diameter : le diamètre des particules, observable sur l’image, type : integer o threshold : seuil d’intensité lumineuse pour la détection des particules, type : integer o redres : facteur de résolution avant l’identification des particules, par défaut de valeur 1 pour une résolution optimale, type : double (0 … 1). o max_temp et max_path : facteur pour les filtres lagrangiens et eulérien, à ne pas modifier. o u_0, v_0, w_1 et w_2 : définition de l’ellipse des positions possibles pour la correspondance d’une particule entre 2 images. u_0 et w_0, le déplacement moyen supposé des particules. w_1 et w_2, les demi-axes majeurs et mineurs de l’ellipse dont le centre est donné par u_0 et v_0. o plotcolor : couleur des traits pour les différents graphiques de résultats. Ces deux variables sont à définir pour chaque séquence. 3.3. Les routines de base Cette section a pour but de détailler les 5 routines qui permettent d’analyser le mouvement de particules d’un écoulement en 2D et d’en obtenir les trajectoires et les vitesses. pointset : méthode de segmentation des images : identification des centres des particules : o arguments : o seq : structure contenant les paramètres de la séquence o par : structure contenant les paramètres des particules o i : i+n : vecteur d’entiers qui sont les indices des images à analyser o dispflag : boolean pour l’affichage de l’image et des particules identifiées (0/1) o appels : o pointset(seq, par, i : i+n, dispflag) : reconnaissance des particules sur les images du vecteur i : i+n mais n’enregistre pas les données dans une variable o [r{1 : n+1,1}] = pointset(seq, par, i : i+n, dispflag) : reconnaissance des particules et enregistrement des données dans la variable r qui est un tableau de cellules (section 4) o résultats : r est un tableau de cellules de taille égale au nombre d'images analysées (1 ligne par image). Chaque cellule contient une matrice des coordonnées 2D des centres des particules identifiées, dont chaque ligne représente une particule (nombre de lignes égal au nombre de particules), la première colonne est la position en x de la particule et la seconde colonne la position en y. 3/6 Notice explicative, Laurent Goutière le 13/11/2007 eulmatch : méthode de correspondance des particules identifiées sur deux images : o arguments : o r(1 : n+1,1) : tableau de cellules résultat de la méthode pointset (1 ligne par image). La correspondance se fera entre les images i à i+n. o seq : structure contenant les paramètres de la séquence o par : structure contenant les paramètres des particules o dispflag : boolean pour l’affichage de l’image et de la correspondance des particules (0/1) o appels : o eulmatch(r(1 : n+1,1), seq, par, dispflag) : correspondance des particules entre les images i à i+n mais n’enregistre pas les données dans une variable o [m{1 : n,1}] = eulmatch(r(1 : n+1,1), seq, par, dispflag) : correspondance entre les images et enregistrement des données dans la variable m qui est un tableau de cellules (section 4) o résultats : m est un tableau avec un nombre de cellules égal au nombre d'entreimages. Chaque cellule contient une matrice dont le nombre de ligne est égal au nombre de particules de la première image le nombre de colonne égal au nombre de particules sur la seconde image. Pour une ligne de la matrice (qui représente donc une particule sur la première image), l’indice de la colonne qui contient une valeur égale à 1 (0 pour toutes les autres valeurs de la ligne) sur cette ligne est l’indice de la particule sur la seconde image qui correspond à la particule considérée sur la première image. Une ligne ne peut contenir qu’une valeur 1 puisqu’une particule ne correspond qu’à une seule autre particule. pathmat : méthode de construction des trajectoires des particules d'une séquence d'images. o arguments : o r(1 : n+1,1) : tableau de cellules résultat de la méthode pointset (1 ligne par image) o m(1 : n,1) : tableau de cellules résultat de la méthode eulmatch (1 ligne par entre-image) o seq : structure contenant les paramètres de la séquence o dispflag : boolean pour l’affichage de l’image et des trajectoires (0/1) o appels : o pathmat(r(1 : n+1,1), m(1 : n,1), seq, dispflag) : construction des trajectoires entre les images i à i+n mais n’enregistre pas les données dans une variable o p = pathmat(r(1 : n+1,1), m(1 : n,1), seq, dispflag) : construction des trajectoires entre les images et enregistrement des données dans la variable p qui est une matrice o résultats : p est une matrice dont chaque ligne représente une trajectoire et les colonnes correspondent aux images. Si l’élément d'indice (i,j) de la matrice est 4/6 Notice explicative, Laurent Goutière le 13/11/2007 non nul, cela signifie que la trajectoire i contient la particule de l'image j d'indice égal à la valeur de l’élément considéré. Les trajectoires peuvent ne pas s’étendre sur toutes les images de la séquence, soit si la particule entre ou sort de l’image pendant la séquence, soit si il y a une erreur de correspondance entre deux images. Le nombre de trajectoires peut donc être supérieur au nombre de particules. o remarque : il faut faire attention au paramètre min_path_length interne à la méthode qui indique la longueur minimale des trajectoires pour les afficher. pathplot : méthode qui trace les trajectoires calculées. o arguments : o r(1 : n+1,1) : tableau de cellules résultat de la méthode pointset (1 ligne par image) o p : matrice des trajectoires résultat de la méthode pathmat o seq : structure contenant les paramètres de la séquence o appels : pathplot(r(1 : n+1,1) ,p, seq) velset : méthode qui calcule les vitesses relatives aux trajectoires en pixel/tick (tick = temps entre deux images). o arguments : o r(1 : n+1,1) : tableau de cellules résultat de la méthode pointset (1 ligne par image) o m(1 : n,1) : tableau de cellules résultat de la méthode eulmatch (1 ligne par entre-image) o dispflag : boolean pour l’affichage de l’image et des vitesses (0/1) o par : structure contenant les paramètres des particules o appels : o velset(r(1 : n+1,1), m(1 : n,1), dispflag, par) : calcul des vitesses entre les images i à i+n mais n’enregistre pas les données dans une variable o [v{1 :n}] = velset(r(1 : n+1,1), m(1 : n,1), dispflag, par) : construction des trajectoires entre les images et enregistrement des données dans la variable v qui est un tableau de cellules o résultats : v est un tableau de cellule de taille égale au nombre d’entre-images. Chaque cellule contient une matrice dont chaque ligne représente une particule et les colonnes correspondent respectivement à la position X, la position Y, la vitesse suivant l’axe X et la vitesse suivant l’axe Y des particules entre 2 images successives. Si une particule n’a pas de correspondance avec une particule de l’image suivante les vitesses n’existent pas. 4. Un peu de Matlab… o who : affiche le contenu du workspace o whos : affiche le contenu du workspace avec les détails 5/6 Notice explicative, Laurent Goutière le 13/11/2007 o taleau de cellules : tableau d'éléments qui peuvent être de types différents et de tailles différentes. Pour un tableau de cellule r : o r : renvoie le type des cellules. o r(1) : renvoie le type de la cellule à cet indice là du tableau. o r{1} : renvoie le contenu de la cellule à cet indice là du tableau 6/6