Qu'est-ce que le gradient de l'orientation et de l'ampleur du gradient
Je suis actuellement à l'étude d'un module de vision par ordinateur appelé détection de bord.
Je suis en train d'essayer de comprendre le sens du gradient de l'orientation et de l'ampleur du gradient.
Vous devez vous connecter pour publier un commentaire.
Comme l'a expliqué Dima dans son réponse, vous devez être familier avec le concept mathématique de dégradé afin de mieux comprendre le dégradé dans le domaine du traitement de l'image.
Ma réponse est basée sur la réponse de mevatron à ce question.
Vous trouverez ici une simple image initiale d'un disque blanc sur fond noir:
vous pouvez calculer une approximation du gradient de l'image. Comme Dima a expliqué dans sa réponse, vous avez deux composante du gradient, une horizontale et une composante verticale.
Les images ci-dessous vous montre la composante horizontale:
il montre combien les niveaux de gris de votre changement d'image dans le sens horizontal (c'est le sens des x positif, la numérisation de l'image de gauche à droite), ce changement est "codé" dans le niveau de gris de l'image de la composante horizontale: la moyenne des niveaux de gris signifie qu'aucun changement, les niveaux de luminosité variation moyenne de la sombre de la valeur à un brillant de valeur, l'obscurité, la signification des niveaux d'un changement d'une brillante valeur à l'obscurité de la valeur. Ainsi, dans l'image ci-dessus vous voyez le plus brillant de valeur dans la partie gauche du cercle, car il est dans la partie gauche de l'image initiale que vous avez le noir et blanche qui vous donne le bord gauche du disque; de même, dans l'image ci-dessus vous voyez le plus sombre de la valeur dans la partie droite du cercle, car il est dans la partie droite de l'image initiale que vous avez du blanc au noir de la transition qui vous donne le droit de bord du disque. Dans l'image ci-dessus, la partie intérieure du disque et le fond sont une moyenne des niveaux de gris car il n'y a pas de changement à l'intérieur du disque et dans le fond.
On peut faire des observations analogues pour la composante verticale, il montre comment le changement d'image dans le sens vertical, c'est à dire la numérisation de l'image du haut vers le bas:
Vous pouvez maintenant combiner les deux composants dans l'ordre pour obtenir de l'ampleur de la pente et de l'orientation du dégradé.
L'image suivante est la magnitude du gradient:
De nouveau, dans l'image ci-dessus, le changement de l'image initiale est codée dans le niveau de gris: ici vous pouvez voir que le blanc signifie un grand changement dans l'image initiale tandis que le noir signifie pas de changement à tous.
Donc, quand vous regardez l'image de l'ampleur du gradient, vous pouvez dire "si l'image est élevée, cela signifie un grand changement dans l'image initiale; si elle est sombre, il signifie qu'aucun changement ou très llittle changement".
L'image suivante, c'est l'orientation du dégradé:
Dans l'image ci-dessus, l'orientation est encore codé en niveaux de gris: vous pouvez penser à l'orientation de l'angle d'une flèche pointant à partir de la partie sombre de l'image à la partie brillante de l'image; l'angle est appelé xy cadre où x va de gauche à droite, tandis que la y va de haut en bas. Dans l'image ci-dessus, vous voyez tout en niveau de gris du noir (zéro degré) à le blanc (360 degrés). On peut coder les informations avec la couleur:
dans l'image ci-dessus, l'information est de coder de cette façon:
rouge: l'angle est compris entre 0 et 90 degrés
cyan: l'angle est compris entre 90 et 180 degrés
vert: l'angle est compris entre 180 et 270 degrés
jaune: l'angle est compris entre 270 et 360 degrés
Ici, c'est le C++, OpenCV code pour produire des images ci-dessus.
Payer l'attention sur le fait que, pour le calcul de l'orientation, j'utilise la fonction
cv::phase
qui, comme expliqué dans la doc, donne un angle de 0 lorsque la composante verticale et la composante horizontale de la pente sont à zéro; tout ce qui peut être pratique, mais d'un point de vue mathématique est tout simplement faux, car lorsque les deux composants sont nulles, l'orientation n'est pas définie et le sens de la valeur pour une orientation conservés dans un floating-point C++ est unNaN
.Il est tout simplement faux, car un 0 degré d'orientation, par exemple, est déjà lié à un bord horizontal et il ne peut pas être utilisé pour représenter quelque chose d'autre comme une région sans bords et donc une région où l'orientation est dénuée de sens.
x
est la composante horizontale de la pente ety
est à la verticale à un pixel donné, maintenant l'ampleur du gradientM
à ce pixel estM=sqrt(pow(x,2)+pow(y,2))
et donc, si vous savez justeM
il me semble difficile d'obtenirx
ety
.Le gradient d'une fonction de deux variables x, y est un vecteur des dérivées partielles en x et en y de la direction. Donc, si votre fonction est f(x,y), le gradient est le vecteur (f_x, f_y). Une image est une fonction discrète de (x,y), de sorte que vous pouvez parler du gradient d'une image.
Le gradient de l'image a deux composantes: le x-dérivés et l'axe des dérivés. Ainsi, vous pouvez penser à elle en tant que vecteurs (f_x, f_y) définie pour chaque pixel. Ces vecteurs ont une direction atan(f_y /fx) et d'une ampleur sqrt(f_x^2 + f_y^2). Donc, vous pouvez représenter le gradient d'une image x-dérivés de l'image et d'un y-dérivés de l'image, ou la direction de l'image et la grandeur de l'image.