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 :

Pertes d'informations sur l'image? [Débutant]


Sujet :

Images

  1. #1
    Membre du Club
    Inscrit en
    Juillet 2010
    Messages
    90
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 90
    Points : 60
    Points
    60
    Par défaut Pertes d'informations sur l'image?
    Bonjour,

    j'aurais voulu savoir si les fonctions que j'utilise me font perdre beaucoup d'information sur mon image.

    voici mon code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    [A,map]= dicomread(strcat(pathname,filename));
    imshow(A,[],'InitialMagnification',200);
     
    f=getframe(gca);
    img = frame2im(f);
    imwrite(img,'image.jpg','jpg')
    I=imread('image.jpg');
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    I=imread('image.jpg');
     
    iegal=histeq(I(:,:,1),256);
     
    imbina=im2bw(iegal,sliderValue);
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    figure(1),imshow(imbina);
     
    I1=impoly(gca,[]);
     
    bw=createMask(I1);
     
    imdbl=im2double(imbina);;

    Je vous remercie d'avance

    Karine

  2. #2
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 318
    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 318
    Points : 52 955
    Points
    52 955
    Par défaut
    Rien que dans le premier code, il y a 3 paramètres que tu manipules sans trop savoir comment (me semble-t-il )

    1) La résolution de l'image

    Tu demandes à MATLAB de t'afficher l'image à 200% puis tu captures l'affichage avec GETFRAME.
    Tu obtiens une image dont les dimensions sont double par rapport à l'image originale.

    Or, rien ne te dit que la technique d'interpolation utilisée par MATLAB pour augmenter la résolution de l'image ne soit la bonne. L'image contenue dans le fichier DICOM représente une grandeur physique. L'interpolation entre deux pixels peut être plus complexe que celle utilisée par IMWSHOW

    2) La classe utilisée pour le stockage des valeurs des pixels

    Les images sont généralement stockées sur 8 ou 16 bits non-signés (qui ne contiennent que des valeurs nulles ou positives) dont les échelles de valeurs possibles sont :
    • 8bits non-signés : [0 255]
    • 16bits non signés : [0 65535]


    Il faut donc déjà connaitre la façon dont sont codés les valeurs des pixels dans le fchier DICOM. Pour ce, tu dois utiliser la fonction DICOMINFO et trouver les valeurs des champs suivants :
    • 0028;0100;US;"Bits Allocated";
    • 0028;0101;US;"Bits Stored";


    De même pour l'écriture du fichier JPEG avec IMWRITE.
    Par défaut, IMWRITE encode les fichiers JPEG sur 8bits
    Il faut donc spécifier l'argument bitdepth à l'appel de IMWRITE :

    Par exemple pour des valeurs codées sur 16bits :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    imwrite(X,'test.jpg','jpg','bitdepth',16);
    Normalement et selon les versions, MATLAB devrait renvoyer une erreur si tu essaies d'écrire des valeurs uint16 en codage 8bits JPEG :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ??? Error using ==> writejpg>set_jpeg_props at 210
    UINT16 image data requires bitdepth specifically set to either 12 or 16.
    3) La perte d'informations à cause de la compression JPEG

    Par défaut, IMWRITE utilise le format JPEG "avec pertes" (lossy).
    C'est à dire que l'image enregistrée n'est pas identique à l'image d'entrée, il y a perte d'informations. Pour éviter ceci, il faut utiliser le mode "sans pertes" (lossless)

    Exemple :

    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
    >> X = uint8(rand(30)*255);
    >> imwrite(X,'test.jpg','jpg');
    >> t = imread('test.jpg');
    >> all(X(:)==t(:))
     
    ans =
     
         0
     
    >> imwrite(X,'test.jpg','jpg','mode','lossless');
    >> t = imread('test.jpg');
    >> all(X(:)==t(:))
     
    ans =
     
         1
    Et sinon... ma remarque à 0,02€... pourquoi passes-tu par le format JPEG pour traiter tes images ?

  3. #3
    Membre du Club
    Inscrit en
    Juillet 2010
    Messages
    90
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 90
    Points : 60
    Points
    60
    Par défaut
    tu manipules sans trop savoir comment (me semble-t-il )
    c'est pas faux je fais se que je peux avec ce que je trouve sur internet.
    je suis débutante et je galère vraiment a comprendre

    pourquoi passes-tu par le format JPEG pour traiter tes images ?
    j'utilise le format jpeg pour pouvoir mettre de la couleur sur mon image car je n'y arrivait pas avec l'image dicom

    pour les 200 c'est une erreur

    j'ai modifiée mon code pour ne pas passer par JPEG mais je me retrouve avec une erreur

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    ??? Error using ==> imageDisplayParseInputs>validateCData at 265
    RGB images must be uint8, uint16, single, or double.
     
    Error in ==> imageDisplayParseInputs at 202
    common_args.CData = validateCData(common_args.CData,image_type);
     
    Error in ==> imshow at 173
      [common_args,specific_args] = ...
     
    Error in ==> Untitled at 32
     imshow(imred);
    voici mon code corrigé (mais tjs faux):

    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
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    %demande ouverture fichier
     IM = fileparts(mfilename('fullpath'));
    [filename,pathname]=uigetfile({'*.*','All Files' },'Choisir le fichier dicom ');
     
     %lire fichier dicom
    [A,map]= dicomread(strcat(pathname,filename));
     dicominfo(strcat(pathname,filename))
     
     %afficher l'image dicom
     imshow(A,[]);
     
     imred=A;
     %egalisation de l'histogramme
    iegal=histeq(A(:,:,1),256);
     
    %binarisation de l'image
     imbina=im2bw(iegal,0.85);
     imshow(imbina);
     
     
     %masque en rouge sur image
    for i= 1:size(imbina,1)
        for j=1:size(imbina,2)
            if imbina(i,j)==1
                imred(i,j,1)=255;
                imred(i,j,2)=0;
                imred(i,j,3)=0;
            end
        end
    end
     imshow(imred);
     
     
    % %selection de la region d'interet et visualisation
    I1=impoly(gca,[]);
    % %creation du masque correspondant
     bw=createMask(I1);
     imdbl=im2double(imbina);
    % %enlever les points isolees
     imfil=medfilt1(imdbl);
    % %multiplie l'image et le masque
     for i=1:size(bw,1)
        for j=1:size(bw,2)
            imresult(i,j)=bw(i,j)*imfil(i,j);
        end
    end
    imshow(imresult);

  4. #4
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 318
    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 318
    Points : 52 955
    Points
    52 955
    Par défaut
    D'où ma remarque :
    Citation Envoyé par Dut Voir le message
    Il faut donc déjà connaitre la façon dont sont codés les valeurs des pixels dans le fchier DICOM. Pour ce, tu dois utiliser la fonction DICOMINFO et trouver les valeurs des champs suivants :
    • 0028;0100;US;"Bits Allocated";
    • 0028;0101;US;"Bits Stored";
    Que retourne ceci ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    f = dicominfo(fullfile(pathname,filename));
    f.BitsAllocated
    f.BitsStored

  5. #5
    Membre du Club
    Inscrit en
    Juillet 2010
    Messages
    90
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 90
    Points : 60
    Points
    60
    Par défaut
    oh pardon c’est 16 pour les deux

  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 318
    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 318
    Points : 52 955
    Points
    52 955
    Par défaut
    Et que retourne ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    X = dicomread(fullfile(pathname,filename));
    [min(X(:)) max(X(:))]

  7. #7
    Membre du Club
    Inscrit en
    Juillet 2010
    Messages
    90
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 90
    Points : 60
    Points
    60
    Par défaut
    Pour toutes mes images j'ai
    f.BitsAllocated = 16
    f.BitsStored =16

    cependant selon mes images je peux trouver comme min et comme max:

    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
    ans =
     
      -1765   3311
     
    ans =
     
      -1832   3351
     
    ans =
     
      -1719   1171
     
    ans =
     
      -1903   1040

  8. #8
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 318
    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 318
    Points : 52 955
    Points
    52 955
    Par défaut
    Tu as donc des images codées en classe int16 et leurs échelles de valeurs varient entre 3000 et 5000 valeurs.

    Es-tu donc sure de vouloir utiliser HISTEQ sur 256 valeurs seulement ?

  9. #9
    Membre du Club
    Inscrit en
    Juillet 2010
    Messages
    90
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 90
    Points : 60
    Points
    60
    Par défaut
    Citation Envoyé par Dut Voir le message
    Es-tu donc sure de vouloir utiliser HISTEQ sur 256 valeurs seulement ?
    je ne sais pas mais je ne vois pas de différence quand je change pour 3000 ou 5000

    mon but était de mettre mes images au même 'niveaux' pour pouvoir isoler la même chose avec mon seuil

    faut il que j'utilise 3000 plutôt?

    comment on fait pour passer de int16 a uint16? j'ai trouver cette fonction mais je ne comprend pas le -1 : typecast(int16(-1), 'uint16')

  10. #10
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 318
    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 318
    Points : 52 955
    Points
    52 955
    Par défaut
    Citation Envoyé par kbazin Voir le message
    mon but était de mettre mes images au même 'niveaux' pour pouvoir isoler la même chose avec mon seuil
    Je n'ai peut être pas tout compris mais pour moi ça pas guère de sens...

    En gros, en faisant cela, tu supposes que les valeurs maximales de chaque image correpondent au même tissu, c'est faux.

    Par exemple (et par l'absurde), imagine que ton image ne contienne que de l'air et donc avec des valeurs de pixel voisines de tes minimums ([-1900 -1700]). Si tu appliques ton idée, tu feras la correspondance malheureuse entre de l'air et des tissus durs (type os cortical) dans le cas d'images CT.

    Etudie les résultats de ce bout de code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    X1 = int16(rand(3)*5000-1500)
    X2 = int16(rand(3)*3000-3000)
     
    Y1 = histeq(X1,256)
    Y2 = histeq(X2,256)
    Citation Envoyé par kbazin Voir le message
    comment on fait pour passer de int16 a uint16? j'ai trouver cette fonction mais je ne comprend pas le -1 : typecast(int16(-1), 'uint16')
    Dans ton cas, il n'y a pas besoin de faire si compliqué.
    Puisque la plage de valeur est toujours très inféreure (entre 3000 et 5000) à la plage de valeur que l'on peut stocker dans un uint16 (65536 valeurs), tu peux faire directement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    X = int16(rand(5)*5000-1500) % Matrice exemple
     
    X = uint16(X-min(X(:)))

  11. #11
    Membre du Club
    Inscrit en
    Juillet 2010
    Messages
    90
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 90
    Points : 60
    Points
    60
    Par défaut
    En gros, en faisant cela, tu supposes que les valeurs maximales de chaque image correpondent au même tissu, c'est faux.

    Par exemple (et par l'absurde), imagine que ton image ne contienne que de l'air et donc avec des valeurs de pixel voisines de tes minimums ([-1900 -1700]). Si tu appliques ton idée, tu feras la correspondance malheureuse entre de l'air et des tissus durs (type os cortical) dans le cas d'images CT.
    je sais mais le problème est que mes images sont totalement différentes et je veux isoler l'os sur chacune de façon automatique
    le seuil varie trop sans faire histeq j'utilise cette fonction pour mettre a blanc les parties osseuses et après un test sur plus de 50 images je me retrouve avec un seuil quasi identique pour chaque image
    c'est la seule chose que j'ai trouvé et qui marchait de manière répétitive


    Pour le changement de format ça ne marche plus mon code
    j'ai essayer avec votre proposition mais a la place de me colorer en rouge sur mon image de départ les pixel qui sont blanc sur l'image binarisée j'ai un carré noir

    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
    36
    %demande ouverture fichier
     IM = fileparts(mfilename('fullpath'));
    [filename,pathname]=uigetfile({'*.*','All Files' },'Choisir le fichier dicom ');
     
     %lire fichier dicom
    [A,map]= dicomread(strcat(pathname,filename));
     dicominfo(strcat(pathname,filename))
     
     %afficher l'image dicom
     figure,imshow(A,[]);
     
     
     %egalisation de l'histogramme
    iegal=histeq(A(:,:,1),2000);
    figure,imshow(iegal);
     
    %binarisation de l'image
     imbina=im2bw(iegal,0.85);
     figure,imshow(imbina);
     
     
     
     X = int16(A); 
    imred = uint16(X-min(X(:)));
     
      %masque en rouge sur image
    for i= 1:size(imbina,1)
        for j=1:size(imbina,2)
            if imbina(i,j)==1
                imred(i,j,1)=255;
                imred(i,j,2)=0;
                imred(i,j,3)=0;
            end
        end
    end
     figure,imshow(imred);

  12. #12
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 318
    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 318
    Points : 52 955
    Points
    52 955
    Par défaut
    Que renvoie ceci ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    [A,map] = dicomread(fullfile(pathname,filename));
    whos A map

  13. #13
    Membre du Club
    Inscrit en
    Juillet 2010
    Messages
    90
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 90
    Points : 60
    Points
    60
    Par défaut
    voici se que cela retourne:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Name         Size                Bytes  Class     Attributes
     
      A         1024x1024            2097152  int16               
      map          0x0                     0  double

  14. #14
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 318
    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 318
    Points : 52 955
    Points
    52 955
    Par défaut
    Donc la ligne suivante

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    iegal=histeq(A(:,:,1),2000);
    se simplifie en
    Et la ligne suivante est inutile :

    Ensuite, tu utilises le codage (255,0,0) pour mettre la couleur rouge sur les pixels... or ceci est vrai pour des images codées sur 8bits (255 étant la valeur maximale). Pour des images codées sur 16bits, tu dois remplacer 255 par la valeur maximale disponible, soit 65535.

    Esssaie ceci :

    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
    X = zeros(2,2,3,'uint8');
    X(1) = 255;
     
    figure
    s = subplot(311);
    imshow(X,'parent',s)
    title('uint8 - premier pixel (255,0,0)')
     
    X = uint16(X);
    s = subplot(312);
    imshow(X,'parent',s)
    title('uint16 - premier pixel (255,0,0)')
     
    X(1) = 65535;
    s = subplot(313);
    imshow(X,'parent',s)
    title('uint16 - premier pixel (65535,0,0)')
    Comprends-tu ?

  15. #15
    Membre du Club
    Inscrit en
    Juillet 2010
    Messages
    90
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 90
    Points : 60
    Points
    60
    Par défaut
    je pense que je ne dois pas tout comprendre car je n'y arrive pas

    j'ai bien compris pourquoi cela n’était pas 255 mais ce que je ne comprend pas sur mes images c'est pourquoi quand je passe en 16 bits l'image n'est pas la même que celle en int16
    et la deuxième chose est pourquoi j’obtiens une image colorée toute en rouge alors qu'avant j'arrivai s a faire apparaître en rouge que m'a région d’intérêt

    mon code est ci dessous et je vous joint les images résultats pour mieux comprendre.

    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
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    clc
    %demande ouverture fichier
     IM = fileparts(mfilename('fullpath'));
    [filename,pathname]=uigetfile({'*.*','All Files' },'Choisir le fichier dicom ');
     
     %lire fichier dicom
    [A,map]= dicomread(strcat(pathname,filename));
     %dicominfo(strcat(pathname,filename))
     
     %afficher l'image dicom
    s = subplot(321);
    imshow(A,[],'parent',s);
    title('image originale / int16')
     
     
     
     %egalisation de l'histogramme
    iegal=histeq(A,2000);
    s = subplot(322);
    imshow(iegal,'parent',s);
    title('image avec egalisation de l''histogramme / int 16')
     
     
    %binarisation de l'image
     imbina=im2bw(iegal,0.85);
     s = subplot(323);
    imshow(imbina,'parent',s);
    title('image binarisee / logical')
     
     imred=iegal;
    imred = uint16(imred);
     
    s = subplot(324);
    imshow(imred,'parent',s);
    title('image avec egalisation histo / uint16')
     
     
      %masque en rouge sur image
    for i= 1:size(imbina,1)
        for j=1:size(imbina,2)
            if imbina(i,j)==1
                imred(i,j,1)=65535; %valeur maximal sur 16 bits
                imred(i,j,2)=0;
                imred(i,j,3)=0;
            end
        end
    end
     s = subplot(325);
    imshow(imred,'parent',s);
    title('coloration rouge de ma region binarisee sur mon image / uint16')
    Images attachées Images attachées   

  16. #16
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 318
    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 318
    Points : 52 955
    Points
    52 955
    Par défaut
    J'arrive à peu près à comprendre ce que tu fais dans la première partie du 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
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    clc
    %demande ouverture fichier
     IM = fileparts(mfilename('fullpath'));
    [filename,pathname]=uigetfile({'*.*','All Files' },'Choisir le fichier dicom ');
     
     %lire fichier dicom
    [A,map]= dicomread(strcat(pathname,filename));
     %dicominfo(strcat(pathname,filename))
     
     %afficher l'image dicom
    s = subplot(321);
    imshow(A,[],'parent',s);
    title('image originale / int16')
     
     %egalisation de l'histogramme
    iegal=histeq(A,2000);
    s = subplot(322);
    imshow(iegal,'parent',s);
    title('image avec egalisation de l''histogramme / int 16')
     
     %binarisation de l'image
     imbina=im2bw(iegal,0.85);
     s = subplot(323);
    imshow(imbina,'parent',s);
    title('image binarisee / logical')
    Ensuite, j'avoue que je ne comprends pas bien pourquoi tu appliques le masque binaire imbina à l'image égalisée iegal ?
    Tu devrais l'appliquer sur l'image initiale A, non ?

    Et quel est le but final de l'application de la couleur rouge sur ton image ?
    Est-ce juste pour la visualisation ou comptes-tu enregistrer l'image finale ?

    Dans le premier cas, tu peux t'inspirer de cette contribution : Colorer les contours obtenus avec la fonction EDGE

  17. #17
    Membre du Club
    Inscrit en
    Juillet 2010
    Messages
    90
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 90
    Points : 60
    Points
    60
    Par défaut
    Ensuite, j'avoue que je ne comprends pas bien pourquoi tu appliques le masque binaire imbina à l'image égalisée iegal ?
    Tu devrais l'appliquer sur l'image initiale A, non ?
    pourquoi pas mais de toute façon cela devrait être pareil

    Et quel est le but final de l'application de la couleur rouge sur ton image ?
    Est-ce juste pour la visualisation ou comptes-tu enregistrer l'image finale ?
    c'est en effet juste pour visualiser car par la suite le seuil varie avec un slider

  18. #18
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 318
    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 318
    Points : 52 955
    Points
    52 955
    Par défaut
    Citation Envoyé par kbazin Voir le message
    pourquoi pas mais de toute façon cela devrait être pareil
    Je pense que tu dois faire apparaitre des valeurs parasites avec HISTEQ.
    C'est à dire que iegal contient des valeurs suffisament élevée pour que le couple (val,0,0) soit considérée comme une nuance de rouge

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    X = uint16(linspace(0,65535,10))
    X(:,:,2) = 0;
    X(:,:,3) = 0;
     
    imshow(X,'InitialMagnification','fit')
    Citation Envoyé par kbazin Voir le message
    c'est en effet juste pour visualiser car par la suite le seuil varie avec un slider
    Dans ce cas, il vaut mieux superposer la couleur sur l'image initiale comme je l'ai décrit ici : http://www.developpez.net/forums/d76...e/#post4420434

    Il suffit juste de transformer le masque binaire en masque de couleur.

    C'est bien plus pratique car la valeur des pixels de l'image d'origine ne change pas

  19. #19
    Membre du Club
    Inscrit en
    Juillet 2010
    Messages
    90
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 90
    Points : 60
    Points
    60
    Par défaut
    c'est cool cela marche super bien

    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
    clc
    %demande ouverture fichier
     IM = fileparts(mfilename('fullpath'));
    [filename,pathname]=uigetfile({'*.*','All Files' },'Choisir le fichier dicom ');
     
     %lire fichier dicom
    [A,map]= dicomread(strcat(pathname,filename));
     %dicominfo(strcat(pathname,filename))
     
     %afficher l'image dicom
    imshow(A,[]);
     
     
     %egalisation de l'histogramme
    iegal=histeq(A,2000);
     
    %binarisation de l'image
     imbina=im2bw(iegal,0.85);
     
    %visualisation de l'image avec de la coloration rouge pour le masque
    %binaire
    figure, imshow (A,[]);
    hold on
    cmap=[0 0 0
          1 0 0];
     
      Argb=ind2rgb(imbina,cmap);
    h=imshow(Argb);
     set(h,'alphadata',imbina)

    mais quand je le passe dans mon code avec le slider les deux images doivent s'afficher dans un même gui
    l'original dans l'axes1 et celle colorée dans l'axes 2
    mais a la place de colorer sur l'image dans l'axes 2, l'image disparaît et on ne voit plus que la couleur.
    il faut peut être utiliser une fonction pour dire d'afficher les deux, cela existe?






    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
    % --- Executes on button press in pushbuttondicom.
    function pushbuttondicom_Callback(hObject, eventdata, handles)
    % hObject    handle to pushbuttondicom (see GCBO)
    % eventdata  reserved - to be defined in a future version of MATLAB
    % handles    structure with handles and user data (see GUIDATA)
    global imbina imresult bw A
    %demande ouverture fichier
     IM = fileparts(mfilename('fullpath'));
    [filename,pathname]=uigetfile({'*.*','All Files' },'Choisir le fichier dicom ');
     
    %lire fichier dicom
    [A,map]= dicomread(strcat(pathname,filename));
    % dicominfo(strcat(pathname,filename))
     
    %afficher l'image dicom
    imshow(A,[]);





    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
     
    % --- Executes on slider movement.
    function slider1_Callback(hObject, eventdata, handles)
    global imbina imresult bw A
    % hObject    handle to slider1 (see GCBO)
    % eventdata  reserved - to be defined in a future version of MATLAB
    % handles    structure with handles and user data (see GUIDATA)
     
    % Hints: get(hObject,'Value') returns position of slider
    %        get(hObject,'Min') and get(hObject,'Max') to determine range of slider
     
    %  valeur de la composante curseur 
     sliderValue = get (handles. slider1, 'value');
     
     % Place la valeur dans le curseur de modifier le texte composante
     set (handles. slider_editText, 'string', num2str (sliderValue));
    guidata(hObject,handles);
     
     
    %egalisation de l'histogramme
    iegal=histeq(A,2000);
     %binarisation de l'image
    imbina=im2bw(iegal,sliderValue);
     
    %visualisation de la binarisation en rouge sur l'image originale
     imshow(A,[],'parent',handles.axes2);
    hold on
    cmap=[0 0 0
            1 0 0];
    Argb=ind2rgb(imbina,cmap);
    h=imshow(Argb,'parent',handles.axes2);
    set(h, 'alphadata', imbina)
    Images attachées Images attachées  

  20. #20
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 318
    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 318
    Points : 52 955
    Points
    52 955
    Par défaut
    Une solution :
    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
     
    % --- Executes on button press in pushbuttondicom.
    function pushbuttondicom_Callback(hObject, eventdata, handles)
    % hObject    handle to pushbuttondicom (see GCBO)
    % eventdata  reserved - to be defined in a future version of MATLAB
    % handles    structure with handles and user data (see GUIDATA)
    global imbina imresult bw A
    %demande ouverture fichier
     IM = fileparts(mfilename('fullpath'));
    [filename,pathname]=uigetfile({'*.*','All Files' },'Choisir le fichier dicom ');
     
    %lire fichier dicom
    [A,map]= dicomread(fullfile(pathname,filename));
     
    %afficher l'image dicom
    imshow(A,[]);
     
    axes(handles.axes2)
    handles.img = imshow(A);
    hold on
    handles.mask = imshow(nan);
    guidata(gcbf,handles)
    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
     
    % --- Executes on slider movement.
    function slider1_Callback(hObject, eventdata, handles)
    global imbina imresult bw A
    % hObject    handle to slider1 (see GCBO)
    % eventdata  reserved - to be defined in a future version of MATLAB
    % handles    structure with handles and user data (see GUIDATA)
     
    % Hints: get(hObject,'Value') returns position of slider
    %        get(hObject,'Min') and get(hObject,'Max') to determine range of slider
     
    %  valeur de la composante curseur 
     sliderValue = get (handles. slider1, 'value');
     
     % Place la valeur dans le curseur de modifier le texte composante
     set (handles. slider_editText, 'string', num2str (sliderValue));
    guidata(hObject,handles);
     
     
    %egalisation de l'histogramme
    iegal=histeq(A,2000);
     %binarisation de l'image
    imbina=im2bw(iegal,sliderValue);
     
    %visualisation de la binarisation en rouge sur l'image originale
     
    cmap=[0 0 0
            1 0 0];
    Argb=ind2rgb(imbina,cmap);
    set(handles.mask,'cdata',Argb, 'alphadata', imbina)
    Enfin... c'est l'idée

    Et s'il te plait... utilise FULLFILE à la place de STRCAT... => : Comment concaténer le nom d'un fichier et celui d'un répertoire ?

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Perte d'informations sur des images de format DICOM
    Par gwal21 dans le forum Images
    Réponses: 12
    Dernier message: 15/02/2011, 15h58
  2. comment obtenir des informations sur des images
    Par thor76160 dans le forum C#
    Réponses: 1
    Dernier message: 15/05/2009, 12h37
  3. Réponses: 5
    Dernier message: 12/03/2009, 12h54
  4. Informations sur une image
    Par bahaaldine dans le forum 2D
    Réponses: 2
    Dernier message: 02/02/2008, 13h00
  5. Information juridique sur les images
    Par c+cool dans le forum Droit
    Réponses: 8
    Dernier message: 29/06/2007, 15h04

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