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 :

Identifier differentes regions d'interet sur une image


Sujet :

Images

  1. #1
    Candidat au Club
    Inscrit en
    Août 2009
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 8
    Points : 2
    Points
    2
    Par défaut Identifier differentes regions d'interet sur une image
    Bonjour,

    Etant débutante, toute aide me serait precieuse.

    Voila, J'ai une image sur laquelle je voudrai définir une region d'interet avec la comande (imrect), afin de calculer la moyenne de la valeur des pixels dans cette region d'interet. Cependant, je voudrai changer de position au rectangle créé avec la souris pour recalculer la moyenne.

    1- commnet dois_je redéfinir la position du rectangle (apres le mouvement de la souris) ?

    2- Y'a t-il un moyen plus facile qu'avec la commande (imrect)?

  2. #2
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    29
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2009
    Messages : 29
    Points : 23
    Points
    23
    Par défaut
    Salut!

    Est-ce que ton but est seulement de savoir la moyenne sur une zone ou est-ce que tu dois faire celle-ci afin d'effectuer un traitement sur l'image initiale?
    Si tu veux seulement la moyenne, suivant ta version de Matlab, la fonction "imcrop" permet de créer un rectangle similaire à la fonction "imrect", sauf que lorsque tu double clique dessus elle créé une nouvelle image avec la zone délimitée par le rectangle. Il ne resterait plus qu'à faire la moyenne sur la nouvelle image...
    De plus, dans le cas où tu voudrais replacer ce morceau dans l'image, tu peux récupérer les coordonnées du rectangle en faisant "clic droit" et "copy position". Le petit "hic" est que ces coordonnées ne s'enregistre pas dans le workspace mais dans le presse papier. Je n'ai jamais essayé mais apparemment il est possible d'utiliser la fonction "clipboard" pour en récupére le contenu.

  3. #3
    Candidat au Club
    Inscrit en
    Août 2009
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 8
    Points : 2
    Points
    2
    Par défaut
    merci de ton interet,

    Mon but ultime est de construire un GUI qui me permettrait de faire l'analyse d'une image. Pour ce faire, jai donc besoin de m'arreter sur plusieurs regions de l'image, pour prendre la valeur moyenne de celleci et la mettre dans un list box.

    j'ai pensé que cropper l'image serait plus compliqué, mais jessaierai toute proposition. Encore une fois, mon probleme, c comment je bouge ma souris sur l'image tout en ayant en memoire les coordonnées de la region d'interet.

    merci

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    29
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2009
    Messages : 29
    Points : 23
    Points
    23
    Par défaut
    Si j'ai bien compris, tu souhaites choisir la zone d'intérêt "à la souris", puis calculer la moyenne de celle-ci et en récupérer la position sur l'image, c'est ça?
    Voici ce que je ferais si je devais faire la même chose:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    I = imread('cathe1.jpg');   % Ouverture de l'image
     
    axes(handles.axes1)         % Sélection de l'axe de l'interface
    imshow(I)                   % Affichage de l'image
    J=imcrop(I);                % Affichage du rectangle
     
    % Il faut maintenant placer le rectangle sur la zone d'intérêt
    % PUIS faire "clic droit" + "copy position" PUIS "double clic" sur le rectangle 
     
    position = clipboard('paste');  % Récupération de la position sous forme de "string"
     
    % Il ne reste plus qu'à effectuer la moyenne sur J et afficher le résultat
    % sur l'interface ainsi que d'afficher la position récupérée dans la
    % listbox.
    J'espère que ça t'aide...

    A +

  5. #5
    Candidat au Club
    Inscrit en
    Août 2009
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 8
    Points : 2
    Points
    2
    Par défaut definir plusieurs regions d'interet
    Salut Khaptain,

    ton code est valable si je voulais une seule region d'interet. Je m'explique:

    Sur mon image, il y'a plusieurs endroits ou je veux calculer la moyenne. Apres l'avoir fait sur une region une fois, je voudrai le faire sur une autre region en bougeant le rectangle (c pour ca que javais pensé à imrect au départ), et sans avoir à réécrire imcrop une autre fois.

    Avec imrect, je peux me déplacer plusieurs fois, sans avoir à réécrire imrect, mais je ne sais pas par quelle commande je dois spécifier que ma région d'interet a changé.

    (donc ce nest pas les coordonnées de la nouvelles region d'interet que je veux sauvegarder, mais juste la redéfinir pour etre réutilisée par imrect ou imcrop...

    Peut etre que je devrais le faire déja sur un pushbutton plusieurs fois...?

    merci encore

  6. #6
    Candidat au Club
    Inscrit en
    Août 2009
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 8
    Points : 2
    Points
    2
    Par défaut
    Je pense que ceci résume bien mon problème:


    si je prends l'exemple du help suivant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    figure, imshow('cameraman.tif');
    h = imrect(gca, [10 10 100 100]);
    api = iptgetapi(h);
    api.addNewPositionCallback(@(p) title(mat2str(p)));


    alors, je peux changer la taille et la position du rectangle défini initialement par h. Aussi bien la position et la taille seront affichée sur le haut de l'image.
    Mon probleme se résume à lire cette position et la taille à chaque fois que je définis ou je mets ce rectangle de taille prédéfinie.

    Par quelle commande je dois le faire.

    j'ai pensé:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    x=api.addNewPositionCallback(@(p) title(mat2str(p)));
    mais ' api.addNewPositionCallback(@(p) title(mat2str(p)));' est une structure...je ne comprends pas...


    est ce que c'est plus clair?

    merci

  7. #7
    Candidat au Club
    Inscrit en
    Août 2009
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 8
    Points : 2
    Points
    2
    Par défaut réponse
    Désolée, j'ai simplement mal cherché...

    il s'agit de : position = api.getPosition()

    Merci encore de ton attention Khaptain

  8. #8
    Candidat au Club
    Inscrit en
    Août 2009
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 8
    Points : 2
    Points
    2
    Par défaut
    cependant, mon problème n'est pas encore entièrement résolu.
    je ne veux pas écrire (get position) à chaque fois que je change de position à mon rectangle.

    Il me semble qu'à ce stade je dois le faire sur un push button. Il me reste à trouver la commande qui dans le callback me permet de reprendre (get position).

    je débute vraiment avec les GUI, j'apprécierai tout coup de pouce

  9. #9
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 309
    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 309
    Points : 52 896
    Points
    52 896
    Par défaut
    Regarde les propriétés WindowButtonDownFcn, WindowButtonMotionFcn et WindowButtonUpFcn de l'objet Figure

  10. #10
    Candidat au Club
    Inscrit en
    Août 2009
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 8
    Points : 2
    Points
    2
    Par défaut definir plusieurs regions d'interet sur un GUI
    Merci Dut,

    Voila, mon GUI contient un uicontrol (axe) et un (pushbutton).
    Avec le bouton, j'ouvre ma figure sur (axe).

    sur le Buttondown function, j,ecris ce simple 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
    % --- Executes on mouse press over figure background.
    function figure1_ButtonDownFcn(hObject, eventdata, handles)
    % hObject    handle to figure1 (see GCBO)
    % eventdata  reserved - to be defined in a future version of MATLAB
    % handles    structure with handles and user data (see GUIDATA)
     
    film=handles.film;
    filmr=film(:,:,1);
     imagesc(film);
    % N=zeros(10,10);
    % N=xlswrite('data.xls',N);
    h = imrect(gca, [10 10 100 100]);
    api = iptgetapi(h);
    api.addNewPositionCallback(@(p) title(mat2str(p)));
     
    position=api.getPosition();
    c=position(1);r=position(2),C=position(3);R=position(4);
    x=mean2(filmr(r:R+r-1,c:C+c-1));
    % N(1,1)=x;
    En faisant ca, position sera [10 10 100 100] unisquement, meme si je drague ma souris, et reclique plusieurs fois sur Buttondown.

    Pourais_tu m'aider STP? je ne comprends pas encore tres bien les proprietes des objets.

  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 309
    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 309
    Points : 52 896
    Points
    52 896
    Par défaut
    Citation Envoyé par Dut Voir le message
    Regarde les propriétés WindowButtonDownFcn, WindowButtonMotionFcn et WindowButtonUpFcn de l'objet Figure
    Je préfère cette bonne vieille méthode :

    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
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    function test
     
        fig = figure;
        movegui(fig,'center');
     
        handles = load('clown.mat');
        colormap(handles.map);
     
        handles.im = imagesc(handles.X);
        axis image
     
        set(fig,'windowbuttondownfcn',@wbdfcn);
     
        guidata(fig,handles);
     
    function wbdfcn(obj,event)
     
        handles = guidata(obj);
     
        hold on
     
        pt1 = get(gca,'CurrentPoint');
        handles.ROI = rbbox;
        pt2 = get(gca,'CurrentPoint');
     
        handles.ROI = round([pt1(1,2) pt1(1,1) pt2(1,2) pt2(1,1)]);
     
        handles.r = rectangle('position',[pt1(1,1) pt1(1,2) pt2(1,1)-pt1(1,1) pt2(1,2)-pt1(1,2)]);
        set(handles.r,'linewidth',4,'edgecolor','g')
     
        handles.anchor = plot(pt1(1,1),pt1(1,2),'rs');
     
        set(handles.anchor,'markerfacecolor','r', ...
            'markersize',12, ...
            'buttondownfcn',@anchbdfcn)
     
        set(obj,'windowbuttondownfcn','');
     
        guidata(obj,handles);
     
        mR = meanROI;
        disp(mR);
     
    function wbmfcn(obj,event)
     
        handles = guidata(obj);
     
        pt = get(gca,'CurrentPoint');
        set(handles.anchor,'xdata',pt(1,1),'ydata',pt(1,2));
     
        pos = get(handles.r,'position');
        set(handles.r,'position',[pt(1,1:2) pos(3:4)])
     
        handles.ROI = round([pt(1,2) pt(1,1) pt(1,2)+pos(4) pt(1,1)+pos(3)]);
     
        guidata(obj,handles);
     
    function wbufcn(obj,event)
     
        handles = guidata(obj);
     
        set(obj,'windowbuttonmotionfcn','',...
            'windowbuttonupfcn','',...
            'pointer','arrow');
     
        mR = meanROI;
        disp(mR);
     
    function anchbdfcn(obj,event)
     
        set(gcbf,'pointer','fleur', ...
            'windowbuttonmotionfcn',@wbmfcn,...
            'windowbuttonupfcn',@wbufcn);
     
    function mR = meanROI
     
        handles = guidata(gcbf);
     
        ROI = handles.X(handles.ROI(1):handles.ROI(3),handles.ROI(2):handles.ROI(4));
     
        mR = mean(ROI(:));
    On dessine simplement un rectangle sur l'image et on le déplace à l'aide d'une ancre dans un coin (ici le carré rouge)

Discussions similaires

  1. Réponses: 4
    Dernier message: 05/10/2010, 19h26
  2. Identifier la position d'un clic sur une image
    Par swissmade dans le forum Débuter
    Réponses: 6
    Dernier message: 03/01/2010, 13h38
  3. Réponses: 6
    Dernier message: 15/11/2007, 12h31
  4. Zoom sur une image
    Par AurelBUD dans le forum C++Builder
    Réponses: 5
    Dernier message: 07/05/2004, 17h05
  5. Comment mettre un label sur une image
    Par dug dans le forum MFC
    Réponses: 3
    Dernier message: 07/04/2004, 10h40

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