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. #1
    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 filtre de Sobel
    Salut, je débute en Matlab et je me suis un peu bloqué : j’ai appliqué l’opérateur Sobel dans 4 directions : S0°, S 90°, S45° et S135° en utilisant 4 masques et j’ai obtenu 4 images maintenant je veux garder dans mon image finale la valeur maximale de chaque pixel comme ce ci : imageOriginal * S = max (imageOriginal *S0, imageOriginal *S45, imageOriginal *S 90, imageOriginal*S135) avec * c’est l’opération de convolution.

    J’ai commencé avec ce code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    s0= [1 2 1; 0 0 0;-1 -2 -1];
    H0 = conv2 (imageOriginal, s0)
    figure,imshow(H0), title('Contours Sobel horizontal’);
    s90= [1 0 -1; 2 0 -2; 1 0 -1];
    H90 = conv2 (imageOriginal, s90);
    figure,imshow(H90), title('Contours Sobel vertical’);
    s45= [0 1 2; -1 0 1;-2 -1 0];
    H45 = conv2 (imageOriginal, s45);
    figure,imshow(H45), title('Contours Sobel 45°’);
    s135= [2 1 0; 1 0 -1; 0 -1 -2];
    H135 = conv2 (imageOriginal, s135);
    figure,imshow(H135), title('Contours Sobel  135°’);
    Mon problématique maintenant comment obtenir cette équation qui me permet de garder dans mon image final la valeur maximale de chaque pixel.
    imageOriginal * S = max (imageOriginal *S0, imageOriginal *S45, imageOriginal *S 90, imageOriginal*S135). ya-il quelqu'un qui peut m'aider????????

  2. #2
    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
    Salut slaima15,

    la commande "max" fonctionne aussi sur deux matrices :

    Tu gardes ton code :
    Code slaima15 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    s0= [1 2 1; 0 0 0;-1 -2 -1];
    H0 = conv2 (imageOriginal, s0);
    figure,imagesc(H0), title('Contours Sobel horizontal');
    s90= [1 0 -1; 2 0 -2; 1 0 -1];
    H90 = conv2 (imageOriginal, s90);
    figure,imagesc(H90), title('Contours Sobel vertical');
    s45= [0 1 2; -1 0 1;-2 -1 0];
    H45 = conv2 (imageOriginal, s45);
    figure,imagesc(H45), title('Contours Sobel 45°');
    s135= [2 1 0; 1 0 -1; 0 -1 -2];
    H135 = conv2 (imageOriginal, s135);
    figure,imagesc(H135), title('Contours Sobel  135°');
    Et tu termines simplement en faisant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    resultat = max(max(max(H0,H90),H45),H135);
    figure,imagesc(resultat), title('Contours Sobel global');
    a+

  3. #3
    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
    Ou :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    s0 = [1 2 1; 0 0 0;-1 -2 -1];
    H(:,:,1) = conv2 (imageOriginal, s0);
     
    s90 = [1 0 -1; 2 0 -2; 1 0 -1];
    H(:,:,2) = conv2 (imageOriginal, s90);
     
    s45 = [0 1 2; -1 0 1;-2 -1 0];
    H(:,:,3) = conv2 (imageOriginal, s45);
     
    s135 = [2 1 0; 1 0 -1; 0 -1 -2];
    H(:,:,4) = conv2 (imageOriginal, s135);
     
    S = max(H,[],3);
    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)

  4. #4
    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 Dut
    Ou :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    s0 = [1 2 1; 0 0 0;-1 -2 -1];
    H(:,:,1) = conv2 (imageOriginal, s0);
     
    s90 = [1 0 -1; 2 0 -2; 1 0 -1];
    H(:,:,2) = conv2 (imageOriginal, s90);
     
    s45 = [0 1 2; -1 0 1;-2 -1 0];
    H(:,:,3) = conv2 (imageOriginal, s45);
     
    s135 = [2 1 0; 1 0 -1; 0 -1 -2];
    H(:,:,4) = conv2 (imageOriginal, s135);
     
    S = max(H,[],3);
    En effet. Et c'est drôlement plus élégant

  5. #5
    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 DocteurV et Dut, mais avec ce code
    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];
    H0 = conv2 (imageOriginal, s0);
    figure,imagesc(H0), title('Contours Sobel horizontal');
    s90= [1 0 -1; 2 0 -2; 1 0 -1];
    H90 = conv2 (imageOriginal, s90);
    figure,imagesc(H90), title('Contours Sobel vertical');
    s45= [0 1 2; -1 0 1;-2 -1 0];
    H45 = conv2 (imageOriginal, s45);
    figure,imagesc(H45), title('Contours Sobel 45°');
    s135= [2 1 0; 1 0 -1; 0 -1 -2];
    H135 = conv2 (imageOriginal, s135);
    figure,imagesc(H135), title('Contours Sobel  135°');
    resultat = max(max(max(H0,H90),H45),H135);
    figure,imagesc(resultat), title('Contours Sobel global');


    L’image de « Contours Sobel global » qui me renvoie possède un taille plus grand et de couleur bleu (c-a-d ce n’est pas comme H0, H90, H45, H135) .je s’est pas est ce que c’est normal d’obtenir comme ça ?????
    Une autre problématique : comment je peux utiliser l’image « Contours Sobel global »qui contient les valeurs maximales de chaque pixel pour renforcer les détails de mon image originale ?????Pouvez-vous m’aider ???

  6. #6
    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 slaima15 Voir le message
    L’image de « Contours Sobel global » qui me renvoie possède un taille plus grand et de couleur bleu (c-a-d ce n’est pas comme H0, H90, H45, H135) .je s’est pas est ce que c’est normal d’obtenir comme ça ?
    C'est normale, du fait une convolution avec un filtre 3x3.
    Il y a donc un pixel en plus de chaque coté de ton image.

    Imagines toi simplement le filtre dont l'élément en bas à droite est positionné sur le premier pixel en haut à gauche.
    Son élément central se trouve bien en "dehors" de l'image

    Pour éviter cela, tu peux utiliser le paramètre 'same' dans CONV2

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    H0 = conv2 (imageOriginal, s0, 'same');
    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)

  7. #7
    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 Dut, j'ai obtenu avec ceci l'image "Contours Sobel global" correcte
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    s0= [1 2 1; 0 0 0;-1 -2 -1];
    H0 = conv2 (imageOriginal, s0);
    figure,imshow(H0), title('Contours Sobel horizontal');
    s90= [1 0 -1; 2 0 -2; 1 0 -1];
    H90 = conv2 (imageOriginal, s90);
    figure,imshow(H90), title('Contours Sobel vertical');
    s45= [0 1 2; -1 0 1;-2 -1 0];
    H45 = conv2 (imageOriginal, s45);
    figure,imshow(H45), title('Contours Sobel 45°');
    s135= [2 1 0; 1 0 -1; 0 -1 -2];
    H135 = conv2 (imageOriginal, s135);
    figure,imshow(H135), title('Contours Sobel  135°');
    resultat = max(max(max(H0,H90),H45),H135);
    figure,imshow(resultat), title('Contours Sobel global');
    maintenant passant à mon deuxieme problématique s-v-p
    comment je peux utiliser l’image « Contours Sobel global »qui contient les valeurs maximales de chaque pixel pour renforcer les détails de mon image originale ?????Pouvez-vous m’aider ???

  8. #8
    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
    comment je peux utiliser l’image « Contours Sobel global »qui contient les valeurs maximales de chaque pixel pour renforcer les détails de mon image originale ?????Pouvez-vous m’aider ???
    Il y a diverses façon de s'y prendre... l'une des plus simple consiste à soustraire la valeur absolue du résultat du Sobel de ton image d'origine, ce qui aura pour effet de noircir les hautes fréquences :

    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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
     
    s0 = [1 2 1; 0 0 0;-1 -2 -1];
    H(:,:,1) = conv2 (imageOriginale, s0, 'same');
    s90 = [1 0 -1; 2 0 -2; 1 0 -1];
    H(:,:,2) = conv2 (imageOriginale, s90, 'same');
    s45 = [0 1 2; -1 0 1;-2 -1 0];
    H(:,:,3) = conv2 (imageOriginale, s45, 'same');
    s135 = [2 1 0; 1 0 -1; 0 -1 -2];
    H(:,:,4) = conv2 (imageOriginale, s135, 'same');
    S = max(H,[],3);
     
    % Tu considère la valeur absolue de ton Sobel (puisque tu ne t'intéresse qu'à l'intensité du contour et pas à la direction)
    S = abs(S);
     
    % Tu rétablis les valeurs de S entre 0 et 255 (en supposant que ton image orignale soit en uint8... sinon tu adaptes ;))
    S2 = S - min(S(:));
    S2 = S2 ./ max(S2(:)) .* 255;
     
    % Tu soustrais cette matrice à ta matrice originale
    resultat = uint8(double(imageOriginale) - S2);
     
    % Affichage du résultat
    figure;
    subplot(1,2,1);
    imshow(imageOriginale);
    title('Image Originale');
    subplot(1,2,2);
    imshow(resultat);
    title('Contours Renforcés');
    Qu'est ce que tu en penses?
    a+

  9. #9
    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 DocteurV, mais l'image de countour "Contours Renforcés" qui me donne est une image noir avec quelque tâche c'est pas l'image que je veux obtenir : je veux obtenir mon image original exacte avec enfoncement du contours (dans le but d'améliorer le contraste).comment je puisse procéder?

  10. #10
    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
    Alors là tu m'étonnes un peu...
    Tu es sur que ton image est codée sur 8bits?

    J'ai à nouveaux testé le code que je t'ai donné hier et il fonctionne chez moi.

    Essaye de copier coller exactement le code suivant dans ta fenêtre de commande :

    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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
     
    warning off all;
    image = imread('peppers.png');
    imageOriginale = image(:,:,1);
     
    s0 = [1 2 1; 0 0 0;-1 -2 -1];
    H(:,:,1) = conv2 (imageOriginale, s0, 'same');
    s90 = [1 0 -1; 2 0 -2; 1 0 -1];
    H(:,:,2) = conv2 (imageOriginale, s90, 'same');
    s45 = [0 1 2; -1 0 1;-2 -1 0];
    H(:,:,3) = conv2 (imageOriginale, s45, 'same');
    s135 = [2 1 0; 1 0 -1; 0 -1 -2];
    H(:,:,4) = conv2 (imageOriginale, s135, 'same');
    S = max(H,[],3);
     
    % Tu considère la valeur absolue de ton Sobel (puisque tu ne t'intéresse qu'à l'intensité du contour et pas à la direction)
    S = abs(S);
     
    % Tu rétablis les valeurs de S entre 0 et 255 (en supposant que ton image orignale soit en uint8... sinon tu adaptes ;))
    S2 = S - min(S(:));
    S2 = S2 ./ max(S2(:)) .* 255;
     
    % Tu soustrais cette matrice à ta matrice originale
    resultat = uint8(double(imageOriginale) - S2);
     
    % Affichage du résultat
    figure;
    subplot(1,2,1);
    imshow(imageOriginale);
    title('Image Originale');
    subplot(1,2,2);
    imshow(resultat);
    title('Contours Renforcés');
    ...et dis moi si cet exemple fonctionne.

    Si oui c'est qu'il y a un problème avec le format de ton image.

  11. #11
    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
    Tu es sur que ton image est codée sur 8bits?
    Pour le savoir, il faudrait voir le résultat de :

    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)

  12. #12
    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
    Oui DocteurV, j’ai copié exactement le même code et j’ai obtenu le même résultat que précédemment : une image noir avec des tâches et ce n’est pas l’image voulu obtenir et voila le code que j’ai utilisé :

    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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
     
     
    imageOriginale = image(:,:,1);
     
    s0 = [1 2 1; 0 0 0;-1 -2 -1];
    H(:,:,1) = conv2 (imageOriginale, s0, 'same');
    s90 = [1 0 -1; 2 0 -2; 1 0 -1];
    H(:,:,2) = conv2 (imageOriginale, s90, 'same');
    s45 = [0 1 2; -1 0 1;-2 -1 0];
    H(:,:,3) = conv2 (imageOriginale, s45, 'same');
    s135 = [2 1 0; 1 0 -1; 0 -1 -2];
    H(:,:,4) = conv2 (imageOriginale, s135, 'same');
    S = max(H,[],3);
     
    % Tu considère la valeur absolue de ton Sobel (puisque tu ne t'intéresse qu'à l'intensité du contour et pas à la direction)
    S = abs(S);
     
    % Tu rétablis les valeurs de S entre 0 et 255 (en supposant que ton image orignale soit en uint8... sinon tu adaptes ;))
    S2 = S - min(S(:));
    S2 = S2 ./ max(S2(:)) .* 255;
     
    % Tu soustrais cette matrice à ta matrice originale
    resultat = double(imageOriginale) - S2;
     
    % Affichage du résultat
    figure;
    subplot(1,2,1);
    imshow(imageOriginale);
    title('Image Originale');
    subplot(1,2,2);
    imshow(resultat);
    title('Contours Renforcés');

    Dut voila que me retourne whos imageOriginale

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
        Name                 Size                    Bytes  Class
     
      imageOriginale     181x181            262088  double array
     
    Grand total is 32761 elements using 262088 bytes

  13. #13
    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
    voila l'image 'Contours Renforcés' que je l'obtient:

    Pièce jointe 54314

  14. #14
    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
    C'est bien ce que je pensais : pour que ca fonctionne... il faut que ton image soit en "uint8" (et donc avec des valeurs entre 0 et 255).

    Il y a deux cas possibles :
    Soit ton image est en "double" mais tes valeurs sont quand même comprises entre 0 et 255. Dans ce cas il te faut rajouter au début :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    imageOriginale = uint8(imageOriginale);
    Soit ton image est en "double" avec des valeurs comprises entre 0 et 1. Dans ce cas il te faut rajouter au début :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    imageOriginale = uint8(imageOriginale.*255);
    PS : As-tu essayé exactement l'exemple que je t'ai donné dans mon précédent post en l'appliquant à l'image de démo "peppers.png" ?? Si oui as-tu eu le même résultat avec peppers?

  15. #15
    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
    Mon image c’est au niveau de gris ce n’est pas le même cas que l’image de paper.png avec paper.png oui j’obtiens le résultat voulu correctement. Mais avec mon image non j’obtient pas…

    Pour plus de clarté voila le code que j’ai utilisé :
    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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
     
     
    imageOriginale = imread('im1.jpg');
     
    imageOriginale =double(imageOriginale)/255.0;
    imageOriginale = imageOriginale(:,:,1);
     
    s0 = [1 2 1; 0 0 0;-1 -2 -1];
    H(:,:,1) = conv2 (imageOriginale, s0, 'same');
    s90 = [1 0 -1; 2 0 -2; 1 0 -1];
    H(:,:,2) = conv2 (imageOriginale, s90, 'same');
    s45 = [0 1 2; -1 0 1;-2 -1 0];
    H(:,:,3) = conv2 (imageOriginale, s45, 'same');
    s135 = [2 1 0; 1 0 -1; 0 -1 -2];
    H(:,:,4) = conv2 (imageOriginale, s135, 'same');
    S = max(H,[],3);
     
    % Tu considère la valeur absolue de ton Sobel (puisque tu ne t'intéresse qu'à l'intensité du contour et pas à la direction)
    S = abs(S);
     
    % Tu rétablis les valeurs de S entre 0 et 255 (en supposant que ton image orignale soit en uint8... sinon tu adaptes ;))
    S2 = S - min(S(:));
    S2 = S2 ./ max(S2(:)) .* 255;
     
    % Tu soustrais cette matrice à ta matrice originale
    resultat = imageOriginale - S2;
     
    % Affichage du résultat
    figure;
    subplot(1,2,1);
    imshow(imageOriginale);
    title('Image Originale');
    subplot(1,2,2);
    imshow(resultat);
    title('Contours Renforcés');

  16. #16
    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
    imageOriginale =double(imageOriginale)/255.0;
    ---> c'est ça le problème dont je te parlais.

    Tu convertis ton image en double précision avec une dynamique maximale de [0. ; 1.].

    j'avais bien précisé :
    Citation Envoyé par DocteurV
    %Tu rétablis les valeurs de S entre 0 et 255 (en supposant que ton image orignale soit en uint8... sinon tu adaptes)
    Voilà pourquoi tu dois adapter le code à la dynamique et à la précision de ton image :

    remplace les lignes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    S2 = S2 ./ max(S2(:)) .* 255;
    resultat = uint8(double(imageOriginale) - S2);
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    S2 = S2 ./ max(S2(:));
    resultat = (imageOriginale - S2);

  17. #17
    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 DocteurV, j'ai obtenu le résultat correct mais je veux plus de clarté et de détails sur ces lignes car j'ai pas compris son signification et pourquoi l’en utilise
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    % Tu considère la valeur absolue de ton Sobel (puisque tu ne t'intéresse qu'à l'intensité du contour et pas à la direction)
    S = abs(S);
    S2 = S - min(S(:));
    S2 = S2 ./ max(S2(:))
    Et c'est quoi la signification de ceci:
    % Tu considère la valeur absolue de ton Sobel (puisque tu ne t'intéresse qu'à l'intensité du contour et pas à la direction)

  18. #18
    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
    Et c'est quoi la signification de ceci:
    % Tu considère la valeur absolue de ton Sobel (puisque tu ne t'intéresse qu'à l'intensité du contour et pas à la direction)
    Pour faire simple :
    Sobel calcule le gradient spatial de ton image. En chaque pixel le gradient est un vecteur qui indique la direction de la plus forte variation du clair au sombre, ainsi que le taux de changement dans cette direction.
    Concrètement, dans ton exemple, tu calcules
    • avec s0 : le gradient en x
    • avec s90 : le gradient en y
    • avec s45 : un gradient oblique
    • avec s135 : un gradient oblique orthogonal à s45


    Les deux premiers gradients te donnent pour chaque pixel de l'image, les coordonnées d'un vecteur. La norme de ce vecteur t'indique l'intensité de ton gradient. L'orientation de ce vecteur t'indique la direction du gradient.
    Idem pour les deux derniers gradients.

    Là où ça se complique, c'est qu'habituellement, on calcule la norme euclidienne des vecteurs pour déterminer l'intensité maximale du gradient en un pixel, et tu sais surement qu'une norme est par définition positive ou nulle. Or toi, tu as pris le parti d'utiliser le max des composantes de 4 gradients spatiaux orientés de 0° à 135°. Ca fonctionne aussi, même si on perds en précision, et surtout tu génère des valeurs négatives, que tu traite comme si elles étaient des normes.

    Au total, dans ton cas, ce n'est pas la valeur algébrique qui t'intéresse, mais la valeur absolue de tes composantes, puisque le signe ne sers qu'à indiquer la direction du gradient. D'autant qu'une intensité négative n'as pas vraiment de sens.

    Donc pour ne garder que les valeurs absolues du maximum des composantes des vecteurs gradients de ton image, tu dois faire :
    la commande abs étant l'opérateur de valeur absolue.

    Les deux lignes qui suivent servent juste à recadrer les valeurs de S entre 0 et 1 afin que la dynamique de ton image originale et la dynamique de S soient à peu près les même.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    %On recadre les valeurs entre 0 et max(S2);
    S2 = S - min(S(:));
    % On divise par max(S2) ce qui recadre les valeurs entre 0 et 1
    S2 = S2 ./ max(S2(:))
    Cette partie est un peu arbitraire. Un recadrage différents pourrait donner un résultat meilleur (ou moins bon).. Tu peux t'y essayer

    Si tu veux plus de détails sur les filtres de Sobel et le calcul ou l'usage des gradients spatiaux, il faudra passer sur le forum algorithmes de traitement d'image.

    a+

  19. #19
    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, Si je ne veux pas utiliser le max des composantes de 4 gradients spatiaux orientés de 0° à 135° par contre je veux obtenir la totalité des contours après l’application des 4 gradients spatiaux orientés de 0° à 135°, puis je veux l’utilisé pour améliorer le contraste de mon image… Comment je puisse procéder ?

  20. #20
    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
    Bon alors déja, pour que ton raisonnement actuel soit correct , il faudrait que tu récupère dans S le max des valeurs absolues de tes composantes :
    Tu verras ça marchera déja mieux.

    Sinon, la méthode classique consiste à n'utiliser que les gradients horizontaux et verticaux obtenus par convolution avec deux filtres de Sobel orthogonaux. Puis à considérer la norme des vecteurs correspondants :

    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');
    Tu remarqueras que cette matrice Gradient est similaire à la matrice S que tu calcules. Le reste du traitement reste inchangé:
    1. Tu recadres les valeurs de gradient dans la même dynamique que ton image.
    2. Tu soustrais aux intensités de ton image la valeur de gradient correspondante

    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
     
    % Recadrage de la dynamique entre 0 et 1.
    G2 = G - min(G(:));
    G2 = G2 ./ max(G2(:));
     
    % On soustrait l'intensité du gradient
    resultat = (imageOriginale - G2);
     
    % Affichage
    figure;
    subplot(1,2,1);
    imshow(imageOriginale);
    title('Image Originale');
    subplot(1,2,2);
    imshow(resultat);
    title('Contours Renforcés');

    voilà

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