# Gnral Dveloppement > Algorithme & Mathmatiques > Traitement d'images >  faire apparaitre le contour d'une image par filtre SOBEL

## bilzzbenzbilz

bonjour,
je suis en train de faire un petit algorithme de dtection de contour par filtre de SOBEL (bas sur l'algo de pseudocode ), mais j'ai pas trouv de bon rsultat.
Mon problme est : comment choisir le seuil pour que je puisse rendre tous les pixels qui forment le contour en blanc, les autres en noir .

Mon code est :


```

```

----------


## b_reda31

Bonsoir,
La convolution de l'image avec un masque de Sobel ne donne pas une image binaire (noir et blanc)! a serai plutot une approximation du gradient de l'image,vous aurez donc une forte intensit dans les contours et une faible intensit (sombre) dans les parties "homognes" de l'image.
Une fois le gradient calcul,vous pouvez calculer l'image binaire en le seuillant(le gradient).
La valeur du seuil choisi est judicieuse;une faible valeur de seuil gnrera de "faux positifs" (certains points ne faisant pas partie des contours auront la valeur 255).Alors qu'une faible valeur de seuil peut provoquer de "faux ngatif" (certaines partie des contours ne seront pas visibles,0)...la valeur du seuil dpendra du type d'image que vous traitez.

----------


## bilzzbenzbilz

dans ce cas l, comment utiliser le gradient pour detecter le contour d'une image.

----------


## pseudocode

> dans ce cas l, comment utiliser le gradient pour detecter le contour d'une image.


Ca dpend de l'image. Il n'y a pas de solution universelle  ce problme.

----------


## bilzzbenzbilz

par exemple, l'image que vous avez utilis dans votre documents : filtres usuels en traitement d'image ( la femme avec un chapeau ) image en niveau de gris .

----------


## pseudocode

> par exemple, l'image que vous avez utilis dans votre documents : filtres usuels en traitement d'image ( la femme avec un chapeau ) image en niveau de gris .


Mme pour cette image il n'y a pas "une" solution universelle. Selon le filtre choisi et le niveau du seuil, on aura des contours diffrents.

Utiliser seulement un seuil sur la norme du gradient ne donne presque jamais un "beau" contour. Il faut utiliser des techniques plus complexes.

----------


## bilzzbenzbilz

si vous pouvez siter une solution (simple) avec un seuil. Je veux juste connatre une technique de choix du seuil (mme une technique simple), merci .

----------


## pseudocode

> si vous pouvez siter une solution (simple) avec un seuil. Je veux juste connatre une technique de choix du seuil (mme une technique simple), merci .


On peut toujours faire une tude statistique des valeurs du gradient pour choisir le seuil. Mais ce calcul implique de choisir un modle et donc des paramtres. Bref on change le choix du seuil contre le choix des paramtres. Donc a ne fait pas avancer le problme.  ::?:

----------


## bilzzbenzbilz

bonjour pseudocode.

Dans ce cas l, comment vous avez transform l'image (femme avec chapeau) du doc "filtre usuels" par filtre de SOBEL ou vous avez dit :
noyau vertical (valeur absolue,chelle logarithmique).
Ou bien c'tait juste un exemple ?

----------


## pseudocode

> Dans ce cas l, comment vous avez transform l'image (femme avec chapeau) du doc "filtre usuels" par filtre de SOBEL ou vous avez dit :
> noyau vertical (valeur absolue,chelle logarithmique).
> Ou bien c'tait juste un exemple ?


Oui, c'tait juste un exemple d'affichage.

 La convolution par un noyau Sobel normalis renvoie une valeur entre -255 et +255 pour chaque pixel. Pour prsenter graphiquement le rsultat (sous forme d'une image), il faut donc transformer ces valeurs dans la plage [0-255] afin d'avoir un niveau de gris correspondant.

Dans l'article "filtres usuels", j'ai choisi cette formule:



```
niveaudegris = = 255 * Math.log(1+Math.abs(sobel)) / Math.log(1+255);
```


qui transforme la valeur "sobel" (-255...+255) en valeur "niveau de gris" (0...+255)

----------


## bilzzbenzbilz

je veux vous prsenter les deux images rsultats de l'application de votre techniques , ou est ce que je peux les inserer, quand je clique sur (inserer une image), il me demande une url.

----------


## pseudocode

> je veux vous prsenter les deux images rsultats de l'application de votre techniques , ou est ce que je peux les inserer, quand je clique sur (inserer une image), il me demande une url.


Clique sur l'icone "trombone"  la place de l'icone "lien".  :;):

----------


## bilzzbenzbilz

image originale




sobel vertical




sobel horizontal

----------


## bilzzbenzbilz

d'aprs vous, est ce que c'est un bon rsultat? d'aprs moi (non) .

----------


## pseudocode

> d'aprs vous, est ce que c'est un bon rsultat? d'aprs moi (non) .


Effectivement, il y a un problme. Tes 2 images de Sobel devraient tre noir partout sauf au niveau des bords.  :8O: 

A titre d'exemple voila ce que j'obtient (avec un filtre MDIF 3x3 au lieu d'un Sobel 3x3, mais c'est  peu prs le mme rsultat):


A gauche le Log de la norme du gradient.
A droite juste la norme du gradient.

----------


## bilzzbenzbilz

aaa, est ce que vous pouvez me donner l'algo que vous avez appliqu  ::D:   .

----------


## pseudocode

Et bien, celui qui est donn dans l'article sur les filtres !  ::D:

----------


## bilzzbenzbilz

aaaaa, j'ai bien compris  ::D: . Je vais ssayer de coder l'algo  ma propre faon, puis je vous envoie le rsultat .

----------


## pseudocode

> aaaaa, j'ai bien compris . Je vais ssayer de coder l'algo  ma propre faon, puis je vous envoie le rsultat .


Heu... c'est juste une double boucle for(). Il n'y a rien d'exceptionnel.



```

```

----------


## bilzzbenzbilz

voici le rsultat de votre algo :



ce n'est pas exactement le mme rsultat que votre image.

----------


## pseudocode

> voici le rsultat de votre algo :
> 
> ce n'est pas exactement le mme rsultat que votre image.


Ah, oui. J'ai oubli de diviser par 4 les valeurs de gx et gy. Voila, j'ai corrig le code.

----------


## bilzzbenzbilz

vous avez oubli les parenthses  ::P: 
maintenant Oui, j'ai le mme rsultat.

----------


## pseudocode

> vous avez oubli les parenthses


Ah oui. L'editeur de message du forum n'est pas vraiment l'idal pour coder.  ::D:

----------


## YoYoMoMo

Bonjour

j ai bien compris qu il n existe pas de seuil universel pour Sobel.
Mais si on a une zone de l image qui contient uniquement du bruit, 
y a t il un moyen de relier le seuil a ce niveau de bruit ?

Autre question: existe t il une methode n utilisant pas de seuil ?  ::lol:: 

Merci d avance,

----------


## pseudocode

> j ai bien compris qu il n existe pas de seuil universel pour Sobel.
> Mais si on a une zone de l image qui contient uniquement du bruit, 
> y a t il un moyen de relier le seuil a ce niveau de bruit ?
> 
> Autre question: existe t il une methode n utilisant pas de seuil ?


Gnralement, on commence par filtrer l'image pour retirer le bruit (filtre passe-bas). On peut galement normaliser le signal (egalisation d'histogramme). C'est seulement ensuite qu'on fait un filtrage de contour (sobel).

Pour choisir un seuil, on peut tudier la distribution des valeurs obtenues par sobel. Mais il n'y a pas de miracles.

----------


## souviron34

> Autre question: existe t il une methode n utilisant pas de seuil ?


Il y en a une que je connais :

Il faut avoir 3 "images" en mmoire, dont une "signed" ou en rel.

"Dplacer" la premire image de 1/2 pixel
Soustraire les 2 images (le rsultat est beaucoup de pixels autour de 0, et les "contours" en couples (valle/crte). 
Calculer moyenne et sigma
Normaliser en prenant la valeur absolue (multiplie par 2), et en liminant (0) tout ce qui est infrieur  2*sigma


Les contours seront un peu plus pais, mais le calcul est simple et le rsultat bon..  :;):

----------


## YoYoMoMo

> Il y en a une que je connais :
> 
> Il faut avoir 3 "images" en mmoire, dont une "signed" ou en rel.
> 
> "Dplacer" la premire image de 1/2 pixel
> Soustraire les 2 images (le rsultat est beaucoup de pixels autour de 0, et les "contours" en couples (valle/crte). 
> Calculer moyenne et sigma
> Normaliser en prenant la valeur absolue (multiplie par 2), et en liminant (0) tout ce qui est infrieur  2*sigma
> 
> ...


Merci pour vos reponses !!

si je comprends bien on prend une image
Image=A=B  des images 1000x800

on decale l image A de 2 points:
Adec = A(1:1000,3:800)

on soustrait:
C=Adec - A(1:1000,1:798)

on calcule:
mm= moyenne(C)
etype  = ecart-type(C)

on normalise:
Cnorm = C-mm (?? je suis pas trop sur)

et on seuil Cnorm avec 2*etype 

 ::roll:: 
j ai bon ?  ::lol:: 
c est plus ou moins un seuillage sur une pente non ?
et puis c est du 1D finalement pas du 2D ?

Merci d avance,

----------


## souviron34

> on decale l image A de 2 points:
> Adec = A(1:1000,3:800)


NON

de *1/2* point

----------


## YoYoMoMo

> NON
> 
> de *1/2* point


je suis dsol mais 1/2 point/pixel ca ne me parle pas du tout !
Faut il calculer une moyenne entre 2 pixels pour obtenir le 1/2 pixel ?

----------


## souviron34

ben oui...

----------


## YoYoMoMo

> ben oui...


je ne sais pas pourquoi mais je suis sur que tu n es pas prof  ::P: 
merci quand meme .
Ca semble etre une methode de pente pour une seule direction donc une methode 1D.

----------


## pseudocode

> Ca semble etre une methode de pente pour une seule direction donc une methode 1D.


Rien ne t'empche de faire un seuillage  2*sigma sur un gradient 2D (Sobel).

----------


## YoYoMoMo

> Rien ne t'empche de faire un seuillage  2*sigma sur un gradient 2D (Sobel).


je vais essayer ca.

----------


## souviron34

> je ne sais pas pourquoi mais je suis sur que tu n es pas prof 
> merci quand meme .
> Ca semble etre une methode de pente pour une seule direction donc une methode 1D.


 :;):  c'tait pour te faire un peu travailler les mninges...

Maintenant non c'est pas du 1D.

C'est uniquement pour "lisser" le bruit. L'important est la soustraction. Le dplacement est sub-pixel du coup justement on s'en fiche un peu si c'est 1D ou 2D... C'est juste pour pas soustraire 2 quantits identiques. Et si on met plus de 1/2 pixel, on se retouve justement avec des effets directionnels..

Alors on peut le faire entre (ij,i+1 j,ij+, i+1j+1) ou entre (ij et ij+1)..

Et a marche trs bien (_si on ne met pas a 0 mais qu'on normalise par rapport  l'cart global, on a une jolie image de relief_.. :8-): )

Maintenant, comme le dit Pseudocode, on peut l'appliquer avec n'importe quoi (pour le seuil).

L'avantage de la soustraction, c'est qu'on sait que le seuil est significatif...

 ::D:

----------

