Localisation et évaluation du diamètre et de la profondeur d’une cavité opératoire statique I. Cheddadi1 , A. Getmanenko2 , I. Mostefaoui3 , D. Vicente6 . G. B. Nguyen4 , 1 5 LJLL, Université Paris 6 2 IHÉS 3 Université de La Rochelle 4 LMJL, Université de Nantes LMBA, Université de Bretagne Sud 6 MAPMO, Université d’Orléans 8ème Semaine d’Etude Maths-Entreprises. SEME Orléans 20-24 Janvier 2014. Sujet Proposé par l’entreprise MAQUET. Correspondants : Cécile Louchet, Aurélien Gauvin. 1 M. Safa5 , Remerciements Nous tenons à remercier l’entreprise Maquet et son représentant Aurélien Gauvin pour nous avoir proposé ce projet et pour le temps qu’il nous a consacré ; le laboratoire MAPMO qui a hébergé la SEME et en particulier Cécile Louchet qui a encadré le projet ; et enfin l’agence AMIES et le GdR Maths-entreprises qui sont à l’origine de cette opération et l’ont soutenue financièrement. 2 Table des matières 1 Introduction 1.1 Motivation et contexte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.2 Objectif du rapport . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.3 Plan du rapport . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 4 5 5 2 Les données 2.1 La provenance des données . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.2 La structure des données . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 5 6 3 Cas d’une cavité à bord horizontal, sans ombre 6 4 Cas d’une cavité à bord incliné, sans ombre 8 5 Mise en oeuvre de l’algorithme d’identification des cavités 5.1 Algorithme de construction de la composante connexe d’un point critère donné . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.2 Identification de la cavité . . . . . . . . . . . . . . . . . . . . . . . 5.3 Premiers résultats . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.4 Amélioration des résultats . . . . . . . . . . . . . . . . . . . . . . . 9 vérifiant . . . . . . . . . . . . . . . . . . . . un . . . . . . . . . 9 . 10 . 10 . 10 6 Traitement des ombres 11 7 Conclusion et perspectives 14 3 1 1.1 Introduction Motivation et contexte Durant une opération chirurgicale, le médecin opère au sein de différentes couches du corps d’un patient, chacune ayant sa propre épaisseur et sa propre réflectivité. Un dispositif efficace d’éclairage de la table d’opération doit envoyer la lumière exactement sur la plaie chirurgicale et, dans la mesure du possible, éviter d’éclairer la peau autour d’elle afin de ne pas éblouir le chirurgien par l’excès de lumière réfléchie. La société Maquet cherche à développer une technologie capable de contrôler de manière autonome la position et la forme du faisceau de lumière projeté sur la plaie chirurgicale. source de lumière <30 ∘ plaie Figure 1 – La table opératoire, la plaie, et la source de la lumière ; dans ce cas précis, le faisceau de lumière est trop étroit et n’éclaire pas la totalité de la plaie. Le problème technologique et algorithmique à résoudre est donc de localiser la plaie par rapport à la source de lumière. En conditions normales d’utilisation, cette source se trouve approximativement à la distance de 1 mètre de la table opératoire, et l’angle du faisceau par rapport à la verticale est inférieur à 30◦ . Au cours de l’opération la source de la lumière ainsi que le patient peuvent être fréquemment déplacés, ce qui nécessite une nouvelle détermination de leurs positions relatives une fois par seconde. C’est pourquoi la société Maquet à proposé d’utiliser l’information donnée par un matériel de type Kinect. Un appareil Kinect contient une source de lumière infrarouge et une caméra digitale dans la même fréquence, capable de mesurer la distance de l’appareil à l’obstacle le plus proche. La scène 3D est représentée sous la forme d’une matrice 2D de profondeurs, la valeur de chaque pixel correspondant à la distance entre un objet et la caméra infrarouge. Cette technologie est actuellement utilisée dans la console de jeux vidéo Xbox 360 pour enregistrer les mouvements des joueurs par rapport à la console. Maquet propose d’installer un appareil Kinect sur la source de lumière chirurgicale. 4 1.2 Objectif du rapport Dans ce rapport nous proposons une solution algorithmique élémentaire pour le problème de localisation de la plaie chirurgicale à partir de l’image Kinect. 1.3 Plan du rapport Dans la Sec. 2, nous détaillons les formats informatiques des images de la plaie dans les champs visible et infrarouge. Ensuite, nous discutons de l’algorithme dans le cas où il n’y a pas d’ombre projetée sur la table d’opération. La Sec. 3 s’intéresse au cas particulier où la surface autour de la cavité est horizontale. Dans la Sec. 4 nous traitons le cas plus général où cette surface est inclinée. La Sec. 5 détaille la mise en oeuvre des algorithmes et l’évaluation de leur efficacité. La Sec. 6 explique une méthode de suppression des ombres afin d’employer l’algorithme sur des images réalistes. 2 Les données 2.1 La provenance des données L’appareil qu’on envisage de connecter à un ordinateur pour gérer l’illumination de la plaie chirurgicale comporte une lampe et une caméra digitale opérant en lumière visible, et le dispositif Kinect qui contient un émetteur et une caméra infrarouges. La distance entre la source de lumière et les caméras est de l’ordre de 2 cm, la distance entre les caméras et la plaie chirurgicale est de l’ordre d’1 m. A cause de cette distance entre la source de lumière infrarouge et les caméras, il résulte des ombres dans les images enregistrés (voir Fig..2, gauche). Surface du corps Surface du corps Instrument médical ombre Instrument médical ombre cavité cavité Résultat Données Figure 2 – Ombre sur l’image Kinect (gauche) et le résultat du retrait de l’ombre par l’algorithme expliqué à la Sec. 6, avec un artefact possible (droit). Les deux types d’image sont transmis sous forme de fichiers au format JPEG en RGB sur 256 niveaux. Dans le cas de l’image Kinect, la distance entre la caméra infrarouge et l’objet (corps du patient) est représentée en niveau de gris (tous les canaux RGB ont même valeur), les pixels noirs représentant les points les plus éloignés. Les points appartenant à l’ombre, auxquels la Kinect n’arrive pas à attribuer une distance, sont représentés en vert, ce qui nous permet de les détecter facilement (les canaux RGB n’ont pas tous la même valeur) pour enlever l’effet de l’ombre de l’image, voir Sec. 6. L’entreprise Maquet nous a indiqué que le niveau de bruit sur les mesures de profondeur est estimé inférieur à 10%. 5 L’entreprise Maquet nous a fourni des images simulées de table d’opération (voir Sec. 5.3), dans lesquelles l’épaisseur de l’ombre est de l’ordre de 5 à 10 % de la taille de l’image et jusqu’à 30 % de la taille de la cavité. La Fig. 2, gauche montre une image schématique des données fournies. On fera l’hypothèse que la cavité est plus profonde que la surface du corps autour. Donc nous n’avons pas traité le cas où les organes sortent de la cavité. Par contre, nous devons traiter le cas où des instrument médicaux ainsi que les mains d’un médecin sont situés au-dessus de la cavité opératoire et où la forme de la cavité doit être détectée en dépit de la présence des ces éléments sur l’image Kinect. C’est l’une des difficultés principales que nous avons abordé. Dans ce travail nous avons jugé suffisant de n’analyser que l’image Kinect et de ne pas utiliser l’image dans le champs visible. 2.2 La structure des données L’image infrarouge obtenue par le Kinect donne la matrice de profondeur z(x, y), Fig.3, où (x, y) désigne les coordonnées d’un pixel, et où z(x, y) prend ses valeurs dans Z ∪ {indéfini} ; z(x, y) = indéfini signifie que le point (x, y) appartient à l’ombre. Pour les images fournies par niveau de la caméra z y (x , y) x Figure 3 – Les données de la matrice de profondeur z(x, y) Maquet, les coordonnées x, y sont les entiers 0 ≤ x, y ≤ 600, et les valeurs de zx,y sont entre 0 et 255. 3 Cas d’une cavité à bord horizontal, sans ombre Dans ce paragraphe, nous nous plaçons dans la situation où la surface entourant la cavité est orthogonale à l’axe de la caméra, et donc apparaı̂t comme un région approximativement plate à distance constante de la Kinect. Mathématiquement, quitte à passer dans un système de coordonnées approprié, on peut donc supposer pour le reste de Sec. 3 que la surface est horizontale et que l’axe de la caméra est vertical. Par ailleurs, nous ferons l’hypothèse que le centre de l’image appartient à la cavité. Il peut arriver cependant que le point situé exactement au centre de l’image soit plus élevé que la surface 6 autour de la plaie, soit à cause du bruit, soit parce que ce point correspond à un instrument médical. Pour cet raison, on réitère l’algorithme décrit ci-dessous plusieurs fois à partir d’un point initial choisi comme le point central de l’image décale d’un vecteur aléatoire (∆x, ∆y) avec −30 ≤ ∆x ≤ 30, −30 ≤ ∆y ≤ 30. On désigne par (x∗ , y∗ ) le point initial situé au milieu de l’image. L’idée intuitive de l’algorithme est de remplir la cavité d’eau jusqu’au niveau où l’eau commence à déborder. Le niveau de l’eau juste avant de déborder sera notre représentation de la forme de la cavité. Nous aurons besoin de la définition suivante : Si A est un sous-ensemble de Z2 , on l’appelle connexe si pour tous les couples de points (xd , yd ), (xf , yf ) ∈ A il existe un chemin dans A qui les relie, c’est à dire un nombre n de points (x1 , y1 ), . . . , (xn , yn ) ∈ A tels que |xj − xj−1 | + |yj − yj−1 | = 1, 1 ≤ j ≤ n + 1, où on prends (x0 , y0 ) = (xd , yd ) et (xn+1 , yn+1 ) = (xf , yf ). Plus précisément, pour un paramètre convenable H (“hauteur de l’eau”), 0 ≤ H ≤ 255, on calcule la composante connexe contenant (x∗ , y∗ ) de l’ensemble {(x, y) : zxy < H}. On désignera cette composante connexe par CCH ⊂ Z2 (la dépendance de (x∗ , y∗ ) sera supprimée de la notation). On appelle le niveau critique Hcr (“hauteur critique”) la valeur de H minimale pour laquelle CCH contient un des points au bord de l’image, i.e. un point (x, y) avec x = 0 ou y = 0 ou x = 600 ou y = 600. On prend donc CCHcr −1 comme une approximation de la forme de la cavité. Étant donnée un valeur de H et un point initial (x∗ , y∗ ), on peut calculer l’ensemble CCH au moyen d’un algorithme standard de programmation dynamique, voir fr.wikipedia.org/wiki/Programmation dynamique. Pour chercher le niveau critique Hcr nous avons exploré par dichotomie le segment [0, 255] des valeurs possibles de H. Une proposition de raffinement. Cet approche marche bien pour les données simulées que nous avons reçues de l’entreprise. Dans une situation plus réaliste on peut imaginer une cavité entourée d’un région plus basse que la surface du corps ; une section verticale d’une telle situation est montrée sur la Fig. 4. Figure 4 – Un cas où CCHcr surestime la taille de la cavité chirurgicale. Pour éviter ce genre d’effets, nous proposons de calculer et de noter une nombre suffisant de paires (Hj , ]CCHj ), où ](·) désigne le nombre des éléments d’un ensemble. Nous nous attendons à ce que le comportement des (Hj , ]CCHj ) suive le comportement indiqué dans la figure 5. Un 7 Figure 5 – Détection d’un bord plus bas que le reste du tissu : comportement attendu de la hauteur en fonction de la taille de la composante connexe correspondante. tel comportement rendrait raisonnable l’approximation (régression statistique) par une fonction linéaire par morceaux : ( 0 , ]CCH ∼ k1 H + b1 , H < Hcr 0 , ]CCH ∼ k2 H + b2 , H ≥ Hcr 0 à déterminer, soumis à la contrainte k H 0 + b = k H 0 + b . à cinq paramètres k1 , b1 , k2 , b2 , Hcr 2 1 2 cr 1 cr 0 −1 donne une approximation plus précise de la forme de la cavité Nous attendons que CCHcr que CCHcr . En l’absence de données réalistes, nous n’avons pas testé cette approche. 4 Cas d’une cavité à bord incliné, sans ombre Selon le représentant de l’entreprise, l’angle entre l’axe de la caméra et la surface du corps (hors de la cavité) peut dévier jusqu’à 30 degrés de l’angle droit. En ce cas notre méthode du niveau critique exposée dans Sec.3 sous-estimera la taille de la cavité (voir Fig. 6). L’idée immédiate est de faire tourner le corps (numériquement) de 20◦ en chacune des quatre directions gauche bas droite haut, estimer CCHcr pour les quatre images transformées, et prendre la réunion des quatre ensembles (proprement transformés). Un procédé à peu près équivalent mais beaucoup moins coûteux est d’effectuer une transformation affine z(x, y) 7→ z(x, y) + ε1 sin 20◦ x + ε2 sin 20◦ y, où (ε1 , ε2 ) parcourt les quatre valeurs (1, 0), (0, 1), (−1, 0), (0, −1). La réunion des quatre ensembles CCHcr ainsi calculés nous donnera l’approximation de la cavité opératoire. Un inclinaison de 20◦ pour la transformation affine est une possibilité raisonnable. 8 Figure 6 – Cas où la cavité est inclinée. L’algorithme risque de sous-estimer la taille de la cavité. 5 5.1 Mise en oeuvre de l’algorithme d’identification des cavités Algorithme de construction de la composante connexe d’un point vérifiant un critère donné Soit f (p) une fonction booléenne qui à un pixel associe vrai si le critère est vérifié et faux sinon. L’algorithme suivant construit la composante connexe (CC) contenant un point p0 vérifiant le critère fixé : #initialisation si f(p0) est faux la composante connexe est vide arrêt de l’algorithme sinon, ajouter p0 à la CC marquer p0 ajouter ses voisins à la liste des points à visiter les marquer fin si #boucle sur le voisinage tant que la liste des points à visiter n’est pas vide : choisir un point p le retirer de la liste si f(p) ajouter p à la CC ajouter ses voisins non marqués à la liste des points à visiter les marquer sinon continuer 9 fin si fin tant que Le coût de cet algorithme est linéaire par rapport au nombre de pixels. 5.2 Identification de la cavité Nous supposons qu’un point à l’intérieur de la cavité est connu ; pour fixer les idées, le milieu de l’image (ce qui reste cohérent par rapport à une utilisation en conditions réelles, dans la mesure où le chirurgien place la lampe de manière à ce qu’elle éclaire la cavité). Nous expliquons plus loin comment lever cette limitation. Comme expliqué précédemment, la méthode consiste à identifier le niveau hmax à partir duquel un liquide déborderait de la cavité. Soit z(p) la profondeur correspondant à un pixel (donnée fournie directement par la kinect) et h une hauteur fixée ; nous utilisons le critère suivant pour le calcul de la composante connexe : ( fh (p) = vrai f aux si z(p) < h sinon Dans notre contexte, nous considérons que la cavité “déborde” à une hauteur donnée h lorsque la composante connexe CCh obtenue avec le critère fh (p) touche le bord. La hauteur est un entier de l’intervalle [0, 255] (avec les données fournies) et la hauteur limite hmax vérifie CChmax +1 touche le bord, et CChmax ne touche pas le bord. Une illustration de cette méthode est donnée dans la section suivante. La hauteur hmax est déterminée par une méthode de dichotomie, en partant de l’intervalle [z(p0 ), 255] ; il est tout à fait possible que hmax ne soit pas définie, dans le cas où la composante connexe CCz(p0 ) touche déjà le bord. Dans ce cas, il faut déterminer un autre point initial. Nous avons choisi de parcourir aléatoirement un voisinage du point initial ; pour cela nous avons utilisé la fonction rand() de la librairie standard C++ (http://www.cplusplus.com/reference/cstdlib/rand/). 5.3 Premiers résultats Pour des raisons légales, il n’est pas possible pour l’instant de réaliser des cartes de profondeur à partir de la kinect sur de vraies tables d’opérations, aussi, Maquet nous a-t-il fourni une batterie de cas-tests (Fig. 7) où varient un certain nombre de paramètres : — l’orientation du plan dans lequel se situe la cavité par rapport à la caméra — la présence d’une serviette rouge à l’intérieur de la cavité (pour imiter des organes qui dépasseraient de la cavité) — la présence d’instruments sur le bord de la cavité — l’aspect plus ou moins désordonné du pourtour de la cavité Commen cons par illustrer la méthode sur un premier cas test (Fig. 8) : la méthode de dichotomie donne hmax = 237 et effectivement, la composante connexe CC238 touche le bord mais pas la composante connexe CC237 . Cette méthode appliquées à tous les autres cas-tests donne des résultats satisfaisants (Fig. 9) : la taille de la composante connexe est toujours de l’ordre de la taille de la cavité, ce qui est une information suffisante pour notre application. 5.4 Amélioration des résultats Pour améliorer ces résultats, nous appliquons la méthode exposée en Sec.4, qui consiste à appliquer une transformation affine à la carte de profondeur de manière à “rectifier” son 10 Figure 7 – Cas-tests fournis par Maquet. Images dans le champ visible. Figure 8 – Illustration de la méthode : à gauche la composante connexe CC237 , à droite la composante connexe CC238 qui touche le bord. On identifie ainsi hmax = 237 et la cavité est identifiée comme la composante connexe CChmax . orientation par rapport à l’axe de la caméra, ce qui est illustré dans la Fig. 10. Ici, l’axe de rotation et l’angle sont déterminés à la main, on peut envisager une procédure automatique pour les fixer de manière optimale. On peut également envisager simplement d’effectuer quatre rotations suivant les deux axes x et y, de ±20◦ . 6 Traitement des ombres Le retrait des artefacts de l’image est un problème abondamment étudié, voir par exemple http://en.wikipedia.org/wiki/Inpainting. Dans le cas présent, le coût de calcul doit être suffisamment faible pour que l’algorithme se termine en moins d’une seconde, ce qui nous a amenés à essayer les algorithmes les plus simples possibles au détriment de la fidélité aux détails de l’image initiale. Nous supposons que la kinect renvoie une valeur en niveaux de gris pour les zones où elle 11 Figure 9 – Identification de la cavité : en rouge, la composante connexe CChmax (voir texte), superposée à la carte de profondeur donnée par la kinect. arrive à mesurer la profondeur, et trois valeurs différentes en RGB (en pratique, cette couleur est brun vert foncé), ce qui permet à l’algorithme de détecter automatiquement les zones d’ombre. Une approche possible serait de remplacer une valeur z(x, y) =indéfini par la valeur z(x0 , y 0 ), où (x0 , y 0 ) est le pixel le plus proche de (x, y) parmi les pixels hors de l’ombre, c’est-à-dire, ayant z(x0 , y 0 ) <indéfini. Cependant cette approche mettrait une partie importante de l’ombre (proche de la région de l’image moins profonde) hors de la cavité, alors qu’on s’attend à ce que la région de l’ombre appartienne en réalité á la cavité. L’algorithme que nous avons mis en place consiste à parcourir successivement les lignes de l’image, et à remplacer les zones d’ombre par le minimum des valeurs de profondeur les plus proches (Fig. 11). C’est-à-dire, si zl+1,y = ... = zr−1,y = +∞ mais zl,y , zr,y < +∞, on redéfinit zl+1,y , ..., zr−1,y comme min{zl,y , zr,y }. Cela peut conduire à des artefacts dans les cas où l’ombre est orientée horizontalement, dans la direction des lignes de l’image, Fig. 2 : il y aurait alors le risque que l’algorithme propage artificiellement une profondeur basse, ce qui aurait comme conséquence de perturber l’algorithme de recherche de la cavité (penser à un canal sortant de la cavité : il serait alors impossible de la remplir, voir Fig.2). Une première possibilité est de parcourir l’image dans deux directions différentes (par exemple suivant les lignes et suivant les colonnes), à appliquer la méthode précédente, puis à prendre le maximum des valeurs obtenues pour remplacer l’ombre. Ainsi on échapperait au risque de “creuser” un canal dans la cavité, mais on perdrait en précision sur la position du bord de la cavité. Une deuxième solution est basée sur l’idée suivante : si on est capable d’identifier la direction principale d’une zone d’ombre, en parcourant l’image dans la direction perpendiculaire, on évitera le problème évoqué plus haut. D’un point de vue pratique, on pourrait adapter notre algorithme de recherche de composante connexe pour identifier chaque zone d’ombre, puis d’en identifier la direction principale (par exemple en identifiant la meilleure ellipse au sens des moindres carrés). Enfin, on pourrait faire appel à des méthodes plus sophistiquées qui exploitent non seulement 12 Figure 10 – Effet de l’application de la transformation affine f (i, j) = 0.05(N/2 − i) sur une des images : à gauche, on a appliqué l’algorithme présenté à la Sec.3 sans la transformation ; à droite avec la transformation. Ici, i est le numéro de ligne dans l’image, N est le nombre de pixels dans la direction verticale, donc N/2 − i correspond à une ordonnée qui vaudrait zéro au milieu de l’image. Ainsi, cette transformation va faire “remonter” le haut de l’image, de manière à faire basculer le liquide vers les parties de la cavité qui n’étaient pas atteintes par la composante connexe. Figure 11 – Exemple d’application de l’algorithme de suppression des ombres à partir de cartes de profondeur venant de la kinect ; l’image est parcourue ligne par ligne (voir texte). Haut : images originales ; bas : images transformées. une image statique, mais une séquence temporelle d’images ; ce type de méthode a été mis en place pour la kinect, par exemple dans le projet https://code.google.com/p/kinect-depth-map-inpainting-and-filtering/ 13 7 Conclusion et perspectives L’objectif de ce travail, qui s’est déroulé dans le cadre de la 8ème Semaine d’études MathsEntreprise, est de développer un outil permettant de détecter la cavité opératoire lors d’une opération chirurgicale. La localisation en espace de cette cavité permet de l’éclairer d’une manière optimale en modifiant l’intensité et la forme du faisceau lumineux projeté sur la plaie chirurgicale. En utilisant les images issues d’un Kinect et qui représentent la carte de profondeur de la plaie opératoire, nous avons développé un algorithme permettant de détecter le bord de la cavité opératoire. L’idée de cet algorithme, basé sur la programmation dynamique et que nous avons codé en C++, est de remplir la cavité d’eau jusqu’au niveau où l’eau commence à déborder. Le niveau de l’eau juste avant de déborder est notre représentation de la forme de la cavité. Nous avons appliqué cet algorithme sur des images fournies par l’entreprise Maquet et qui imitent les vraies tables d’opérations. Les résultats obtenus sont très satisfaisants dans le cas où dans les images issues de Kinect ne figurent pas des ombres. Afin de traiter les zones d’ombres dans les images de Kinect, nous avons mis en place un algorithme qui permet de traiter les zones d’ombres. Cet algorithme consiste à parcourir successivement les lignes de l’image et à remplacer les zones d’ombre par le minimum des valeurs de profondeur les plus proches. L’algorithme que nous avons développé nécessite un point initial qui se trouve à l’intérieur de la cavité. Il serait intéressant de pouvoir initialiser le programme avec un point quelconque de l’image. Par ailleurs et afin de mieux gérer les ombres, il est possible d’améliorer l’algorithme présenté la section 6 en utilisant des méthodes basées sur le filtrage et le traitement d’image. 14