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

ImageJ Java Discussion :

Sélection d'une portion d'image dans une macro


Sujet :

ImageJ Java

  1. #1
    Nouveau Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Février 2014
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2014
    Messages : 2
    Points : 1
    Points
    1
    Par défaut Sélection d'une portion d'image dans une macro
    Bonjour,

    Je débute avec l'utilisation des macros en ImageJ.

    J'utilise ImageJ pour mesurer des surfaces de feuilles, et j'ai une macro pour automatiser les mesures et l'enregistrement des données. Mon problème est que j'ai, selon les images, une ou plusieurs feuilles; et parfois des poussières, etc que je ne veux pas mesurer. L'idéal serait donc que l'utilisateur puisse sélectionner la zone à étudier à chaque fois.

    J'aimerais donc pouvoir écrire une macro qui :
    1. Permet de sélectionner un dossier;
    2. Pour chaque image du dossier, ouvre l'image;
    3. Attend que l'utilisateur ait sélectionné la zone voulue;
    4. Applique la macro à cette zone uniquement;
    5. Selon le choix de l'utilisateur, permet de réitérer sur une autre zone de l'image ou de la fermer;
    6. Ouvre l'image suivante.



    Je n'ai pas trouvé comment l'on pouvait appliquer le reste de la macro sur seulement sur une portion de l'image...

    Voici ce que j'ai pour l'instant (qui est probablement assez maladroit , désolée....)
    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
     
    macro "Leaf batch [k]" {
    // À UTILISER POUR DES DONNÉES ORGANISÉES EN DATE/EXPÉRIMENTATEUR/IMAGES
      print("\\Clear")
      SourceDir = getDirectory("Choose Parent Directory ");
      datelist = getFileList(SourceDir);
      path = SourceDir + "/Results.txt" 
      f = File.open(path)    
      for (i=0; i<datelist.length; i++) {
     	namelist = getFileList(SourceDir + datelist[i]);
    	    for (j=0; j<namelist.length; j++) {
    	   	 	filelist = getFileList(SourceDir + datelist[i] + namelist[j]);
      			 for (k=0; k<filelist.length; k++) {
       		     	 showProgress(k+1, filelist.length);
     			     open(SourceDir + datelist[i] + namelist[j]+filelist[k]);
     	                     a=leafArea();
     		             print(datelist[i] + "\t" + namelist[j] + "\t" + a );
       				 close();
     				}
    			}
    		}
      selectWindow("Log")
      content = getInfo();
      print(f, content);
      File.close(f) 
    }
     
     
    macro "Leaf area [a]" 
    {
    	leafArea();
    }
     
     
    function leafArea()
     {
    var dpi = 300;
    var pixelsPerCentimeter = dpi / 2.54; // 300 dpi
    run("Clear Results");
    run("Set Scale...", "distance=" + pixelsPerCentimeter + " known=1 pixel=1 unit=cm");
    run("Subtract Background...", "rolling=50 light");
    run("Make Binary");
    run("Fill Holes");
    run("Remove Outliers...", "radius=10 threshold=50 which=Dark");
    run("Create Selection");
    run("Set Measurements...", "area redirect=None decimal=3");
    run("Analyze Particles...", "size=0.02-Infinity circularity=0.00-1.00 show=Nothing display clear"); // The treshodl permits to avoid smaller particules
    getStatistics(area);
     
    // For composed leaves, we need to sum all the small areas
    Sum = 0;
    selectWindow("Results");
    lines1 = split(getInfo(), "\n");
    headings = split(lines1[0], "\t");
    for (j=1; j<lines1.length; j++) {
            values = split(lines1[j], "\t");
            a = values[1];
            sum = sum + a;
    }
    Merci par avance pour votre aide !

  2. #2
    Modérateur
    Avatar de ToTo13
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Janvier 2006
    Messages
    5 793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 793
    Points : 9 860
    Points
    9 860
    Par défaut
    Je ne connais pas du tout les macros ImageJ, mais tu pourrais faire cela automatiquement.
    Premièrement tu fais des fermeture/ouverture pour boucher les trous de tes feuilles, etc. Ca va permettre d'avoir des composantes connexes mieux définies.
    Ensuite tu fais un étiquetage des composantes connexes et tu les sépares dans différentes images, sauf tu copies les images d'origines et non les images modifiées.
    Consignes aux jeunes padawans : une image vaut 1000 mots !
    - Dans ton message respecter tu dois : les règles de rédaction et du forum, prévisualiser, relire et corriger TOUTES les FAUTES (frappes, sms, d'aurteaugrafe, mettre les ACCENTS et les BALISES) => ECRIRE clairement et en Français tu DOIS.
    - Le côté obscur je sens dans le MP => Tous tes MPs je détruirai et la réponse tu n'auras si en privé tu veux que je t'enseigne.(Lis donc ceci)
    - ton poste tu dois marquer quand la bonne réponse tu as obtenu.

  3. #3
    Nouveau Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Février 2014
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2014
    Messages : 2
    Points : 1
    Points
    1
    Par défaut
    Merci ToTo13 pour la réponse rapide =)

    Mon soucis est que selon les images, il peut y avoir soit une feuille et des poussières, soit une feuille déchirée donc en plusieurs morceaux, soit plusieurs feuilles. Or si la feuille est en morceaux, on veut l'aire totale; mais si il y a plusieurs feuilles, on veut séparément l'aire des différentes feuilles. La différence est distinguable à l'oeil, mais plus difficilement automatiquement (sachant que les feuilles sont de taille et de forme très variée).

    Pour les poussières, j'ai pour l'instant mis un seuil de taille pour la détection des particules. Là encore, cela peut poser problème car selon la couleur de la feuille, l'étape de binarisation peut la fragmenter en plusieurs morceaux, et certains être en-dessous du seuil...

    D'où mon idée de sélection manuelle de la zone à étudier, qui est certes plus longue qu'une automatisation mais aussi plus fiable, et de garder l'automatisation pour l'enregistrement des données, l'ouverture/fermeture d'images, la binarisation pour gagner du temps.

    J'ai trouvé la fonction waitforuser(), qui permet de demander à l'utilisateur de sélectionner une portion d'image. Mais je ne sais pas comment appliquer la suite de la macro à cette sélection seulement...

    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
     
    function leafArea()
    {
    var dpi = 300;
    var pixelsPerCentimeter = dpi / 2.54; // 300 dpi
    run("Clear Results");
     
    setTool(0);                                               // On choisi une sélection rectangulaire
    waitForUser("Select Zone")
    selectImage();
     
    if (selectionType() != 0)                            //Vérifier qu'on a une sélection rectangulaire
    exit("Sorry, no rectangle");
     
     
    run("Set Scale...", "distance=" + pixelsPerCentimeter + " known=1 pixel=1 unit=cm");
    run("Subtract Background...", "rolling=50 light");
    run("Make Binary");
    run("Fill Holes");
    run("Remove Outliers...", "radius=10 threshold=50 which=Dark");
    run("Create Selection");
    run("Set Measurements...", "area redirect=None decimal=3");
    run("Analyze Particles...", "size=0.02-Infinity circularity=0.00-1.00 show=Nothing display clear"); // The treshodl permits to avoid smaller particules
     // run("Summarize");
     // var area = getResult("Area"); // this will get the last line of the results, the max
    getStatistics(area);
     // lA= getTitle() + "\t" + area;
     // return lA;
     
    // For composed leaves, we need to sum all the small areas
    Sum = 0;
    selectWindow("Results");
    lines1 = split(getInfo(), "\n");
    headings = split(lines1[0], "\t");
    for (j=1; j<lines1.length; j++) {
            values = split(lines1[j], "\t");
            a = values[1];
            sum = sum + a;
    }
    return sum
    }
    Quelqu'un aurait-il une idée ?

    Merci par avance !

Discussions similaires

  1. Réponses: 1
    Dernier message: 26/12/2010, 21h20
  2. Selection d'une partie d image dans une figure
    Par airballman dans le forum Images
    Réponses: 3
    Dernier message: 26/04/2010, 09h20
  3. Dessiner une portion d'image dans une autre image
    Par Harry_polin dans le forum Windows Presentation Foundation
    Réponses: 4
    Dernier message: 24/11/2009, 13h19
  4. créer une liste d'images dans une listbox
    Par colorid dans le forum Langage
    Réponses: 4
    Dernier message: 22/10/2009, 02h30
  5. colorier une zone d'image dans une applet
    Par lou_ravi dans le forum Interfaces Graphiques en Java
    Réponses: 1
    Dernier message: 16/11/2008, 22h34

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