# Gnral Dveloppement > Algorithme & Mathmatiques > Traitement d'images >  Drive d'une image : gradients et filtre de Sobel

## betsprite

Bonjour,

L'implmentation du dtecteur de Harris ncessite le calcul des drives en x et y de l'image I. 

Pour se faire, j'ai cru comprendre que les masques de convolution permettaient de simuler cette "drive" ou plutt ces gradients en x et y comme le filtre de Sobel. Est-ce vrai ?

Si c'est exacte, le filtre de Sobel peut alors tre utilis afin d'avoir les drives en x et y de l'image pour commencer le dtecteur de Harris. Seulement, comme doit-on s'y prendre dans l'implmentation ? Vu qu'on doit bien distinguer la drive en x et y de l'image, j'imagine qu'il ne faut pas appliquer le masque de convolution de Sobel  chaque pixel de l'image ? Il faut pour Ix (drive selon x) d'abord parcourir les x puis pour y, parcourir les y ? (autrement dit, au lieu de faire une boucle sur l'ensemble des pixels, on fait une boucle sur les pixels selon les colonnes puis selon les lignes ?)

Je vous remercie  :;): 

edit : Ou alors, au lieu de parcourir les lignes puis les colonnes, j'ai l'impression qu'on peut tout simplement reparcourir toute l'image avec un masque de convolution adapte  la drive en x et drive en y (deux masques de convolutions diffrents). Mais comment savoir quel masque va permettre de driver selon x et selon y ?

J'ai mis en pice-jointe une image qui reprend cette ide mais je ne comprends pas trs bien le raisonnement fait pour diffrencier la drive selon x de celle selon y, notamment  partir de l'approximation simple de la drive discrte.

----------


## pseudocode

> Pour se faire, j'ai cru comprendre que les masques de convolution permettaient de simuler cette "drive" ou plutt ces gradients en x et y comme le filtre de Sobel. Est-ce vrai ?


Oui, en considrant que la drive est la limite du taux de variation

df(x)/dx  = limite (f(x+e)-f(x-e)) / 2e,  lorsque 'e' tend vers 0

Dans le cas discret, on prend e=1.





> Si c'est exacte, le filtre de Sobel peut alors tre utilis afin d'avoir les drives en x et y de l'image pour commencer le dtecteur de Harris. Seulement, comme doit-on s'y prendre dans l'implmentation ? Vu qu'on doit bien distinguer la drive en x et y de l'image, j'imagine qu'il ne faut pas appliquer le masque de convolution de Sobel  chaque pixel de l'image ? Il faut pour Ix (drive selon x) d'abord parcourir les x puis pour y, parcourir les y ? (autrement dit, au lieu de faire une boucle sur l'ensemble des pixels, on fait une boucle sur les pixels selon les colonnes puis selon les lignes ?)


Il y a effectivement deux masques, correspondant chacun  une variable de drivation.

dI(x,y)/dx  =  ( I(x+1,y)-I(x-1,y) ) /2 = 1/2 . (I*SobelX) (x,y)
dI(x,y)/dy  =  ( I(x,y+1)-I(x,y-1) ) /2 = 1/2 . (I*SobelY) (x,y)

----------


## betsprite

Merci pseudocode pour ton aide  :;): 

En fait, la matrice de convolution propose par Sobel permet apparemment  la fois de faire une Gaussienne et une drive. Mais si on ne prend que la partie de la matrice permettant de faire une drive en x et y on aurait quelle matrice de convolution et pourquoi ? (-1 0 1) ?

Aussi, bien que je connaisse la formule gnrale de la convolution et que j'arrive sans problme  l'appliquer avec deux matrices carrs de mme taille, j'ai du mal  voir comment se fait le produit entre une image I de taille 10 sur 8 et une matrice 2x2 par exemple. On dcoupe la matrice reprsentant les pixels de l'image en bloc et on fait le produit de convolution de chaque bloc avec le masque ?

Enfin, la drive, bien qu'tant ralise  l'aide d'un masque avec un produit de convolution, ne vais-je pas rencontrer des problmes aux bords de l'image avec le I(x+1)  droite de l'image et le I(x-1)  gauche (mme problme pour les y) ?

Merci  :;):

----------


## pseudocode

> En fait, la matrice de convolution propose par Sobel permet apparemment  la fois de faire une Gaussienne et une drive. Mais si on ne prend que la partie de la matrice permettant de faire une drive en x et y on aurait quelle matrice de convolution et pourquoi ? (-1 0 1) ?


I(x+1,y)-I(x-1,y)  =   (I(x-1,y)  I(x-1,y)  I(x+1,y))  x  (-1 0 1)




> Aussi, bien que je connaisse la formule gnrale de la convolution et que j'arrive sans problme  l'appliquer avec deux matrices carrs de mme taille, j'ai du mal  voir comment se fait le produit entre une image I de taille 10 sur 8 et une matrice 2x2 par exemple. On dcoupe la matrice reprsentant les pixels de l'image en bloc et on fait le produit de convolution de chaque bloc avec le masque ?



Effectivement on applique le filtre sur une partie de l'image de meme taille que la matrice du filtre. J'ai essay d'expliquer cela ici.




> Enfin, la drive, bien qu'tant ralise  l'aide d'un masque avec un produit de convolution, ne vais-je pas rencontrer des problmes aux bords de l'image avec le I(x+1)  droite de l'image et le I(x-1)  gauche (mme problme pour les y) ?


Tout a fait. Mais ce problme n'est pas li au masque, c'est juste que la valeur de l'image n'est pas dfinie en dehors des bords. L'ide consiste donc  "tendre" les valeurs de l'image au del des bords. C'est aussi expliqu dans le lien que j'ai donn.

----------


## betsprite

Merci pseudocode !




> I(x+1,y)-I(x-1,y) = (I(x-1,y) I(x-1,y) I(x+1,y)) x (-1 0 1)


Ici le "x" c'est un produit simple ou de convolution ? parce que il me semble que pour la convolution on multiplie le dernier lment du masque par le premier de l'image etc... (a(i,j)*b(n-i, p-j)) donc se serait plutt (I(x-1,y) I(x-1,y) I(x+1,y)) x (1 0 -1) non?

Merci  :;):

----------


## pseudocode

> Ici le "x" c'est un produit simple ou de convolution ? parce que il me semble que pour la convolution on multiplie le dernier lment du masque par le premier de l'image etc... (a(i,j)*b(n-i, p-j)) donc se serait plutt (I(x-1,y) I(x,y) I(x+1,y)) x (1 0 -1) non?
> 
> Merci


Mathmatiquement parlant oui, car le produit de convolution croise les termes.

Pourtant, en pratique, on utilise une multiplication terme  terme, donc sans croiser. Surement parce que les ordinateurs sont trs performant pour faire ce genre de calculs vectoriels.

----------


## betsprite

> Mathmatiquement parlant oui, car le produit de convolution croise les termes.
> 
> Pourtant, en pratique, on utilise une multiplication terme  terme, donc sans croiser. Surement parce que les ordinateurs sont trs performant pour faire ce genre de calculs vectoriels.


Hum d'accord mais comment l'ordinateur fait la diffrence alors entre un produit matriciel(multiplication terme  terme) et un produit de convolution ?

----------


## pseudocode

> Hum d'accord mais comment l'ordinateur fait la diffrence alors entre un produit matriciel(multiplication terme  terme) et un produit de convolution ?


L'ordinateur fait ce qu'on lui dit de faire. Il faut donc faire attention  l'oprateur qu'on utilise (convolution, multiplication terme  terme, ...) et en consquences aux paramtres utiliss (valeurs croises ou dcroises du filtre)

----------


## betsprite

> L'ordinateur fait ce qu'on lui dit de faire. Il faut donc faire attention  l'oprateur qu'on utilise (convolution, multiplication terme  terme, ...) et en consquences aux paramtres utiliss (valeurs croises ou dcroises du filtre)


Je suis d'accord mais dans ce cas la syntaxe ne doit pas tre la mme non ? Pour une multiplication terme  terme de deux matrices c'est le "x" et pour la convolution c'est une mthode(ou fonction) prcise du langage utilis ? 

Du coup je me pose une autre question : Quand tu dis que l'ordinateur fait lui mme la convolution et donc sait comment il doit multiplier les matrices mme si on n'a pas prpar le masque (pas de croisement), cette "intelligence" ne dpend-t-elle pas du langage et donc de la mthode utilise ?

Merci encore pseudocode pour ces informations  :;):

----------


## pseudocode

> Je suis d'accord mais dans ce cas la syntaxe ne doit pas tre la mme non ? Pour une multiplication terme  terme de deux matrices c'est le "x" et pour la convolution c'est une mthode(ou fonction) prcise du langage utilis ? 
> 
> Du coup je me pose une autre question : Quand tu dis que l'ordinateur fait lui mme la convolution et donc sait comment il doit multiplier les matrices mme si on n'a pas prpar le masque (pas de croisement), cette "intelligence" ne dpend-t-elle pas du langage et donc de la mthode utilise ?


Je n'ai pas dit que l'ordinateur sait comment faire, j'ai dit qu'il faisait ce qu'on lui demandait. Suivant les langages on dispose d'oprateur de multiplication simple, de multiplication terme  terme, de convolution, ou autre.

Classiquement, les langages disposent seulement de la multiplication simple (de 2 rels) et il faut coder soi-mme des oprateurs plus compliqus.

Mais certains langages disposent dj de certains de ces oprateurs. Par exemple en Matlab il y a l'oprateur ".*" qui fait une multiplication terme  terme de deux tableaux.

----------


## betsprite

> Je n'ai pas dit que l'ordinateur sait comment faire, j'ai dit qu'il faisait ce qu'on lui demandait. Suivant les langages on dispose d'oprateur de multiplication simple, de multiplication terme  terme, de convolution, ou autre.


Merci pseudocode pour la prcision et dsol d'tre un peu insistant sur ce point mais justement, quand tu dis : 




> Pourtant, en pratique, on utilise une multiplication terme  terme, donc sans croiser. Surement parce que les ordinateurs sont trs performant pour faire ce genre de calculs vectoriels.


Je ne comprends pas pourquoi tu dis qu'en pratique on utilise une multiplication terme  terme pour faire un produit de convolution. Car mme en pratique, on va avoir soit la multiplication terme  terme dj implmente et la convolution aussi mais avec une syntaxe diffrente pour les deux oprateurs soit on aura les deux  implmenter mais ils seront quand mme diffrents.

En gros, pourquoi l'ordinateur reconnaitrait dans la multiplication terme  terme le produit de convolution ? ^^ (je pense que je comprends mal ta phrase en fait)

Ou alors, quand tu dis on utilise une multiplication terme  terme pour faire la convolution, il faut d'abord prparer le masque au croisement...

Merci !

----------


## pseudocode

[quote=betsprite;5669617]Merci pseudocode pour la prcision et dsol d'tre un peu insistant sur ce point mais justement, quand tu dis : 



Je ne comprends pas pourquoi tu dis qu'en pratique on utilise une multiplication terme  terme pour faire un produit de convolution. Car mme en pratique, on va avoir soit la multiplication terme  terme dj implmente et la convolution aussi mais avec une syntaxe diffrente pour les deux oprateurs soit on aura les deux  implmenter mais ils seront quand mme diffrents.

En gros, pourquoi l'ordinateur reconnaitrait dans la multiplication terme  terme le produit de convolution ? ^^ (je pense que je comprends mal ta phrase en fait)




> Ou alors, quand tu dis on utilise une multiplication terme  terme pour faire la convolution, il faut d'abord prparer le masque au croisement...


Oui, c'est a. Il faut prparer le masque suivant l'oprateur utilis.

Et comme on utilise gnralement l'oprateur de multiplication terme  terme, le filtre est donc "dcrois" par rapport  un filtre de convolution. D'o mon message original :

I(x+1,y)-I(x-1,y) = (I(x-1,y) I(x-1,y) I(x+1,y)) x (-1 0 1)

ou "x" reprsente ici un oprateur de "convolution dcrois", c'est  dire la somme des multiplications terme  terme.

----------


## betsprite

> Oui, c'est a. Il faut prparer le masque suivant l'oprateur utilis.
> 
> Et comme on utilise gnralement l'oprateur de multiplication terme  terme, le filtre est donc "dcrois" par rapport  un filtre de convolution. D'o mon message original :
> 
> I(x+1,y)-I(x-1,y) = (I(x-1,y) I(x-1,y) I(x+1,y)) x (-1 0 1)
> 
> ou "x" reprsente ici un oprateur de "convolution dcrois", c'est  dire la somme des multiplications terme  terme.


Ok je comprends mieux :p

Merci encore pseudocode ! je vais essayer d'implmenter a dj se sera un bon dbut pour l dtection de points d'intrts avec la mthode de Harris.

Merci !

----------

