[Matlab] Sélectionner et traiter plusieurs parties d'une même image
Répondre à la discussion
Affichage des résultats 1 à 3 sur 3

[Matlab] Sélectionner et traiter plusieurs parties d'une même image



  1. #1
    Enora94

    [Matlab] Sélectionner et traiter plusieurs parties d'une même image


    ------

    Bonjour !

    Je suis débutante sur Matlab et pour un projet de biologie, j'aimerais pouvoir traiter plusieurs cellules sur une même image en même temps. Quand je dis traiter, c'est pouvoir calculer l'aire/le volume de chacune des cellules que je sélectionne.

    Voici le genre d'image sur lequel je travaille :

    cells.jpg

    J'aimerais que lorsque je clique sur une cellule, elle seule reste sur l'image comme ceci par exemple :
    onecell.jpg

    et que je puisse avoir accès à son aire et son volume (à partir de l'image ci-dessus, je sais à peu près comment je devrais procéder pour récupérer l'aire et le volume, c'est juste le passage d'une image à l'autre qui me pose problème).

    J'aimerais également que plusieurs cellules soient sélectionnables, par exemple en cliquant sur 3 d'entre elles qui m'intéressent puis en cliquant sur un bouton "ok" (ou je ne sais pas si il y a un autre moyen), seulement ces 3 cellules seraient conservées et je pourrais avoir accès à leurs aires/volumes respectifs. Ce que je voudrais c'est que l'image soit comme ceci :

    threecells.jpg

    (les cellules sélectionnées ne seront pas nécessairement à côté, c'est juste un exemple).

    J'avais pensé à utiliser imcrop, mais seulement ce moyen me permet d'obtenir juste une seule cellule à la fois et ne me permettra pas de conserver 3 cellules d'un coup comme sur la 3eme image si les cellules en question ne sont pas à côté... Par exemple comme ceci :
    threecellsbis.jpg

    En plus, cette fonction découpe l'image alors que j'aimerais conserver sa taille originale pour pouvoir comparer les images entre elles par la suite...


    Voilà, si certains d'entre vous pouvez m'éclairer ça serait génial !! Merci beaucoup à ceux qui prendront la peine de lire et de répondre !

    Enora

    -----
    Dernière modification par Enora94 ; 15/05/2016 à 03h37.

  2. #2
    Antoane
    Responsable technique

    Re : [Matlab] Sélectionner et traiter plusieurs parties d'une même image

    Bonjour,

    C'est possible, mais il y a un peu de code à écrire. As-tu déjà réalisé des GUI (sans utiliser GUIDE) ?

    L'idée pour sélectionner une cellule serait (par exemple) de :
    - afficher l'image complète sur une figure ;
    - appeler une fonction à chaque click sur l'image, cette fonction :
    * déterminerait les coordonnées du click ;
    * sélectionnerait tous les pixels blancs à côté du click.
    - ferait des truc (affichage, calcul, etc.)
    Deux pattes c'est une diode, trois pattes c'est un transistor, quatre pattes c'est une vache.

  3. #3
    Antoane
    Responsable technique

    Re : [Matlab] Sélectionner et traiter plusieurs parties d'une même image

    Bonjour,

    J'avais fait un truc assez similaire il y a peu.

    clic gauche pour sélectionner une cellule, droit pour la retirer.
    Code:
    function cormoran(filename)
    
    if nargin<1, filename='cellsNB.bmp'; end
    
    % build picture
    figure
    im=imread(filename); % import picture
    im2=im*255;
    image(im2');
    
    % improve display
    g=gca;
    g.Units='pixel';
    g.XTick=[]; g.YTick=[];
    g.Position=g.OuterPosition-g.TightInset*[-1 0 1 0; 0 -1 0 1; 0 0 1 0; 0 0 0 1];
    
    
    % ********** callback for the mouse **********
    set(gcf, 'WindowButtonDownFcn', @getMousePositionOnImage);
    pan off % Panning may not interfere with this code
    
    %% Main variable
    data=guihandles(gcf);
    
    data.figAx=g; 
    data.conn=bwconncomp(im, 4);
    data.selectedCells=[];
    data.StotSel=0; % total area selected in pix. sq
    
    % Save data:
    guidata(gcf,data)
    
    %% Callbacks
        function getMousePositionOnImage(src, event)        % **** acquire click on picture ****
            data=guidata(gcbf); 
            
            Pf=event.Source.CurrentPoint; % figure's referencial 
            Pa=Pf2Pa(Pf); % coordinates of the clicked point in the bmp-file referencial
            
            % linear index of Pa
            liPa=(Pa(2)-1)*size(im,1)+Pa(1);
            
            % Find the other pixels in the cell including Pa, i.e. find in
            %   which cell you clicked
            flag=0;
            for k=1:data.conn.NumObjects % for each cell of the plot
                if sum(data.conn.PixelIdxList{k}==liPa)>0, flag=1; break; end % break if the clicked point is in this cell
            end
            if flag==0; 
                warning('JAG:userInfo', 'No cell found here'); 
                return;
            end
            
            cellArea=length(data.conn.PixelIdxList{k}); % estimate the area of the selected cell
            display(['The area of the cell is: ', num2str(cellArea), ' pix. sq.']);
            
            % keep/remove the k^th cell
            if strcmpi(src.SelectionType, 'normal') % if left click
                if sum(data.selectedCells==k)==0    % if the cell is not selected yet
                    data.selectedCells(end+1)=k;    % select the cell
                    display(['Cell n°', num2str(k), ' added.'])
                else                                % if the cell is already selected
                     warning('Cell n° %0.3g already selected', k)
                end
            elseif  strcmpi(src.SelectionType, 'alt')% if right click
                if sum(data.selectedCells==k)>0      % if the cell is selected
                    data.selectedCells(data.selectedCells==k)=[]; % unselect it
                    display(['Cell n°', num2str(k), ' removed'])
                else                                 
                     warning('Cell n° %0.3g cannot be deleted for it is not selected', k)
                end
            end
            guidata(gcbf,data) % save
            
            totalAreaSelected(); % compute total selected area
            updatePlot();
    end
    
        function Stot=totalAreaSelected() % **** calculate total selected area in pixel²
            data=guidata(gcbf);                 
            Stot=0; % initialise it 
            for k=data.selectedCells % for each selected cell
                Stot=Stot+length(data.conn.PixelIdxList{k}); % add its area to the total
            end
            data.StotSel=Stot; % save total area
            display(['Total Cell Area: ', num2str(Stot), ' pix. sq.']); 
            guidata(gcbf,data)
        end
    
        function updatePlot()                       % **** Update plot with new color for the selected cells
            data=guidata(gcbf);         
            im3=im2; % base image        
            for k=data.selectedCells % for each selected cell
                % change the color of the k^th cell
                jx=data.conn.PixelIdxList{k}; % linear indexes of the pixels of the k^th cell
                im3(jx)=12; % 12 = new color
            end
            image(im3'); % plot the new image
            guidata(gcbf,data); % not required
        end
        function Pa=Pf2Pa(Pf) % **** convert coordinates to the referencial of the plot
            sizePlot=data.figAx.Position([3,4]); % size of the plot in the figure (in pixels)
            sizeImg=flip(size(im)); % size of the bmp-file (in pixels: [x-length, y-length])
            
            Pa=(Pf-data.figAx.Position([1,2])).*sizeImg./sizePlot; % scale it
            Pa(2)=sizeImg(2)-Pa(2); % return Y-axis (downward -> upward)
            Pa=round(Pa); % it should be an integer.
            for k=1:2 % just in case you clicked outside of the plot.
                Pa(k)=max(1, Pa(k)); 
                Pa(k)=min(sizeImg(k), Pa(k));
            end
        end
    end
    Images attachées Images attachées  
    Dernière modification par Antoane ; 27/05/2016 à 10h45.
    Deux pattes c'est une diode, trois pattes c'est un transistor, quatre pattes c'est une vache.

Discussions similaires

  1. Traiter du son sur Matlab
    Par invitec9513b89 dans le forum Logiciel - Software - Open Source
    Réponses: 9
    Dernier message: 27/10/2020, 09h59
  2. Traiter plusieurs .csv R
    Par Francko dans le forum Programmation et langages, Algorithmique
    Réponses: 5
    Dernier message: 07/07/2014, 16h10
  3. Isoler deux parties d'une même pièce par
    Par invitec316e987 dans le forum Habitat bioclimatique, isolation et chauffage
    Réponses: 4
    Dernier message: 18/01/2011, 13h28
  4. decouper film en plusieurs parties
    Par marcuscus dans le forum Logiciel - Software - Open Source
    Réponses: 1
    Dernier message: 03/08/2010, 17h41
  5. Réponses: 8
    Dernier message: 18/09/2009, 13h42
Découvrez nos comparatifs produits sur l'informatique et les technologies.