IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Images Discussion :

filtre de Sobel


Sujet :

Images

  1. #21
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 302
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance mécatronique - Conseil, conception et formation

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 302
    Points : 53 160
    Points
    53 160
    Par défaut
    Citation Envoyé par DocteurV Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    image = double(imread('peppers.png'))./255;
    imageOriginale = image(:,:,1);
    Attention à ne pas utiliser image comme nom de variable car c'est déjà le nom d'une fonction MATLAB :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    img = imread('peppers.png','png');
    img = double(img)/255;
    imageOriginale = img(:,:,1);
    Ingénieur indépendant en mécatronique - Conseil, conception et formation
    • Conception mécanique (Autodesk Fusion 360)
    • Impression 3D (Ultimaker)
    • Développement informatique (Python, MATLAB, C)
    • Programmation de microcontrôleur (Microchip PIC, ESP32, Raspberry Pi, Arduino…)

    « J'étais le meilleur ami que le vieux Jim avait au monde. Il fallait choisir. J'ai réfléchi un moment, puis je me suis dit : "Tant pis ! J'irai en enfer" » (Saint Huck)

  2. #22
    Membre régulier Avatar de DocteurV
    Profil pro
    Développeur informatique
    Inscrit en
    Août 2009
    Messages
    85
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2009
    Messages : 85
    Points : 101
    Points
    101
    Par défaut
    bien vu...

  3. #23
    Membre du Club
    Inscrit en
    Septembre 2009
    Messages
    343
    Détails du profil
    Informations forums :
    Inscription : Septembre 2009
    Messages : 343
    Points : 44
    Points
    44
    Par défaut
    Merci bien DocteurV, mais je n’ai pas compris comment avec cette instruction j’obtiens la totalité des contours après l’application des 4 gradients spatiaux orientés de 0° à 135° :
    Et quelle est la différence entre ces deux codes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    S = max(abs(H),[],3);
    S = abs(S);
    S2 = S - min(S(:));
    S2 = S2 ./ max(S2(:));
    resultat = (imageOriginale) - S2;
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    S = max(max(max(H0,H90),H45),H135);
    S = abs(S);
    S2 = S - min(S(:));
    S2 = S2 ./ max(S2(:));
    resultat = (imageOriginale) - S2;

  4. #24
    Membre régulier Avatar de DocteurV
    Profil pro
    Développeur informatique
    Inscrit en
    Août 2009
    Messages
    85
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2009
    Messages : 85
    Points : 101
    Points
    101
    Par défaut
    Citation Envoyé par slaima15
    Merci bien DocteurV, mais je n’ai pas compris comment avec cette instruction j’obtiens la totalité des contours après l’application des 4 gradients spatiaux orientés de 0° à 135° :
    S = max(abs(H),[],3);
    H contient des valeurs de gradients selon 4 directions. Si pour un pixel donné, il y a dans l'image un contour orthogonal à ta direction, tu auras une grandeur élevée en ce pixel pour la direction correspondante... au signe près. Car selon qu'on aura une hausse d'intensité, ou une baisse d'intensité au niveau du contour, la valeur de gradient sera positive ou négative. Donc une valeur négative peut dénoter la présence d'un contour fort.
    En prenant simplement le max de H, tu élimines tous les contours pour lesquels le gradient est négatif. Même s'ils ont une valeur absolue plus grande que les autres.
    En prenant le max de la valeur absolue de H, tu considères donc tous les cas de figure ce qui est plus juste.

    Néanmoins, je persiste à dire que cette méthode est moins élégante et moins précise que de considérer simplement la norme euclidienne du vecteur gradient...


    Citation Envoyé par slaima15
    Et quelle est la différence entre ces deux codes :
    On a déjà abordé le sujet dans le début de la discussion : C'est exactement la même chose (à l'élégance près).

  5. #25
    Membre du Club
    Inscrit en
    Septembre 2009
    Messages
    343
    Détails du profil
    Informations forums :
    Inscription : Septembre 2009
    Messages : 343
    Points : 44
    Points
    44
    Par défaut
    Puisque maintenant mon but c’est d’obtenir la totalité des contours après l’application des 4 gradients spatiaux orientés de 0° à 135°, puis les utilisé pour améliorer le contraste de mon image, est ce que c’est utile d’utiliser ??
    S = abs(S); après S = max(abs(H),[],3); ??

    donc comme ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    S = max(abs(H),[],3); 
    S = abs(S);

    Je suis un peu triste qu’avec la méthode classique je peux seulement calculer les gradients horizontaux et verticaux puisqu'elle est plus précise.

  6. #26
    Membre régulier Avatar de DocteurV
    Profil pro
    Développeur informatique
    Inscrit en
    Août 2009
    Messages
    85
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2009
    Messages : 85
    Points : 101
    Points
    101
    Par défaut
    Citation Envoyé par slaima15
    est ce que c’est utile d’utiliser ?? S = abs(S); après S = max(abs(H),[],3); ??
    Effectivement le deuxième "abs" n'est pas utile désormais.

    Je suis un peu triste qu’avec la méthode classique je peux seulement calculer les gradients horizontaux et verticaux puisqu'elle est plus précise.
    Bah si tu y tiens, tu peux aussi calculer les gradients obliques... mais tu n'y gagneras rien du tout. il ne faut pas croire qu'en calculant des gradients dans toutes les directions ta détection sera plus efficace.

  7. #27
    Membre du Club
    Inscrit en
    Septembre 2009
    Messages
    343
    Détails du profil
    Informations forums :
    Inscription : Septembre 2009
    Messages : 343
    Points : 44
    Points
    44
    Par défaut
    Bas si, je peux calculer les gradients obliques avec la méthode classique donc je peux faire l’application des 4 gradients spatiaux orientés de 0° à 135°. Donc comment je peux le faire ?

  8. #28
    Membre régulier Avatar de DocteurV
    Profil pro
    Développeur informatique
    Inscrit en
    Août 2009
    Messages
    85
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2009
    Messages : 85
    Points : 101
    Points
    101
    Par défaut
    Hein?
    Je ne comprends pas ce que tu veux...


    1. Tu as efficacement utilisé ta méthode avec le max de 4 gradients... elle marchait visiblement bien.
    2. Je t'ai indiqué comment faire pour avoir une meilleure (ou au moins aussi bonne) détection en utilisant seulement 2 gradients orthogonaux et la norme euclidienne du vecteur gradient.

    Qu'est-ce que tu veux de plus?

  9. #29
    Membre du Club
    Inscrit en
    Septembre 2009
    Messages
    343
    Détails du profil
    Informations forums :
    Inscription : Septembre 2009
    Messages : 343
    Points : 44
    Points
    44
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    warning off all;
    image = double(imread('peppers.png'))./255;
    imageOriginale = image(:,:,1);
     
    s0 = [1 2 1; 0 0 0;-1 -2 -1];
    Gx = conv2 (imageOriginale, s0, 'same');
    s90 = [1 0 -1; 2 0 -2; 1 0 -1];
    Gy = conv2 (imageOriginale, s90, 'same');
     
    % Ici on fait la norme euclidienne des vecteurs gradients
    Gradient = sqrt(Gx.^2 + Gy.^2);
     
    figure; 
    imagesc(Gradient);
    title('Intensité du Gradient Spatial obtenu par convolution avec un Sobel 3x3');
    Ce code que tu m’as donné consiste à n'utiliser que les gradients horizontaux et verticaux. Mais moi je veux aussi calculer les gradients obliques (donc direction 45° et 135°) à part les gradients horizontaux et verticaux. Comme je puisse le faire ??

  10. #30
    Membre du Club
    Inscrit en
    Septembre 2009
    Messages
    343
    Détails du profil
    Informations forums :
    Inscription : Septembre 2009
    Messages : 343
    Points : 44
    Points
    44
    Par défaut
    La 1ière méthode avec le max marche bien mais je veux savoir d’autre…

  11. #31
    Membre régulier Avatar de DocteurV
    Profil pro
    Développeur informatique
    Inscrit en
    Août 2009
    Messages
    85
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2009
    Messages : 85
    Points : 101
    Points
    101
    Par défaut
    Encore une fois, calculer les gradients obliques ne t'apporteras rien ! Y a-t-il une raison pour que tu tiennes tellement à les utiliser?

    Si tu comptes faire du traitement d'images, tu devrais peut-être te documenter un peu sur le concept de gradient et les principes mathématiques qui le régissent, car c'est l'un des outils les plus couramment utilisés : [ame="http://fr.wikipedia.org/wiki/Algorithme_de_Sobel"]http://fr.wikipedia.org/wiki/Algorithme_de_Sobel[/ame] ; [ame="http://fr.wikipedia.org/wiki/Gradient"]http://fr.wikipedia.org/wiki/Gradient[/ame]


    M'enfin, puisque tu tiens absolument à utiliser 4 dérivées, le code suivant devrait fonctionner, même si en définitive tu ne gagneras absolument rien à l'utiliser, et pire, tu vas alourdir ton programme et ralentir les calculs :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    s0 = [1 2 1; 0 0 0;-1 -2 -1];
    Gx = conv2 (imageOriginale, s0, 'same');
    s90 = [1 0 -1; 2 0 -2; 1 0 -1];
    Gy = conv2 (imageOriginale, s90, 'same');
     
    s45= [0 1 2; -1 0 1;-2 -1 0];
    G45 = conv2 (imageOriginale, s45, 'same');
    s135= [2 1 0; 1 0 -1; 0 -1 -2];
    G135 = conv2 (imageOriginale, s135, 'same');
     
    Gradient = sqrt(Gx.^2 + Gy.^2);
    Gradient_oblique = sqrt(G45.^2 + G135.^2);
     
    Gradient_global = max(Gradient, Gradient_oblique);
    PS : un conseil... essaye de faire des choses par toi même. Expérimente des techniques, documente-toi, applique les solutions d'anciens problèmes à des nouveaux, adapte d'anciens codes... Car dans le cas présent je t'avais déja donné le code pour calculer la norme d'un vecteur gradient dont les composantes étaient issues de deux dérivées orthogonales. Tu avais juste à faire pour G45 et G135 comme pour Gx et Gy...

  12. #32
    Membre du Club
    Inscrit en
    Septembre 2009
    Messages
    343
    Détails du profil
    Informations forums :
    Inscription : Septembre 2009
    Messages : 343
    Points : 44
    Points
    44
    Par défaut
    Merci bien DocteurV, vous étiez assez claire et je vous remerci infiniment vous m’avez aidé beaucoups...

Discussions similaires

  1. filtre de sobel en builder c++
    Par nano réta dans le forum C++Builder
    Réponses: 3
    Dernier message: 07/06/2011, 16h29
  2. Dérivée d'une image : gradients et filtre de Sobel
    Par betsprite dans le forum Traitement d'images
    Réponses: 12
    Dernier message: 22/12/2010, 20h54
  3. Différence entre filtre de sobel et détecteur de sobel
    Par hanane78 dans le forum Traitement d'images
    Réponses: 3
    Dernier message: 11/11/2010, 19h38
  4. Problème avec les filtres de Sobel
    Par TNT89 dans le forum Traitement d'images
    Réponses: 4
    Dernier message: 17/08/2010, 12h17
  5. filtre de sobel sur image jpg, ne marche pas (matlab)
    Par Imène_23 dans le forum Images
    Réponses: 7
    Dernier message: 20/05/2009, 23h36

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo