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
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 :
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)