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 :

Détecter automatiquement certaines images dans un stack


Sujet :

ImageJ Java

  1. #1
    Nouveau Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Décembre 2015
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 32
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2015
    Messages : 5
    Points : 1
    Points
    1
    Par défaut Détecter automatiquement certaines images dans un stack
    Bonjour,

    J'aimerai détecter certaines images (8 bits) qui sont pas exploitables dans un stack. j'ai estimé au préalable une valeur seuil en moyenne de niveaux de gris au dessus de laquelle les images ne sont plus exploitables.
    En gros, j'aimerai détecter toutes les images du stack avec une valeur de niveaux de gris supérieur à 150 pour ensuite les enlever du stack par exemple. Je pense qu'il faut faire une macro pour cela mais quelqu'un pourrait-il me donner une piste?

    Merci,

  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
    Quel type d'images est ce ? Mets donc un lien vers le stack ou deux images (une rejetée une acceptée).
    Généralement les images n'étant pas homogène, pour chacune d'entre elle tu vas trouver des pixels en dessus et au dessous de ton seuil. Est ce que tu parles de la moyenne des pixels de l'image ?
    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
    Décembre 2015
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 32
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2015
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    merci déjà de ta réponse,
    malheureusement je ne sais pas trop si je peux rendre public les images car elles ne m'appartiennent pas, c'est un travail que je dois faire dans le cadre de ma formation en Imagerie biologique. En fait ce sont des images issue d'une endoscopie confocale, j'ai plusieurs vidéos avec à peu près une centaine d'images et je dois trouver un moyen de discriminer automatiquement les images non exploitables qui paraissent vraiment très claires selon moi (avec une moyenne en niveau de gris élevé par rapport aux bonnes images où on voit bien les cellules et les vaisseaux qui apparaissent assez sombres).
    Pour ce travail j'ai testé plusieurs choses :
    -d'abord j'ai étudier le profil des fréquences spatiales des "bonnes/mauvaises images" grâce à l'outil de la transformée de fourier. j'ai ensuite appliqué un seuillage à ces FFT (ce qui a binarisé l'image), puis j'ai regardé l'aire blanche (analyse particles) pour voir si il y avait une différence dans l'idée d'appliquer un filtre (Pass bande par ex) par la suite mais cela n'a rien donné les spectres de fourier etaient relativement semblables.
    -donc je suis parti dans l'analyse des niveaux de gris et donc pour cela j'ai fait une macro pour pouvoir répertorier sur excel certaines valeurs caractéristiques des histogrammes pour toutes les images, comme la moyenne des niveaux de gris. J'ai fait tourner la macro pour toutes les vidéos et j'ai réalisé des graphiques et j'ai estimé une valeur seuil en moyenne de niveaux de gris au dessus de laquelle toutes les images ne sont pas exploitables.

    J'aimerai maintenant utiliser cette valeur seuil afin de détecter automatiquement les mauvaises images dans toutes les vidéos donc par exemple faire une macro qui me détecte ces images en me les sortant du stack, enfin c'est juste une idée. Car le but du travail c'est de trier les images automatiquement. J'espère que mon explication était à peu près clair, auquel cas je peux donner d'autres infos!

  4. #4
    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
    Ok, alors voici trois pistes :
    • On souhaite toujours travailler en 3D ou sur une vidéo, mais souvent se ramener à de la 2D est tout aussi bien. Tu pourrais par exemple faire un "stack projection" (connu aussi comme "z-projection" ou "extended depth of focus"). Il y a des algorithmes "intelligents" qui ne prennent que l'information pertinente de chaque image. Comme ça si une de tes images "brillante" contient une cellule,, tu ne perds pas l'information.
    • Plutôt que d'utiliser l'intensité moyenne (bien que ça peut quand même fonctionner), j'utiliser l'intégrale du gradient. Comme ça tu discrimines non pas l'intensité, mais la présence d'information dans l'image. Si c'est juste sombre ou clair sans information, alors le gradient sera très faible. Mais s'il y a quelque chose, alors le gradient sera fort.
    • Dernière méthode, mais plus dure... faire une segmentation pour chaque image afin de détecter "de manière basique" ce que tu souhaites. Si une image contient des quelque chose, tu la gardes.
    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.

  5. #5
    Membre habitué Avatar de Tchoukatroc
    Homme Profil pro
    Soupière
    Inscrit en
    Mai 2014
    Messages
    99
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Soupière
    Secteur : Santé

    Informations forums :
    Inscription : Mai 2014
    Messages : 99
    Points : 141
    Points
    141
    Par défaut
    Bonjour,

    Si tu as besoin d'aide pour écrire une macro, je peux t'aider. Faire une macro pour supprimer des images dans un stack n'est pas compliqué. Si tu as déterminé une valeur seuil qui permet de les différencier, ça me parait simple. Après, il faut voir si les solutions de Toto changent la manière dont tu veux faire les choses, je n'y connais pas grand chose en traitement d'image.

  6. #6
    Nouveau Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Décembre 2015
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 32
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2015
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    Citation Envoyé par Tchoukatroc Voir le message
    Bonjour,

    Si tu as besoin d'aide pour écrire une macro, je peux t'aider. Faire une macro pour supprimer des images dans un stack n'est pas compliqué. Si tu as déterminé une valeur seuil qui permet de les différencier, ça me parait simple. Après, il faut voir si les solutions de Toto changent la manière dont tu veux faire les choses, je n'y connais pas grand chose en traitement d'image.
    merci d'avoir répondu,

    effectivement oui j'aurai besoin d'aide car je débute dans l'écriture des macro sous fiji. J'aimerai faire une macro sur un stack de 134 images (8bits) et sélectionner que celles qui ont une valeur moyenne en niveaux de gris inférieur à 150. puis par exemple reconstituer le stack avec que les bonnes images ce serait une idée.
    Puis je ferai ensuite tourner la macro sur tous les stacks car la valeur marche pour tous.
    Je pense qu'il faudrait faire une boucle for...?

  7. #7
    Membre habitué Avatar de Tchoukatroc
    Homme Profil pro
    Soupière
    Inscrit en
    Mai 2014
    Messages
    99
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Soupière
    Secteur : Santé

    Informations forums :
    Inscription : Mai 2014
    Messages : 99
    Points : 141
    Points
    141
    Par défaut
    Bonjour,

    Pour écrire les macros, tu trouves toutes les fonctions utilisables ici http://rsb.info.nih.gov/ij/developer...functions.html. Tu peux également utiliser les fonctions internes à imageJ dans les macros. Pour cela, il faut utiliser le macro recorder, ça se trouve dans Plugin-->Macros-->Record... Tu lance le recorder, puis chaque action que tu feras (ouvrir un nouveau stack, copier, etc) sera enregistré dans une ligne de code utilisable en macro.
    Voila une macro qui devrait fonctionner sur tes images, j'ai essayé de l'annoter au maximum pour que tu comprennes mais n'hésite pas à me poser des questions s'il y a des points que tu ne comprends pas.
    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
     
    //Fonction permettant de récupérer le nombre 
    //d'images de ton stack dans la variable frames
    Stack.getDimensions(width, height, channels, slices, frames);
     
    //récupère le nom de l'image
    imageName = getTitle();
     
    //On crée un tableau qui aura la taille frames
    //Un tableau est comme une variable qui peut contenir plusieurs valeurs
    //Dans ton cas, on aura un tableau qui contiendra 134 valeurs
    //Dans ce tableau, on va noter le numéro des frames qui ont une average intensity <150
    //Pour celle, qui ont une intensité>150, on marquera le mot "trash" 
    //(ca peut être "trash" ou un autre mot, c'est juste pour détécter les images que l'on ne veut pas)
    //le tableau sera du genre 0, 1, trash, 3, 4, trash, ... 
    numeroFrame = newArray(frames);
     
    //la varible a va servir à compter les nombres d'images à conserver
    a=0
    for (i=0; i<frames; i++){
    	//se positionner sur la frame numéro i+1 (l'annotation des frames commence à 1 et pas à 0)
    	Stack.setFrame(i+1);
    	//on récupère la valeur d'intensité moyenne de la frame dans la variable mean
    	getStatistics(area, mean, min, max, std, histogram);
    	//si mean<150, inscrit le numéro de la frame dans le tableau à la position i
    	//et incrémente a de 1
    	if(mean<150){
    		numeroFrame[i]=i;
    		a++;
    	}
    	//si mean>150,inscrit "trash" dans le tableau à la position i  
    	else numeroFrame[i]="trash";
    }
     
    //on crée un nouveau stack avec les même caractéristiques que le précédent
    //mais avec un nombre de frame différent (ici le nombre de frames = a)
    newImage("Corrected " + imageName, "8-bit grayscale-mode", width, height, channels, slices, a);
     
    //Ensuite, on va faire un copier coller de toutes les frames ne correspondant pas à trash 
    //du stack initial vers le nouveau stack.
    //La variable n va nous permettre de choisir la frame du nouveau stack
    n=1;
    for(i=0; i<frames; i++){
    	//Dans le tableau numeroFrame à la position i, si la valeur n'est pas égale à "trash"
    	if(toString(numeroFrame[i]) != "trash"){
    		//selectionne le stack initial, place toi sur la frame à copier et copie
    		selectWindow(imageName);
    		Stack.setFrame(i+1);
    		run("Copy");
    		//Selectionne le nouveau stack, place toi sur la bonne frame et colle
    		selectWindow("Corrected " + imageName);
    		Stack.setFrame(n);
    		run("Paste");
    	}
    }

  8. #8
    Nouveau Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Décembre 2015
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 32
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2015
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    Merci, j'ai compris la logique mais pour moi c'est un peu compliqué car je débute mais j'essaye de la faire tourner ligne par ligne et il me détecte déjà une erreur comme quoi "mean" est une variable indéfini:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    run("Show Info...");
    numeroFrame = newArray(134);
    a=0
    for (i=0; i<frames; i++){
    Stack.setFrame(i+1);
    run("Statistics");
    if(mean<150){
    		numeroFrame[i]=i;
    		a++;
    	}
    Je n'ai pas l'habitude d'en écrire alors je ne sais pas si c'est bien comme ça..

  9. #9
    Membre habitué Avatar de Tchoukatroc
    Homme Profil pro
    Soupière
    Inscrit en
    Mai 2014
    Messages
    99
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Soupière
    Secteur : Santé

    Informations forums :
    Inscription : Mai 2014
    Messages : 99
    Points : 141
    Points
    141
    Par défaut
    Dans ton code, il faudrait utiliser getStatistics(area, mean, min, max, std, histogram) au lieu de run("Statistics"). En utilisant run("Statistics"), tu ne crées pas de variable mean.
    La fonction getStatistics permet de récupérer des valeurs de ton image (l'aire, l'intensité de gris moyenne, l'intensité de gris minimum, ...) et met ces valeurs dans des variables, ici les variables sont nommées area, mean, min,... mais les noms de ces variables sont arbitraires. On peut très bien écrire getStatistics(perceval, karadock, cest , pas, faux, sire); La variable perceval contiendra la valeur de l'aire, la variable karadock contiendrait la valeur de l'intensité de gris moyenne, etc. Tu trouve cette fonction sur le Built-in macro fonction, c'est le lien que je t'ai envoyé dans le message précédent.
    Sinon, as-tu essayé la macro que je t'ai envoyé sur tes images? Je l'ai testé sur un stack de test et elle fonctionne.

  10. #10
    Nouveau Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Décembre 2015
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 32
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2015
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    d'accord du coup j'ai changer sa à l'air de marcher mais il me met un message d'erreur cette fois sur une autre ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    if(mean<150){
    		numeroFrame[i]=i;
    		a++;
    	}
    	else numeroFrame[i]="trash";
    Macro error :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Index(1) out of range
    numeroFrame[i]<=>i;

  11. #11
    Membre habitué Avatar de Tchoukatroc
    Homme Profil pro
    Soupière
    Inscrit en
    Mai 2014
    Messages
    99
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Soupière
    Secteur : Santé

    Informations forums :
    Inscription : Mai 2014
    Messages : 99
    Points : 141
    Points
    141
    Par défaut
    Pourrais-tu poster ton code en entier pour que je trouve l'erreur?
    Sinon, as-tu essayé la macro que je t'ai envoyée sur tes images, j’aimerais savoir si ça fonctionne?

Discussions similaires

  1. [AC-2007] Ajout automatique d'image dans un formulaire
    Par selverine dans le forum IHM
    Réponses: 2
    Dernier message: 29/05/2011, 11h50
  2. Réponses: 1
    Dernier message: 04/04/2011, 17h12
  3. Réponses: 21
    Dernier message: 28/12/2010, 19h07
  4. [WD-2003] Comment inserer automatiquement des images dans un tableau word
    Par grooveus75 dans le forum VBA Word
    Réponses: 2
    Dernier message: 06/01/2010, 12h37
  5. insertion automatique d'image dans une frame
    Par romdev dans le forum VB 6 et antérieur
    Réponses: 1
    Dernier message: 17/01/2008, 13h20

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