Soutenez-nous
Publicité
+ Répondre à la discussion
Page 1 sur 2 12 DernièreDernière
Affichage des résultats 1 à 20 sur 32

Discussion: filtre de Sobel

  1. #1
    Candidat au titre de Membre du Club
    Inscrit en
    septembre 2009
    Messages
    297
    Détails du profil
    Informations forums :
    Inscription : septembre 2009
    Messages : 297
    Points : 11
    Points
    11

    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 :
    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 habitué Avatar de DocteurV
    Profil pro
    Développeur informatique
    Inscrit en
    août 2009
    Messages
    85
    Détails du profil
    Informations personnelles :
    Âge : 29
    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 :
    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 :
    1
    2
    3
    resultat = max(max(max(H0,H90),H45),H135);
    figure,imagesc(resultat), title('Contours Sobel global');
    a+

  3. #3
    Dut
    Dut est déconnecté
    Rédacteur/Modérateur

    Avatar de Dut
    Homme Profil pro Jérôme Briot
    Ingénieur hospitalier
    Inscrit en
    novembre 2006
    Messages
    17 123
    Détails du profil
    Informations personnelles :
    Nom : Homme Jérôme Briot
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur hospitalier
    Secteur : Santé

    Informations forums :
    Inscription : novembre 2006
    Messages : 17 123
    Points : 45 582
    Points
    45 582

    Par défaut

    Ou :

    Code :
    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);
    Sur mon blog : Sortie de Scilab 5.5.0 !

    Ma page personnelle avec mes contributions MATLAB (R2011b/R2014a - Windows, Linux et Mac) et Hardware

    « 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 habitué Avatar de DocteurV
    Profil pro
    Développeur informatique
    Inscrit en
    août 2009
    Messages
    85
    Détails du profil
    Informations personnelles :
    Âge : 29
    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 :
    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
    Candidat au titre de Membre du Club
    Inscrit en
    septembre 2009
    Messages
    297
    Détails du profil
    Informations forums :
    Inscription : septembre 2009
    Messages : 297
    Points : 11
    Points
    11

    Par défaut

    Merci DocteurV et Dut, mais avec ce code
    Code :
    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
    Dut
    Dut est déconnecté
    Rédacteur/Modérateur

    Avatar de Dut
    Homme Profil pro Jérôme Briot
    Ingénieur hospitalier
    Inscrit en
    novembre 2006
    Messages
    17 123
    Détails du profil
    Informations personnelles :
    Nom : Homme Jérôme Briot
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur hospitalier
    Secteur : Santé

    Informations forums :
    Inscription : novembre 2006
    Messages : 17 123
    Points : 45 582
    Points
    45 582

    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 :
    H0 = conv2 (imageOriginal, s0, 'same');
    Sur mon blog : Sortie de Scilab 5.5.0 !

    Ma page personnelle avec mes contributions MATLAB (R2011b/R2014a - Windows, Linux et Mac) et Hardware

    « 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
    Candidat au titre de Membre du Club
    Inscrit en
    septembre 2009
    Messages
    297
    Détails du profil
    Informations forums :
    Inscription : septembre 2009
    Messages : 297
    Points : 11
    Points
    11

    Par défaut

    Merci Dut, j'ai obtenu avec ceci l'image "Contours Sobel global" correcte
    Code :
    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 habitué Avatar de DocteurV
    Profil pro
    Développeur informatique
    Inscrit en
    août 2009
    Messages
    85
    Détails du profil
    Informations personnelles :
    Âge : 29
    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 :
    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
    Candidat au titre de Membre du Club
    Inscrit en
    septembre 2009
    Messages
    297
    Détails du profil
    Informations forums :
    Inscription : septembre 2009
    Messages : 297
    Points : 11
    Points
    11

    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 habitué Avatar de DocteurV
    Profil pro
    Développeur informatique
    Inscrit en
    août 2009
    Messages
    85
    Détails du profil
    Informations personnelles :
    Âge : 29
    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 :
    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
    Dut
    Dut est déconnecté
    Rédacteur/Modérateur

    Avatar de Dut
    Homme Profil pro Jérôme Briot
    Ingénieur hospitalier
    Inscrit en
    novembre 2006
    Messages
    17 123
    Détails du profil
    Informations personnelles :
    Nom : Homme Jérôme Briot
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur hospitalier
    Secteur : Santé

    Informations forums :
    Inscription : novembre 2006
    Messages : 17 123
    Points : 45 582
    Points
    45 582

    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 :

    Sur mon blog : Sortie de Scilab 5.5.0 !

    Ma page personnelle avec mes contributions MATLAB (R2011b/R2014a - Windows, Linux et Mac) et Hardware

    « 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
    Candidat au titre de Membre du Club
    Inscrit en
    septembre 2009
    Messages
    297
    Détails du profil
    Informations forums :
    Inscription : septembre 2009
    Messages : 297
    Points : 11
    Points
    11

    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 :
    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 :
    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
    Candidat au titre de Membre du Club
    Inscrit en
    septembre 2009
    Messages
    297
    Détails du profil
    Informations forums :
    Inscription : septembre 2009
    Messages : 297
    Points : 11
    Points
    11

    Par défaut

    voila l'image 'Contours Renforcés' que je l'obtient:

    Pièce jointe 54314

  14. #14
    Membre habitué Avatar de DocteurV
    Profil pro
    Développeur informatique
    Inscrit en
    août 2009
    Messages
    85
    Détails du profil
    Informations personnelles :
    Âge : 29
    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 :
    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 :
    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
    Candidat au titre de Membre du Club
    Inscrit en
    septembre 2009
    Messages
    297
    Détails du profil
    Informations forums :
    Inscription : septembre 2009
    Messages : 297
    Points : 11
    Points
    11

    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 :
    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 habitué Avatar de DocteurV
    Profil pro
    Développeur informatique
    Inscrit en
    août 2009
    Messages
    85
    Détails du profil
    Informations personnelles :
    Âge : 29
    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 :
    1
    2
    S2 = S2 ./ max(S2(:)) .* 255;
    resultat = uint8(double(imageOriginale) - S2);
    par
    Code :
    1
    2
    S2 = S2 ./ max(S2(:));
    resultat = (imageOriginale - S2);

  17. #17
    Candidat au titre de Membre du Club
    Inscrit en
    septembre 2009
    Messages
    297
    Détails du profil
    Informations forums :
    Inscription : septembre 2009
    Messages : 297
    Points : 11
    Points
    11

    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 :
    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 habitué Avatar de DocteurV
    Profil pro
    Développeur informatique
    Inscrit en
    août 2009
    Messages
    85
    Détails du profil
    Informations personnelles :
    Âge : 29
    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 :
    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
    Candidat au titre de Membre du Club
    Inscrit en
    septembre 2009
    Messages
    297
    Détails du profil
    Informations forums :
    Inscription : septembre 2009
    Messages : 297
    Points : 11
    Points
    11

    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 habitué Avatar de DocteurV
    Profil pro
    Développeur informatique
    Inscrit en
    août 2009
    Messages
    85
    Détails du profil
    Informations personnelles :
    Âge : 29
    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 :
    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 :
    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à

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •