2

J'ai trouvé une implémentation Matlab de l'algorithme LKT here et elle est basée sur l'équation de constance de luminosité.Flux optique Lukas Kanade: Comprendre les maths

L'algorithme calcule les dégradés d'image dans les directions x et y en convolvant l'image avec des opérateurs de gradient de bord horizontaux et verticaux 2x2 appropriés. L'équation de la constance de luminosité dans la littérature classique a de son côté droit la différence entre deux trames successives. Cependant, dans la mise en œuvre référencée par le lien précité, le côté droit est la différence de convolution.

It_m = conv2(im1,[1,1;1,1]) + conv2(im2,[-1,-1;-1,-1]); 

Pourquoi ne pouvait It_m être simplement calculée comme suit:

it_m = im1 - im2;  
+0

Cela vous prendra une minute pour vérifier que 'conv2 (x, [1,1; 1,1])' est différent de 'x'. – MBaz

+0

Faites-vous référence à cette ligne? It_m = conv2 (im1, uns (2), 'valide') + conv2 (im2, -ones (2), 'valide'); Notez qu'il s'agit simplement d'un lissage spatial 2D et que la taille de It_m résultante est identique à celle des matrices Ix_m et Iy_m (car elles sont traitées avec conv2 avec un noyau 2x2 et une option "valide"). –

+0

@MBaz Je ne pense pas que sa confusion soit à propos de conv2 (x, [1,1; 1,1]) étant différent de x. Je soupçonne que la question est pourquoi utiliser cette convolution du tout et pas seulement calculer le temps dérivé par pixel sur les deux images. –

Répondre

0

(. Commentaires convertis en une réponse)

En théorie, il n'y a rien de mal à prendre une différence au niveau des pixels:

Im_t = im1-im2; 

pour calculer la dérivée temporelle. L'utilisation d'un lissage spatial lors du calcul de la dérivée temporelle atténue l'effet du bruit.

De plus, en regardant la façon dont code calcule les dérivés spatiale (x et y):

Ix_m = conv2(im1,[-1 1; -1 1], 'valid');

calcul de la dérivée temporelle avec un noyau similaire et l'option valid assure les matrices It_x, It_y et Im_t avoir des tailles compatibles.

2

Comme vous l'avez mentionné, en théorie seulement pixel par différence de pixel est indiqué pour le calcul de flux optique. Cependant, en pratique, toutes les images naturelles (et non synthétiques) contiennent un certain degré de bruit. D'un autre côté, la différenciation est une sorte de filtre passe-haut qui accentuerait le rapport de bruit (passe-haut) au signal. Par conséquent, pour éviter les artefacts causés par le bruit, un lissage d'image (ou un filtrage passe-bas) est généralement effectué avant toute différenciation d'image (nous avons également un processus de détection de contour). Le code fait exactement cela, c'est-à-dire applique et déplace le filtre moyen sur l'image pour réduire l'effet de bruit.

It_m = conv2(im1,[1,1;1,1]) + conv2(im2,[-1,-1;-1,-1]); 
+0

Merci MimSaad pour la clarté sur les sujets de filtrage. Upvoted votre réponse. – Raj

+0

Je suis content que ça a aidé! – MimSaad

+0

La réduction du bruit est importante, mais même si vous avez une image totalement sans bruit, des différences de 2 pixels donneront des erreurs dans la sortie du flux optique final. Voir ma réponse ci-dessous pour plus de détails –

0

La dérivée partielle temporelle (selon t) est connectée aux dérivées partielles spatiales (selon x et y). Pensez à la séquence vidéo que vous analysez en tant que volume, volume spatio-temporel. A tout point donné (x, y, t), si vous voulez estimer des dérivées partielles, c'est-à-dire estimer le gradient 3D à ce point, alors vous bénéficierez de 3 filtres qui ont le même support de noyau. Pour plus de théorie sur la raison pour laquelle cela devrait être le cas, consultez le sujet des filtres orientables, ou mieux encore cherchez le concept fondamental de ce que la dérivée partielle est supposée être, et comment elle se connecte aux dérivées directionnelles.

Souvent, le gradient 2D est estimé en premier, puis les gens ont tendance à considérer la dérivée temporelle comme indépendante de la composante x et y.Cela peut, et très souvent, conduire à des erreurs numériques dans les calculs de flux optiques finaux. La façon habituelle de traiter ces erreurs est de faire une estimation du débit aller et retour, et de combiner les résultats à la fin. Une façon de penser au gradient que vous estimez est qu'il a une région de support qui est 3D. La plus petite taille d'une telle région devrait être 2x2x2. Si vous effectuez des dégradés 2D dans les première et deuxième images en utilisant uniquement des filtres 2x2, le filtre FIR correspondant pour le volume 3D est collecté en calculant la moyenne des résultats des deux filtres. Le fait que vous ayez la même région de support de filtre en 2D est clair pour la plupart: c'est la raison pour laquelle les opérateurs Sobel et Scharr regardent comme ils le font.

Vous pouvez voir le genre de résultats que vous obtenez en ayant des opérateurs différentiels conçus pour le flux optique dans ce Matlab toolbox that I made, en partie pour montrer ce point particulier.