2017-03-19 2 views
1

Pour des raisons de compréhension, je veux implémenter un algorithme stéréo en Python (et Numpy), qui calcule une carte de disparités. En tant que données d'image, j'ai utilisé l'ensemble de données d'images Tsukuba de Middlebury *. Pour plus de simplicité, je choisis normalised cross correlation (NCC) ** comme mesure de similarité pour trouver des pixels de correspondance. Je vais supposer un accord scanline. Voici ma mise en œuvre de la CCN:Cartes de disparité avec corrélation croisée normalisée utilisant Python

 left_mu = np.mean(left_patch) 
    right_mu = np.mean(right_patch) 
    left_sigma = np.sqrt(np.mean((left_patch - left_mu)**2)) 
    right_sigma = np.sqrt(np.mean((right_patch - right_mu)**2)) 
     patch = left_patch * right_patch 
      mu = left_mu * right_mu 

      num = np.mean(patch) - mu 
     denom = left_sigma * right_sigma 
      ncc = num/denom 

où le left_patch et right_patch sont des patchs 3x3 à partir des images originales. Cela génère des entiers compris entre -1 et 1, ce qui décrit la similarité entre deux pixels. L'idée est maintenant de trouver le pixel le mieux adapté. La disparité entre les deux pixels devrait maintenant être stockée dans une nouvelle image - la carte de disparité. Depuis que j'ai supposé l'accord scanline, je dois seulement chercher dans une rangée d'images. Pour chaque pixel de la ligne, je veux prendre l'indice de la valeur qui maximise la valeur NCC et la stocker comme valeur de disparité. Mon problème est maintenant, que mes résultats sont plutôt bizarres. Mes valeurs de disparité sont autour de 180-200 pixels pour une image de 384x288 pixels. Here l'image résultante.

Pouvez-vous voir l'erreur dans ma pensée?

(*) vision.middlebury.edu/stereo/data/scenes2001/data/anigif/orig/tsukuba_o_a.gif

(**) Procédé de corrélation en deux étapes d'estimation de la profondeur stéréoscopique. - N. Einecke et J. Eggert

+0

le résultat semble assez bizarre, en fait: P – kmario23

Répondre

0

Il semble que vous n'avez pas calculé correctement le numérateur. Il devrait être:

num = np.mean((left_patch - left_mu) * (right_patch - right_mu)) 
+0

Les expressions sont équivalentes. Vous pouvez prendre des attentes à votre expression et en raison de la linéarité des attentes, il évaluera à np.mean (left_patch * right_patch) - left_mu * right_mu. Vous pouvez également le vérifier expérimentalement. Il pourrait y avoir une légère différence dans le résultat en raison de la stabilité numérique, mais il ne peut pas causer ce problème. – Kochoba