49 votes

Noyau de filtre Sobel de grande taille

J'utilise un filtre sobel de taille 3x3 pour calculer la dérivée de l'image. En regardant certains articles sur Internet, il semble que les noyaux pour le filtre sobel pour les tailles 5x5 et 7x7 soient également courants, mais je ne suis pas en mesure de trouver leurs valeurs de noyau.

Quelqu'un pourrait-il me faire savoir les valeurs du noyau pour le filtre sobel de taille 5x5 et 7x7? De plus, si quelqu'un pouvait partager une méthode pour générer les valeurs du noyau, ce serait très utile.

Merci d'avance.

5voto

Joao Ponte Points 75

Voici une solution simple réalisée avec python 3 en utilisant numpy et la réponse @Daniel.

 def custom_sobel(shape, axis):
    """
    shape must be odd: eg. (5,5)
    axis is the direction, with 0 to positive x and 1 to positive y
    """
    k = np.zeros(shape)
    p = [(j,i) for j in range(shape[0]) 
           for i in range(shape[1]) 
           if not (i == (shape[1] -1)/2. and j == (shape[0] -1)/2.)]

    for j, i in p:
        j_ = int(j - (shape[0] -1)/2.)
        i_ = int(i - (shape[1] -1)/2.)
        k[j,i] = (i_ if axis==0 else j_)/float(i_*i_ + j_*j_)
    return k

Il renvoie le noyau (5,5) comme ceci :

 Sobel x:
   [[-0.25 -0.2   0.    0.2   0.25]
    [-0.4  -0.5   0.    0.5   0.4 ]
    [-0.5  -1.    0.    1.    0.5 ]
    [-0.4  -0.5   0.    0.5   0.4 ]
    [-0.25 -0.2   0.    0.2   0.25]]


Sobel y:
   [[-0.25 -0.4  -0.5  -0.4  -0.25]
    [-0.2  -0.5  -1.   -0.5  -0.2 ]
    [ 0.    0.    0.    0.    0.  ]
    [ 0.2   0.5   1.    0.5   0.2 ]
    [ 0.25  0.4   0.5   0.4   0.25]]

Si quelqu'un connaît une meilleure façon de le faire en python, faites-le moi savoir. Je suis encore novice ;)

3voto

Pedro Boechat Points 1203

J'ai rapidement hacké un algorithme pour générer un noyau Sobel de toute taille impaire > 1, sur la base des exemples donnés par @Paul R :

     public static void CreateSobelKernel(int n, ref float[][] Kx, ref float[][] Ky)
    {
        int side = n * 2 + 3;
        int halfSide = side / 2;
        for (int i = 0; i < side; i++)
        {
            int k = (i <= halfSide) ? (halfSide + i) : (side + halfSide - i - 1);
            for (int j = 0; j < side; j++)
            {
                if (j < halfSide)
                    Kx[i][j] = Ky[j][i] = j - k;
                else if (j > halfSide)
                    Kx[i][j] = Ky[j][i] = k - (side - j - 1);
                else
                    Kx[i][j] = Ky[j][i] = 0;
            }
        }
    }

J'espère que ça aide.

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