Projet de traitement d'image - SI 381 reconstitution 3D d'intérieur à partir de photographies Régis Boulet Charlie Demené Alexis Guyot Balthazar Neveu Guillaume Tartavel Sommaire Sommaire... 1 Structure de notre projet... 1 Détection des paramètres des caméras... 2 Stéréovision... 2 Principe : mesure de disparité = profondeur...2 Coordonnées 3D à partir de la disparité...2 Remarques... 3 Calcul des disparités... 4 L'appariement par corrélation... 4 Post-filtrage médian... 6 Validation par aller-retour... 7 Passage en géométrie épipolaire...8 Propriétés à respecter... 8 Ré-échantillonnage d'une image...9 Résultats... 10 Scène initiale... 10 Géométrie épipolaire... 12 Cartes de disparités et validation... 12 Nuage de point obtenu... 13 Précision de la reconstruction... 14 Code MATLAB... 14 Détection de plans dans un nuage de points 3D... 15 Reconstruction 3D... 15 Structure de notre projet
Détection des paramètres des caméras Stéréovision La génération d'une scène 3D à partir des photos est effectuée par stéréovision sur des couples d'images. Ceci suppose un traitement préalable permettant d'estimer les positions des prises de vues, ainsi que les directions de visée et paramètres d'ouvertures. Cette précédente étape n'ayant pas été suffisamment développée ni suffisamment concluante dans notre projet, les images utilisées dans cette partie sont des images de synthèse, générées avec Blender. Cette partie se décompose en quatre points : le principe de la stéréovision : retrouver la position 3D d'un point à partir d'une mesure de disparité ; le calcul des disparités en chaque point, par corrélation entre deux images en géométrie épipolaire ; le passage de deux images quelconques à des images en géométrie épipolaire ; les résultats sur nos images de synthèse. Principe : mesure de disparité = profondeur La stéréovision repose sur le principe suivant : en observant une scène depuis deux points de vue différents (nos deux yeux par exemple) et en comparant la position d'un objet sur chacune des deux images obtenues, on peut en déduire la profondeur à laquelle il se trouve. Coordonnées 3D à partir de la disparité La figure 2.1 illustre ce principe : en déplaçant la caméra latéralement du point au point, le point passe de la position à la position sur l'écran. Ce déplacement relatif d'une distance vers la gauche (matérialisé par le trait horizontal bleu) est appelé disparité, et nous permet de calculer la position du point.
Figure 2.1 : positions et d'un point sur les deux images prises depuis et. En effet, dans le cas où le déplacement de l'appareil photo est orthogonal à la direction de visée, les images de la scène sont prises dans un même plan (comme sur la figure 2.1) : on parle alors de géométrie épipolaire. Dans ce cas, les vecteurs (appelé base) et sont donc colinéaires. Le théorème de Thalès nous donne la relation suivante, en utilisant des distances signées (sur ou selon le cas) : En utilisant les relations et (la disparité est ici négative, car se déplace "vers la gauche"), il vient : D'où on en déduit la position du point : Remarques Cette expression donne la position du point en 3D à partir de sa position dans l'image, de la position du plan de l'image, de la base et de la disparité pour ce point. Toutefois, la disparité étant en pratique calculée comme un nombre de pixel (donc un entier), la position du point est échantillonnée selon une séquence de plans parallèles au plan de l'image. Cette conséquence fâcheuse est bien visible sur la figure 2.2 qui en montre un cas pathologique : le mur du fond est échantillonné en 6 plans. Il en est de même pour les objets dans la scène, ainsi que pour le sol qui donne une idée de la position de prise de vue.
Figure 2.2 : échantillonnage des profondeurs des points obtenus. La distance entre deux plans d'échantillonnage successifs augmente avec la profondeur, et dépend également de la base (voir l'expression précédente) : plus la base est petite et plus cette distance est élevée (pour la figure 2.2, la base était particulièrement petite). À l'inverse, les plans seront proches pour une base plus élevée, mais l'étape de calcul des disparités sera plus longue (recherche de dans un intervalle plus grand) et donnera moins de points corrects (car les images seront déformées du fait que les caméras sont plus espacées). Calcul des disparités Nous venons donc de calculer la position 3D d'un point en connaissant sa position dans les deux images. Il va maintenant falloir trouver, pour notre couple d'images, les couples de points correspondants : cette étape porte le nom d'appariement de points. Dans toute cette partie, nous travaillons avec des images qui sont déjà en géométrie épipolaire. Le passage d'une géométrie quelconque à une géométrie épipolaire sera détaillé dans la partie suivante. Cette étape d'appariement va se décomposer en trois : l'appariement à proprement parler, par corrélation, qui nous donnera une carte de disparités (la disparité en chaque pixel) ; un post-filtrage, pour diminuer le nombre de points aberrants ; une étape de validation, pour éliminer les points de disparité erronée. L'appariement par corrélation L'étape d'appariement à proprement parler va consister à construire, à partir d'une des deux images, une carte de disparité : cette carte nous donnera la disparité de chaque point de cette image (c'est à dire son décalage par rapport au point correspondant dans l'autre image). En reprenant les notations de la figure 2.1, cela revient à considérer chaque pixel de l'une des images comme un point, de rechercher le point correspondant dans l'autre image, et d'associer au pixel la valeur de ainsi obtenue. Cela nous donne donc une image avec les valeurs de prises en chaque pixel de l'image initiale.
Figure 2.3 : la recherche de associé à se fait sur un segment. La recherche de ne se fait pas dans toute l'image : étant données une profondeur minimale et une profondeur maximale, on en déduit une disparité minimale et une maximale par la formule liant disparité et profondeur (partie précédente). De plus, du fait de la géométrie épipolaire, on sait que le point associé à se trouvera sur la même ligne que ce dernier, comme l'illustre la ligne horizontale sur la figure 2.1. On sait donc que est à chercher dans un petit segment horizontal sur la seconde image, comme l'illustre la figure 2.3. Le point retenu est alors celui qui maximise un critère de ressemblance entre et : nous avons choisi comme critère la classique corrélation (centrée normée) entre les voisinages de ces deux points. En pratique, afin de diminuer le temps de calcul (assez conséquent en Matlab), les images sont au préalable filtrées (passe-bas) et décimées, afin de diminuer le nombre de points à appareiller.
Figure 2.4 : un auto-stéréogramme, image respectant par nature la géométrie épipolaire. Post-filtrage médian Une fois la carte de disparité obtenue, nous appliquons un léger filtre médian afin de réduire le nombre de valeurs aberrantes. En effet, la profondeur dans une image (et par conséquent la disparité) varie de manière continue par morceaux : on n'a jamais un point tout seul à une profondeur très différente de tout ses voisins. C'est pourquoi nous appliquons un filtrage médian à la carte de disparité. La figure 2.5 montre le gain apporté par cette méthode : la carte de disparité utilisée est calculée à partir de l'autostéréogramme en figure 2.4 (le choix d'un auto-stéréogramme vient du fait que la géométrie est déjà épipolaire, car une telle image est prévue pour être regardée de face).
Figure 2.5 : effet d'un (fort) filtrage médian sur les cartes de disparités. (les images ayant été égalisées différemment, les couleurs ne correspondent pas) Validation par aller-retour Afin d'éliminer les points aberrants restants, une méthode classique consiste à utiliser une validation "par aller-retour". Cette technique fonctionne de la manière qui suit. On part d'un point de la première image, et on recherche le point associé dans la seconde image (association déjà calculée et stockée dans la carte de disparité de la première image). On va ensuite effectuer le "retour" en recherchant dans la première image le point associé à (dans la carte de disparité de la seconde image). Normalement, les associations de points se font par paires valide pas., la paire est donc correcte et on valide l'association. Dans le cas contraire, on ne : si
Figure 2.6 : cartes de disparités (en haut) et point valides (en bas, couleur noire) pour les deux images. La figure 2.6 montre cette validation dans le cas de l'auto-stéréogramme en figure 2.4. Sur cet exemple, la plupart des points qui ne sont pas valides sont ceux masqués par l'effet de relief. Passage en géométrie épipolaire Les deux parties précédentes expliquaient comment passer d'un couple d'images en géométrie épipolaire à une carte de disparité, et d'en extraire un nuage de point. L'étape manquante pour généraliser cette méthode est le ré-échantillonnage d'un couple d'images quelconques pour passer en géométrie épipolaire : c'est l'objet de cette partie. Propriétés à respecter La première condition est bien visible sur la figure 2.1 : étant donnés les centres optiques et des caméras, il faut que pour tout point de l'espace, le plan intersecte les plans des images selon deux droites parallèles (les droites épipolaires) : il faut donc re-projeter les images dans un plan parallèle à. Notons qu'on pourrait utiliser une autre forme
qu'un plan comme support de projection afin de minimiser certaines déformations, mais par soucis de simplicité, nous nous contenterons d'un plan. De plus, pour simplifier la correspondance, on demande à ce que ces droites soient horizontales dans les images ré-échantillonnées (comme sur la figure 2.3). Cette contrainte nous fixe l'orientation des images dans cette nouvelle géométrie. Les deux paramètres qui restent à déterminer sont : l'orientation du plan de re-projection (qui est libre de tourner autour de ) ; la résolution de l'image ré-échantillonnée. Le premier point pourrait être amélioré en choisissant un critère de déformation à minimiser. Ré-échantillonnage d'une image Une fois le plan de projection fixé, il reste à projeter les deux images initiales sur ce plan et à ré-échantillonner le résultat afin d'obtenir une image exploitable. La figure 2.7 illustre cette projection : elle consiste à calculer la couleur de chaque point du plan de re-projection, connaissant la couleur des points du plan. Figure 2.7 : projection sur le plan respectant la géométrie épipolaire à partir de l'image initiale dans le plan. Partant d'un point sur une grille dans le plan de re-projection, notre but est de trouver la couleur du point correspondant dans le plan initial de l'image. Pour cela, basons-nous sur la figure 2.7 en vue "de dessus", dans laquelle est le vecteur entre le centre de la caméra et le centre de l'écran. Le théorème de Thalès nous donne le rapport de distances suivant : Une projection orthogonale nous donne l'expression du vecteur :
On déduit alors de ces expressions la position du point recherché : En notant et les bases respectives des grilles d'échantillonnage des deux plans, on trouve le point associé à un pixel de l'image re-projetée par : Inversement, la position du pixel correspondant au point dans l'image initiale est obtenue par projection orthogonale dans de : La couleur de ce point est alors obtenue par interpolation bilinéaire, les valeurs entières. n'étant pas Ceci nous permet d'obtenir, pour chacune des deux images, un ré-échantillonnage en géométrie épipolaire, et d'appliquer alors la méthode d'appariement précédente. Résultats Voici des images obtenues par notre implémentation de la stéréovision, obtenues sur un cube généré sous Blender. La stéréovision est effectuée sur deux couples de caméras : deux caméras sont situées d'un côté, et les deux autres de l'autre côté du cube, de sorte que toutes les faces soient à peu près visibles. Le cube est centré et ses faces sont positionnées sur les plans dont l'une des composantes est constante égale à. Scène initiale
Images initiales : 2 couples d'images, montrant en tout les 6 faces du cube. Image de la scène 3D. L'objet d'intérêt est le cube en noir. Les points de couleur représentent les centres des caméras. Les deux plans de couleur sont les écrans de deux des caméras.
Géométrie épipolaire Images en géométrie épipolaires : les lignes horizontales se correspondent dans les images. Cartes de disparités et validation Cartes de disparités des images. Disparités validées par aller-retour (en bleu).
Cartes de disparités (points validées uniquement). Nuage de point obtenu Nuage de points 3D obtenu.
Précision de la reconstruction Afin de mesurer la précision, j'ai calculé la norme infinie de chacun des points obtenus. Notons que le cube d'origine est l'ensemble des points de norme infinie égale à. Le centre du cube est le point de norme, et les caméras sont à une distance de unités environ. On note la présence de quelques points aberrants restants, peu nombreux. La très grande majorité des points sont bien sur le cube (norme très proche de ). Normes infinies des points. Code MATLAB Histogramme des valeurs des normes infinies. L'imprécision est d'à peine 0.5% de la distance aux caméras. Voici des fichiers de test proposés, présents soit dans le dossier "Stéréovision", soit dans le sous-dossier "Code" : LaunchMe.m : exemple du cube de la partie précédente, avec 4 images (2 couples) ;
LaunchExamples.m : le cube (avec 2 images) et la scène de la figure 2.2 (avec 2 images initialement en géométrie épilolaire) ; LaunchAppariement.m : l'auto-stéréogramme de la figure 2.4, avec affichages intermédiaires ; LaunchStereo1.m, puis LaunchStereo2.m : le cube (avec 2 images), avec affichages intermédiaires. Détection de plans dans un nuage de points 3D Reconstruction 3D