Quelques enregistrements détaillés sur le calcul de la matrice de flux optique

Quelques enregistrements de la matrice de hession du flux optique

L'explication intuitive ci-dessus:

La valeur propre de la matrice de Hesse: elle décrit l'inégalité de la direction du vecteur propre à proximité du point.

Pour une matrice de jute d'un certain point dans une image bidimensionnelle, sa valeur propre maximale et son vecteur propre correspondant correspondent à l'intensité et à la direction de la courbure maximale de la courbe bidimensionnelle de son voisinage, c'est-à-dire le côté avec une pente raide pente; le vecteur propre correspondant à la plus petite valeur propre correspond à La direction perpendiculaire à celui-ci est la direction douce.

En termes simples, la taille et le signe des valeurs propres de la matrice de Hesse d'un certain point de l'image déterminent la structure géométrique au voisinage du point

Il en va de même pour les images tridimensionnelles. Certains filtres conçus selon ce principe (le plus classique est le filtre Frangi) ont des applications très importantes dans l'amélioration de l'angiographie ARM et CTA dans le domaine médical.

Sur la base de la matrice de Hesse, la valeur extrême de la fonction multivariée peut être jugée. La conclusion est la suivante

S'il s'agit d'une matrice définie positive, le point critique est un minimum local.
S'il s'agit d'une matrice définie négative, le point critique est un maximum local.
S'il s'agit d'une matrice indéfinie, le point critique n'est pas une valeur extrême.

La méthode de jugement pour le défini positif et le défini négatif de la matrice quadratique réelle: La condition nécessaire et suffisante pour que la matrice quadratique réelle soit quadratique définie positive est que les valeurs propres de la matrice soient toutes supérieures à zéro . La condition nécessaire et suffisante pour la forme quadratique définie négative est que les valeurs propres de la matrice soient toutes inférieures à zéro , sinon elle est indéfinie.

1. La somme des valeurs propres de la matrice est égale au déterminant de la matrice

2. Le produit des valeurs propres de la matrice est égal à la trace de la matrice

La méthode de calcul de la valeur propre minimale utilise les éléments ci-dessus. La formule min_lambda + max_lambda = dttermiant; min_lambda * max_lambda = trace; il est facile de trouver min_lambda par la formule de résolution d'équation quadratique: min_lambda = trace / 2-sqrt ((trace * trace) / 4-determinant);


    float trace = hession(0, 0) + hession(1, 1);
    float determinant = hession(0, 0) * hession(1, 1) - hession(0, 1) * hession(1, 0);
    float min_lambda= trace / 2 - sqrt((trace * trace) / 4 -  determinant);
    result(0, 0) = determinant;
    result(1, 0) = min_lambda;


L'emplacement de code spécifique utilisé dans le flux optique:

hession计算特征值部分:

inline void CacluHessen(const MatrixXf &dx, const MatrixXf &dy, int x, int y,
                        MatrixXf &result, MatrixXf &hession) {

    MatrixXf dx_square = MatrixXf::Zero(WinSize, WinSize);
    MatrixXf dxy_square = MatrixXf::Zero(WinSize, WinSize);
    MatrixXf dy_square = MatrixXf::Zero(WinSize, WinSize);

    dx_square = dx.block(y - halfSize, x - halfSize, WinSize, WinSize).array() *
                dx.block(y - halfSize, x - halfSize, WinSize, WinSize).array();
    dy_square = dy.block(y - halfSize, x - halfSize, WinSize, WinSize).array() *
                dy.block(y - halfSize, x - halfSize, WinSize, WinSize).array();
    dxy_square = dx.block(y - halfSize, x - halfSize, WinSize, WinSize).array() *
                 dy.block(y - halfSize, x - halfSize, WinSize, WinSize).array();

    hession(0, 0) = dx_square.sum();
    hession(1, 1) = dy_square.sum();
    hession(0, 1) = dxy_square.sum();
    hession(1, 0) = dxy_square.sum();

    float trace = hession(0, 0) + hession(1, 1);
    float determinant = hession(0, 0) * hession(1, 1) - hession(0, 1) * hession(1, 0);
    float min_lambda= trace / 2 - sqrt((trace * trace) / 4 -  determinant);
    result(0, 0) = determinant;
    result(1, 0) = min_lambda;
}


应用部分:

if(result(1, 0) < LK_minEigThreshold || result(0, 0) < FLT_EPSILON)
{
    if(0 == level)
    {
       status(i, 0) = 0;
    }
    continue;
}


 

Je suppose que tu aimes

Origine blog.csdn.net/gbz3300255/article/details/113102903
conseillé
Classement