4 votes

Algorithme de Sobel 3D en python?

Je suis en train de calculer un filtre de Sobel 3D en Python. J'ai un code assez bon pour une image 2D qui est ci-dessous.

au fait. mon image d'origine est de type uint8.

    preSobel = preSobel.astype('int32')
    dx = ndimage.sobel(preSobel, 0)  # dérivée horizontale
    dy = ndimage.sobel(preSobel, 1)  # dérivée verticale
    mag = numpy.hypot(dx, dy)  # magnitude
    mag *= 255.0 / numpy.max(mag)  # normaliser (Q&D)
    img[i,:,:]=mag

mais d'après ma compréhension de la page wiki pour le calcul en 2D, je devrais avoir multiplié les résultats de Sobel 1D plutôt que hypot :confused

de toute façon, pour passer en 3D, je suppose que je dois calculer Sobel 1D sur chaque axe et ensuite multiplier le tout mais je ne suis pas sûr... Existe-t-il une bibliothèque qui calcule plus rapidement le filtre de Sobel 3D ?

5voto

HugoRune Points 3921

Tout d'abord, en référence à votre lien wikipedia : La multiplication là-bas fait référence à la manière de construire le noyau de convolution sobel, pas au résultat final.

Pour un filtre Sobel 2D, vous avez besoin d'un noyau pour obtenir la dérivée dans la direction x, et un autre noyau pour obtenir la dérivée dans la direction Y, par exemple entrez ici la description de l'image

C'est essentiellement ce que font vos deux commandes, donc si vous utilisez numpy, vous n'avez pas besoin de construire ces noyaux vous-même.

dx = ndimage.sobel(preSobel, 0)  # dérivée horizontale
dy = ndimage.sobel(preSobel, 1)  # dérivée verticale

Maintenant, pour le cas 3D, vous avez besoin de 3 opérations avec 3 noyaux, un pour dx, dy, dz. La section wiki liée vous dit comment construire les noyaux en multipliant les composants. Le noyau sobel fini pour dZ par exemple est une matrice 3x3x3 qui ressemble à ceci :

entrez ici la description de l'image

Pour obtenir la magnitude, vous devez toujours prendre la racine carrée des dérivées au carré (l'hypoténuse) par la suite.

Je n'ai pas numpy mais en fonction de ce que je vois dans la documentation la commande ndimage sobel peut gérer n'importe quel nombre de dimensions, donc encore une fois, les noyaux sont déjà fournis :

dx = ndimage.sobel(votre matrice 3D, 0)  # dérivée x
dy = ndimage.sobel(votre matrice 3D, 1)  # dérivée y
dz = ndimage.sobel(votre matrice 3D, 2)  # dérivée z

maintenant, la commande hypoténuse prend probablement seulement 2 paramètres, donc vous devrez trouver un autre moyen de calculer efficacement mag = sqrt(dx_dx + dy_dy + dz*dz) . Mais NumPy devrait avoir tout ce dont vous avez besoin pour cela.


Mise à jour

En fait, si vous êtes seulement intéressé par la magnitude de toute façon, il y a une fonction complète dans numpy pour cela :

mag = generic_gradient_magnitude(votre matrice 3D, sobel)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X