Skip to main content

Points d'intérêts

Cours

Comment décrire les points d'intérêts ?

  • Descripteur de type patch (liste des intensités) autour du point d'intérêt. Mais, un patch n'est pas robuste à la rotation, au changement d'échelle, d'illumination ou de point de vue. Sauf si on l'impose.
  • Rotation : tourner le patch dans l'axe d'orientation principale
  • Échelle : trouver la bonne échelle grâce à la pyramide LoG et remettre le patch dans une taille nomralisée
  • Illumination : normaliser le patch
  • Point de vue : considérer que le patch a suffit une transformation affine, trouver les orientations et transformer le patch

Descripteur à base d'histogrammes

Calculer l'histogramme des orientations des gradients d'intensités. Le pic dans l'histogramme donne l'orientation princiaple. Ramener le patch vers l'orientation principale, compensation de l'orientation.

Appariement de points

On a les points d'intérêts, les descripteurs associés : comment les matcher ? Nous pouvons utiliser la méthode d'appariement des points. Soit un descripteur f1f_1 dans I1I_1, trouver le meilleur correspondant f2I2f_2 \in I_2.

  • Définir la distance d(f1,f2)d(f_1, f_2)
  • Tester tous les fI2f \in I_2 (ou dans un voisinage) et sélecttionner celui qui minimisent dd ou d(f1,f2)Sd(f_1,f_2) \leq S, SS un seuil.

Cependant une bonne distance peut donner un mauvais appariement. Une autre approche est de

  • calculer r=d(f1,f2)d(f1,f2)r = \dfrac{d(f_1,f_2)}{d(f_1, f_2')}f2f_2' est le second plus proche
  • des valeurs faibles de rr signifie des matchs ambiguës donc à rejeter

Estimation d'homographie avec RANSAC

Soit p2Hp1p_2 \propto H_{p_1} avec Ĥ^la matrice de transformation (projective) p1=(x1y11);p2=(x2y21);H=(H1H2H3H4H5H6H7H8H9)p_1 = \begin{pmatrix} x_1 \\\\ y_1 \\\\ 1 \end{pmatrix} \\; p_2 = \begin{pmatrix} x_2 \\\\ y_2 \\\\ 1 \end{pmatrix} \\; H= \begin{pmatrix} H_1 & H_2 & H_3 \\\\ H_4 & H_5 & H_6 \\\\ H_7 & H_8 & H_9 \end{pmatrix}

Utiliser RANSAC : choisir kk un nombre d'itérations tant que k>0k > 0 :

  • sélectionner 4 points appariés aléatoirement
  • calculer la matrice de transformation HH entre ces points
  • construire l'ensemble de inliers tel que SSD(p2,Hcurrp1)SSSD(p_2, H_{curr}p_1) \leq S
  • si l'erreur commise est inférieur aux autres HH trouvés H=HtextcurrH=H_{textcurr}
  • stocker les inliers

Le max des inliers est la solution du problème.

La transformée de Hough

  • Soit p=(x,y)p = (x,y) différentes droites (y=mx+b)(y=mx + b) peuvent passer par pp. Ceci est équivalent à avoir différents couples (m,b)(m,b)
  • La transformée de Hough permet de trouver les lignes qui intersectent le plus de points possibles.

L'algorithme de Hough est le suivant : initialiser HH à zéro

  • pour tout point de contour ρ=(x,y)\rho = (x,y) dans II
    • pour tout θ[θmin,θmax]\theta \in [\theta_{min}, \theta_{max}], calculer ρ=x.cos(θ)+y.sin(θ)\rho = x.\cos(\theta) + y.\sin(\theta) et H(ρ,θ)=H(ρ,θ)+1H(\rho, \theta) = H(\rho, \theta) + 1
  • Trouver les (ρ,θ)(\rho, \theta)H(ρ,θ)H(\rho, \theta) est un maximum local
  • La ligne détectée est donnée par ρ=x.cos(θ)+y.sin(θ)\rho = x.\cos(\theta) + y.\sin(\theta)

Détecteur de Harris

x,yPw(x,y)(u.Ix+v.Iyu.v.Iy)2(uv)M(uv)\sum \limits_{x,y \in P} w(x,y)(u.I_x + v.I_y - u.v.I_y)^2 \equiv \begin{pmatrix} u & v \end{pmatrix} M \begin{pmatrix} u \\\\ v \end{pmatrix} avec M=x,yPw(x,y)(Ix2IxIyIxIyIy2)M = \sum \limits_{x,y \in P} w(x,y) \begin{pmatrix} I_x^2 & I_x I_y \\\\ I_x I_y & I_y^2 \end{pmatrix}

MM est symétrique donc décomposable en vecteur / valeur propres

M=(Ix2IxIyIxIyIy2)=(ABBC)(λ100λ2)M = \begin{pmatrix} I^2_x & I_x I_y \\\\ I_x I_y & I^2_y \end{pmatrix} = \begin{pmatrix} A & B \\\\ B & C \end{pmatrix} \rightarrow \begin{pmatrix} \lambda_1 & 0 \\\\ 0 & \lambda_2 \end{pmatrix}

  • Les valeurs propres λ1\lambda_1 et λ2\lambda_2 donnent des informations sur les courbures principales
  • Les vecteurs propres donne des informations sur des directions de courbure principales
  • Coefficient RR de Harris R=λ1λ2k(λ1+λ2)2=det(M)k(trace(M))2;k[0.040.15]R = \lambda_1\lambda_2 - k(\lambda_1 + \lambda_2)^2 = det(M) - k(trace(M))^2; k \in [0.04 0.15]
  • Interprétation de RR :
    • R0R \geq 0 : au voisinage d'un coin
    • R<0R < 0 : au voisinage d'un contour
    • R=0R = 0 : dans une zone homogène
  • Harris est robuste à la rotation mais pas à l'échelle

Mise en pratique

panorama <ims-name-1> <ims-name-2>

Écrire le programme panorama.cpp

  • ce programme permet de charger deux images données en paramètre <ims-name-1> et <ims-name-2>
  • les images sources sont en couleur mais la plupart des traitements se font en niveaux de gris
  • le programme permet de réaliser un panorama à partir des 2 images sources
  • le programme affiche les étapes intermédiaires
  • les étapes sont les suivantes :
    • détecter les points d'intérêts avec les descripteurs SURF, afficher les descripteurs
    • appariement des points d'intérêts, via une méthode "brute force" et déterminer les good matches via par exemple un seullage. Afficher les appariements
    • estimer l'homographie HH via RANSAC, afficher l'image déformée via l'estimation
    • construire et afficher le panorama final
  • regarder la documentation d'opencv sur les features2D
  • certaines classes et fonctions peuvent être utiles
  • il peut être nécessaire d'inclure des éléments du module nonfree d'opencv

hough-lines <ims-name> <th-mag>

Écrire le programme hough-lines.cpp

  • ce programme permet de charger une image donnée en paramètre <ims-name>
  • l'image est considérée en niveaux de gris (représentant les contours d'une image)
  • le programme permet de mettre en oeuvre la transformée de Hough
  • le paramètre <th-mag> permet de seuiller les valeurs de l'image en entrée et de ne pas considérer tous les pixels comme étant des pixels de contour dans le calcul de la transformée
  • le programme afficher les étapes intermédiaires : l'accumulateur de Hough, les lignes détectées, l'image finale
  • afin de ne pas considérer toutes les lignes détectées, on pourra trouver un moyen de seuiller l'accumulateur de Hough afin d'obtenir les maxima locaux de l'accumulateur