Partage
  • Partager sur Facebook
  • Partager sur Twitter

Explication Filtre de Sobel

Sujet résolu
    15 janvier 2012 à 10:51:01

    Bonjour, je fais acteuelemnt un TPE sur la vision par ordinateur et une notion sur Sobel m'échappe:

    J'ai compris qu'en vision par ordinateur on va multiplier la valeur du pixel et les huit valeurs autour par son équivalents sur la matrice de convolution horizontal puis verticale ou on obtient la valeur du gradient horizontal et vertical de ce pixel (gx et gy) mais je ne comprend pas comment on peut visualiser ce gradient (qui est un vecteur non?)donc on devrait avoir sa norme et sa direction?

    Autre chose que je ne comprend pas la formule qu'on utilise à la fin est <math>\(I= \sqrt(GX\textsuperscript{2}+Gy\textsuperscript{2})\)</math> qui corespond à la formule de calcul de la norme. Donc à quoi sers cette formule.

    Merci d'avance de vos explications.
    • Partager sur Facebook
    • Partager sur Twitter
      15 janvier 2012 à 12:49:31

      Si <math>\(\mathbf{I}\)</math> est la matrice des intensités de ton image, les gradients horizontal et vertical de Sobel sont définis comme :

      <math>\(\mathbf{G_x} = \begin{bmatrix} 1 & 0 & -1 \\2 & 0 & -2 \\1 & 0 & -1 \end{bmatrix} * \mathbf{I}\quad \mbox{et} \quad \mathbf{G_y} = \begin{bmatrix} 1 & 2 & 1 \\0 & 0 & 0 \\-1 & -2 & -1 \end{bmatrix} * \mathbf{I}\)</math>

      où <math>\(*\)</math> est le signe de convolution.

      <math>\(\mathbf{G_x}\)</math> et <math>\(\mathbf{G_y}\)</math> sont donc des matrices dont les éléments sont les projections du gradient selon une certaine direction (x ou y) aux différents points de l'image. Leurs éléments ont donc une valeur élevée lorsque l'intensité des pixels change rapidement selon la direction choisie (gradient > 0 si augmentation ; gradient < 0 si diminution).

      Comme le but du filtre de Sobel est de trouver les contours dans une image (donc pas seulement selon une direction particulière, mais selon une direction quelconque) et que d'autre part le signe du gradient ne nous intéresse pas (on ne s'intéresse qu'aux variations d'intensité, mais pas spécifiquement aux augmentations ou aux diminutions), on prend la norme du gradient en chaque point de l'image. Par Pythagore, cette norme (toujours positive) vaut <math>\(\mathbf{G} = \sqrt{\mathbf{G_x}^2+\mathbf{G_y}^2}\)</math>.
      • Partager sur Facebook
      • Partager sur Twitter
        15 janvier 2012 à 13:25:05

        Merci de votre aide,
        juste pour vérifier: c'est comme si pour chaque pixel on à un vecteur (le gradient) de coordonnés Gx et Gy? et ca veut donc dire que la norme est égal à la valeur du pixel.

        Autre chose, si on à une image de 3x3 pixels et qu'on veut la norme d'un pixel on multiplie de la façon suivante:
        Gx(I(2;2))=(I(1;1)×-1))+(I(2;1)×0)+(I(3;1)×1)+(I(1;2)×-2)+(I(2;2)×0)+(I(3;2)×2)+(I(1;3)×-1)+(I(2;3)×0)+ (I(3;3)×1)

        c'est bien ça?

        Et dernière question j'ai matlab au lycée est ce que je peus faire les calculs directement sans la toolbox vision par ordi ou ca ne vas pas marcher.

        Merci d'avance de votre aide.
        • Partager sur Facebook
        • Partager sur Twitter
          15 janvier 2012 à 14:28:09

          Citation : 13ansetpassioné

          juste pour vérifier: c'est comme si pour chaque pixel on à un vecteur (le gradient) de coordonnés Gx et Gy?


          Oui, c'est bien ça. :) En fait, le gradient est un champ de vecteurs, c'est à dire qu'il y a un vecteur différent pour chaque coordonnées x et y.

          Citation

          et ca veut donc dire que la norme est égal à la valeur du pixel.


          Disons plutôt que la valeur d'un pixel, c'est son intensité. La norme du gradient, c'est le taux de variation de cette intensité.

          Citation

          Autre chose, si on à une image de 3x3 pixels et qu'on veut la norme d'un pixel on multiplie de la façon suivante:
          Gx(I(2;2))=(I(1;1)×-1))+(I(2;1)×0)+(I(3;1)×1)+(I(1;2)×-2)+(I(2;2)×0)+(I(3;2)×2)+(I(1;3)×-1)+(I(2;3)×0)+ (I(3;3)×1)

          c'est bien ça?


          Oui, sauf que tu as inversé les indices des lignes et des colonnes :

          <math>\(\mathbf{G_x} =\begin{bmatrix}1 & 0 & -1 \\2 & 0 & -2 \\1 & 0 & -1\end{bmatrix}*~~\mathbf{I} = \begin{bmatrix}1 & 0 & -1 \\2 & 0 & -2 \\1 & 0 & -1\end{bmatrix} * \begin{bmatrix}I_{1,1} & I_{1,2} & I_{1,3} \\I_{2,1} & I_{2,2} & I_{2,3} \\I_{3,1} & I_{3,2} & I_{3,3}\end{bmatrix}\)</math>

          <math>\(= (1\cdot I_{1,3} + 0\cdot I_{1,2} -1\cdot I_{1,1}) + (2\cdot I_{2,3} + 0\cdot I_{2,2} -2\cdot I_{2,1}) + (1\cdot I_{3,3} + 0\cdot I_{3,2} -1\cdot I_{3,1})\)</math>

          <math>\(= I_{1,3} - I_{1,1} + 2 I_{2,3} - 2 I_{2,1} + I_{3,3} - I_{3,1}\)</math>

          Citation

          Et dernière question j'ai matlab au lycée est ce que je peus faire les calculs directement sans la toolbox vision par ordi ou ca ne vas pas marcher.


          Oui, tu n'as pas du tout besoin d'une toolbox pour faire ce genre de calculs. Sous Matlab, il y a la fonction conv2.


          P.S.: Pour afficher les calculs sur ce forum, utilise plutôt LaTeX avec la balise <math> ; ce sera plus lisible. :)
          • Partager sur Facebook
          • Partager sur Twitter
            15 janvier 2012 à 18:54:56

            Merci de ton aide
            On peut donc dire qu'il faut renverser la matrice sur l'axe x pour convoluer?
            Pour la fonction conv2 je vais regarder demain.

            Encore merci de ton aide je vais pouvoir expliquer Sobel dans le dossier.



            • Partager sur Facebook
            • Partager sur Twitter
              15 janvier 2012 à 19:26:04

              Petite question/remarque : quand vous écrivez <math>\(G = \sqrt{G_x^2 + G_y^2}\)</math>, qu'est-ce que ça veut dire ? Les opérations sont effectuées terme à terme dans les matrices ?

              (@13ans&passioné : tu n'as peut-être jamais manipulé de matrices, mais "multiplier des matrices" sans plus de précisions est en général interprété complètement différemment de la multiplication terme à terme(cf wiki ou nimporte quoi). Quant à la racine carré de matrices, c'est encore pire... J'ai buggé sur l'expression et cela peut susciter le même genre de réactions chez les profs qui vont t'évaluer ; il faut que tu sois au courant des notations "habituelles" pour dire "hey les mecs, faîtes gaffe, c'est pas la multiplication de d'habitude !")

              Citation

              On peut donc dire qu'il faut renverser la matrice sur l'axe x pour convoluer?



              Je ne comprends pas la question ... Pour convoler des matrices (c'est bizare, je ne trouve de vraiment super pertinent sur le net qui explique ça bien en profondeur), j'ai trouvé ce lien : http://www.google.fr/url?sa=t&rct=j&q= [...] a_W-VI7ESsk_g où page 2 et 3 t'as un exemple qui te permet de comprendre comment ça marche.
              • Partager sur Facebook
              • Partager sur Twitter
                15 janvier 2012 à 19:35:25

                Je pense que c'est terme à terme en effet (c'est d'ailleurs précisé par Me Capello) ^^.
                Après, faire des calculs terme à terme avec matlab se faire très naturellement en utilisant le même type de notation, ce qui a pu conduire à ce type d'écriture.
                • Partager sur Facebook
                • Partager sur Twitter
                  15 janvier 2012 à 19:43:25

                  Citation : 13ansetpassioné

                  On peut donc dire qu'il faut renverser la matrice sur l'axe x pour convoluer?


                  En fait, il faut la renverser sur les deux axes, mais comme elle est symétrique verticalement, cela ne se voit pas. ^^

                  Pour mémoire, la convolution de deux fonctions se calcule ainsi :

                  <math>\((f*g)(x) = \int_{-\infty}^{+\infty} f(t)\cdot g(x-t)\,\mathrm{d}t\)</math>

                  Et en 2D :

                  <math>\((f*g)(x,y) = \iint\limits_{\mathbb{R}^2} f(s,t)\cdot g(x-s,y-t)\,\mathrm{d}s\,\mathrm{d}t\)</math>

                  On définit donc la convolution de deux matrices de taille m×n comme suit :

                  <math>\(\mathbf{A} * \mathbf{B} = \sum_{i=1}^m\sum_{j=1}^n A_{i,j}\cdot B_{m-i+1,~n-j+1}\)</math>

                  Citation : sebsheep

                  Petite question/remarque : quand vous écrivez <math>\(G = \sqrt{G_x^2 + G_y^2}\)</math>, qu'est-ce que ça veut dire ? Les opérations sont effectuées terme à terme dans les matrices ?


                  Euh, oui… C'est vrai que cela prête à confusion :honte: , mais ce sont bien des opérations faites élément par élément. C'est donc juste un raccourci pour dire :

                  <math>\(G_{i,j} = \sqrt{G_x_{i,j}^2 + G_y_{i,j}^2} \quad \forall (i,j)\)</math>
                  • Partager sur Facebook
                  • Partager sur Twitter
                    15 janvier 2012 à 20:27:19

                    Merci, pour le <math>\(G= \sqrt (Gx*Gx+Gy*Gy)\)</math> j'avais compris que c'était pour un pixel.
                    Par contre quand dans ton developement içi:

                    Citation : Me Capello


                    <math>\(\mathbf{G_x} =\begin{bmatrix}1 & 0 & -1 \\2 & 0 & -2 \\1 & 0 & -1\end{bmatrix}*~~\mathbf{I} = \begin{bmatrix}1 & 0 & -1 \\2 & 0 & -2 \\1 & 0 & -1\end{bmatrix} * \begin{bmatrix}I_{1,1} & I_{1,2} & I_{1,3} \\I_{2,1} & I_{2,2} & I_{2,3} \\I_{3,1} & I_{3,2} & I_{3,3}\end{bmatrix}\)</math>

                    <math>\(= (1\cdot I_{1,3} + 0\cdot I_{1,2} -1\cdot I_{1,1}) + (2\cdot I_{2,3} + 0\cdot I_{2,2} -2\cdot I_{2,1}) + (1\cdot I_{3,3} + 0\cdot I_{3,2} -1\cdot I_{3,1})\)</math>

                    <math>\(= I_{1,3} - I_{1,1} + 2 I_{2,3} - 2 I_{2,1} + I_{3,3} - I_{3,1}\)</math>

                    les . que tu met, se sont bien des multiplications? C'est l'ensemble du calcul qui serait égal à:

                    Citation : Me Capello




                    <math>\(\mathbf{A} * \mathbf{B} = \sum_{i=1}^m\sum_{j=1}^n A_{i,j}\cdot B_{m-i+1,~n-j+1}\)</math>


                    @Sebsheet tu a raison il faut que je fasse gaffe à bien détailler que c'est pour un pixel et que sa correspond à la norme à l'intensité du pixel.
                    Encore merci de votre aide je vais pouvoir écrire la partie du dossier demain.
                    • Partager sur Facebook
                    • Partager sur Twitter
                      15 janvier 2012 à 20:29:07

                      Oui, les « · » sont des multiplications. :)
                      • Partager sur Facebook
                      • Partager sur Twitter
                        16 janvier 2012 à 19:06:33

                        Bonjour,
                        je viens de me rendre compte que ta formule ci dessous ne prend pas en compte les pixels adjacents c'est normal ou c'est parsque c'est la définition classique de matrice de conv?

                        Citation : Me Capello


                        On définit donc la convolution de deux matrices de taille m×n comme suit :

                        <math>\(\mathbf{A} * \mathbf{B} = \sum_{i=1}^m\sum_{j=1}^n A_{i,j}\cdot B_{m-i+1,~n-j+1}\)</math>


                        <math>\(G_{i,j} = \sqrt{G_x{i,j}^2 + G_y{i,j}^2} \quad \forall (i,j)\)</math>


                        Donc comment peu t'on définir ce calcul qui prend en compte les 8 pixels autour plus simplement que développé.
                        <math>\(G_x{i,j}= I({i,j}) \cdot 0 + I({i+1,j+1})\cdot -1 + I({i-1,j-1})\cdot-1 + I({i,j-1}) \cdot 0 + I({i+1,j-1}) \cdot-1 + I({i+1,j}) \cdot -2 + I({i-1,j}) \cdot 2 + I({i-1,j+1}) \cdot 1 + I({i,j-1}) \cdot0\)</math>


                        EDIT: est ce que vous pourriez me donner des infos ou des mot clef pour chercher pourquoi on utilise cette matrice de Sobel et de Prewitt et pourquoi ces valeurs dans la matrice?

                        Merci d'avance de votre aide

                        • Partager sur Facebook
                        • Partager sur Twitter
                          16 janvier 2012 à 21:00:03

                          Mais si, elle prend bien les pixels adjacents. :)

                          Dans ton exemple, m = n = 3 et donc :

                          <math>\(\mathbf{S_{3\times3}} * \mathbf{I_{3\times3}} = \sum_{i=1}^3\sum_{j=1}^3 S_{i,j}\cdot I_{4-i,~4-j}\)</math>

                          <math>\(= S_{1,1}\cdot I_{3,3} + S_{1,2}\cdot I_{3,2} + S_{1,3}\cdot I_{3,1}\)</math>
                          <math>\(+ S_{2,1}\cdot I_{2,3} + S_{2,2}\cdot I_{2,2} + S_{2,3}\cdot I_{2,1}\)</math>
                          <math>\(+ S_{3,1}\cdot I_{1,3} + S_{3,2}\cdot I_{1,2} + S_{3,3}\cdot I_{1,1}\)</math>
                          • Partager sur Facebook
                          • Partager sur Twitter
                            16 janvier 2012 à 21:26:01

                            ok,:euh: , j'avais compris que cette formule donnait l'ensemble de la matrice, au moins j'aurai développé une fois cette expresion manuellement :).
                            Pour mon autre question (dans l'edit), sur l'origine de la matrice et de ses valeurs, quelqun aurait une idée.

                            Encore merci de ton aide. :)

                            EDIT: désolé mais quelque chose me tracasse quand tu développe ton calcul sa donne la valeur d'un pixel par exemple avec G=I*N avec N noyau de convolution et I l'image et pour avoir la valeur du pixel G(2;2):

                            <math>\(G(2;2)= S_{1,1}\cdot I_{3,3} + S_{1,2}\cdot I_{3,2} + S_{1,3}\cdot I_{3,1}\)</math>
                            <math>\(+ S_{2,1}\cdot I_{2,3} + S_{2,2}\cdot I_{2,2} + S_{2,3}\cdot I_{2,1}\)</math>
                            <math>\(+ S_{3,1}\cdot I_{1,3} + S_{3,2}\cdot I_{1,2} + S_{3,3}\cdot I_{1,1}\)</math>
                            Mais comment fait on lorsqu'on veut G(1;1) avec ta formule, car elle ne prend pas en compte la valeur x;y?

                            Je sais pas si je m'explique bien mais je ne comprend pas comment la formule avec le signe somme fonctionne lorsqu'on change la valeur x;y?

                            Existe t'il une formule universelle pour la convolution ou on est plus qu'a modifier x et y et on à le calcul à faire?
                            Si ca n'existe pas, existe t'il une formulation?


                            Merci d'avance
                            • Partager sur Facebook
                            • Partager sur Twitter
                              19 janvier 2012 à 0:32:22

                              La formule générale pour n'importe quel point (i,j) est donnée par :

                              <math>\(\mathbf{G_{i,j}} = \sum_{i'=1}^3\sum_{j'=1}^3 S_{i',j'}\cdot I_{i-i'+2,~j-j'+2}\)</math>

                              Et pour les « pixels » autour du bord de l'image (c'est-à-dire (i,j) hors de la matrice : i<1, j<1, i>m ou j>n), on prend le pixel de la matrice qui est le plus proche. En d'autres termes :

                              <math>\(I_{i,j} = I_{i',j'} \text{ avec } i'=\min(\max(i,1),m),~j' = \min(\max(j,1),n)} \quad\forall (i,j)\in\mathbb{Z}^2\)</math>

                              Quant au pourquoi des valeurs du noyau de Sobel, c'est assez simple : comme on veut le gradient, on cherche à calculer la dérivée partielle pour chaque direction. Or la dérivée d'une fonction discrète (unidimensionnelle) <math>\(Z_i\)</math> au point <math>\(i\)</math> est proportionnelle à <math>\(Z_{i+1}-Z_{i-1}\)</math>. Les matrices noyau pour le calcul de la dérivée selon x et y sont donc données par :

                              <math>\(\mathbf{D_x} = \begin{bmatrix} 0 & 0 & 0 \\1 & 0 & -1 \\0 & 0 & 0 \end{bmatrix}\quad\mathrm{et}\quad\mathbf{D_y} = \begin{bmatrix} 0 & 1 & 0 \\0 & 0 & 0 \\0 & -1 & 0 \end{bmatrix}\)</math>

                              Mais comme l'image est sans doute un peu bruitée, plutôt que de prendre la dérivée uniquement au pixel (i,j), on se dit que ce serait bien de lisser un peu tout ça et donc de faire une moyenne de la dérivée au pixel (i,j) avec celle des 2 pixels qui sont juste au-dessus et au-dessous pour <math>\(x\)</math> (les pixels (i-1,j) et (i+1,j)), et juste à gauche et à droite pour <math>\(y\)</math> (les pixels (i,j-1) et (i,j+1)), ce qui donne les noyaux suivants (Prewitt) :

                              <math>\(\mathbf{P_x} = \begin{bmatrix} 1 & 0 & -1 \\1 & 0 & -1 \\1 & 0 & -1 \end{bmatrix}\quad\mathrm{et}\quad\mathbf{P_y} = \begin{bmatrix} 1 & 1 & 1 \\0 & 0 & 0 \\-1 & -1 & -1 \end{bmatrix}\)</math>

                              Toutefois, pour donner quand même une plus grande pondération à la dérivée au pixel « central » (i,j), on peut aussi utiliser les noyaux de Sobel et donner 2 fois plus de poids au pixel central :

                              <math>\(\mathbf{S_x} = \begin{bmatrix} 1 & 0 & -1 \\2 & 0 & -2 \\1 & 0 & -1 \end{bmatrix}\quad\mathrm{et}\quad\mathbf{S_y} = \begin{bmatrix} 1 & 2 & 1 \\0 & 0 & 0 \\-1 & -2 & -1 \end{bmatrix}\)</math>
                              • Partager sur Facebook
                              • Partager sur Twitter
                                19 janvier 2012 à 17:45:29

                                Ok, j'avais pas du tout compris ça pour l'histoire des dérivées. :D

                                Encore merci de ton aide ça m'a beaucoup m'aider. :)

                                • Partager sur Facebook
                                • Partager sur Twitter
                                  19 janvier 2012 à 17:53:45

                                  N'oublie pas de faire figurer Me Capello dans les remerciements de ton TPE ! ^^
                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    19 janvier 2012 à 18:26:45

                                    Je comptais le faire avec une jolie partie remerciement pour lui et pour les autres qui m'ont aidé dans ce post et dans les autres. Comme @Me Capello @Bvic @Christophe G @Lanfeust 313 @j'en ai surement oublié...

                                    Encore merci à toute la communauté du sdz: Vous êtes vraiment d'une grande aide.
                                    • Partager sur Facebook
                                    • Partager sur Twitter

                                    Explication Filtre de Sobel

                                    × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                                    × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                                    • Editeur
                                    • Markdown