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 :

Problème de Parcours et temps d'exécution énorme


Sujet :

ImageJ Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de Imène_23
    Femme Profil pro
    Inscrit en
    Avril 2009
    Messages
    275
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 38

    Informations forums :
    Inscription : Avril 2009
    Messages : 275
    Par défaut Problème de Parcours et temps d'exécution énorme
    Bonjour à tous

    Donc voilà j'ai un gros souci avec ImageJ, j'ai une très grande image (321*481) sur la quel je fais un traitement compliqué où il y a 4 boucles imbriquées.
    le traitement se répète 23839668801 fois (càd chaque pixel avec les autres pixels de l'image). le traitement consiste dans le calcul d'un noyau gaussien, au départ je croyais que c'été l'exponentiel qui était groumant en temps mais je viens de l'enlever (pour voir) et c'est toujours le même problème , j'ai conclu que c'été le parcours. le calcul me prend presque 1heure.

    Voici le 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
    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
    import ij.*;
    import ij.process.*;
    import ij.gui.*;
    import java.awt.*;
    import ij.plugin.filter.*;
    import java.util.*;
    import ij.measure.ResultsTable;
     
    public class pgm_ implements PlugInFilter {
    	ImagePlus imp;
     
    	public int setup(String arg, ImagePlus imp) {
    		this.imp = imp;
    		return DOES_ALL;
    	}
     
     public double distance(double r,double g,double b, double r1, double g1,double b1){
    double res;
     
    res=Math.sqrt((r-r1)*(r-r1)+(g-g1)*(g-g1)+(b-b1)*(b-b1));
     
    return res;
    }
     
    /////////////////////////////// Ma
              public double Ma(int [] pixels){
     
    int i,j,a;
    double Ma=0,var=0;
    double sigma=0.2;
    double sig=sigma*sigma;
    double var1=1/(3.14159265358979*0.08);
    double v,noyau;
    for(i=0; i<pixels.length; i++){
    for(a=0; a<pixels.length; a++){
     
     
    int c = pixels[a];
    double r = (c & 0xff0000)>>16;
    double g = (c & 0x00ff00)>>8;
    double b = (c & 0x0000ff);
    int c1 = pixels[i];
    double r1 = (c1 & 0xff0000)>>16;
    double g1 = (c1 & 0x00ff00)>>8;
    double b1 = (c1 & 0x0000ff);
    v=distance(r1/255,g1/255,b1/255,r/255,g/255,b/255);
    var=Math.exp((v*v)/(-0.08));
    noyau= var1*var;
    Ma=Ma+noyau;
    }
    }
    return Ma;
                 }
     
     
    /////////////////Ma
    public void run(ImageProcessor ip) {
    		ip.invert();
    		imp.updateAndDraw();
    		IJ.wait(500);
    		ip.invert();
    		imp.updateAndDraw();
    int nbrows=ip.getHeight();
    int nbcols=ip.getWidth();
     
    int[] pixels = (int[]) ip.getPixels();
    int k=4;
    /////////////////Ma
    double Ma=Ma(pixels);
     
    IJ.showMessage("Ma= "+Ma);
     
    	}
     
    }
    Je voulais savoir s'il y a un moyen pour mieux parcourir l'image ou des suggestions pour réduire ce temps de calcule.

    Merci

  2. #2
    Membre Expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2004
    Messages
    1 184
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 184
    Par défaut
    Un coup de profiler te permettra de savoir si tu as un point particulièrement lent.

    Je ne vois que 2 boucles :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    for(i=0; i<pixels.length; i++){
    for(a=0; a<pixels.length; a++){
    Où sont les 2 autres ?

  3. #3
    Membre éclairé Avatar de Imène_23
    Femme Profil pro
    Inscrit en
    Avril 2009
    Messages
    275
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 38

    Informations forums :
    Inscription : Avril 2009
    Messages : 275
    Par défaut
    Citation Envoyé par Mathieu.J Voir le message
    Un coup de profiler te permettra de savoir si tu as un point particulièrement lent.
    tu peux me dire comment j'arrive à faire ça?
    Je ne vois que 2 boucles :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    for(i=0; i<pixels.length; i++){
    for(a=0; a<pixels.length; a++){
    Où sont les 2 autres ?[/
    au départ y'avais 4 boucles, après j'ai mis l'image (matrice) dans un vceteur donc je parcours maintenant avec 2 seulement. mais je ne sais toujours pas la partie qui prend beaucoup de temps ?

  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 : 46
    Localisation : Etats-Unis

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

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 793
    Par défaut
    Bonjour,

    - ton image est... "petite" ! La dimension n'est vraiment pas excessive.
    - une gaussienne a une complexité en O(N^2). Sur ma machine, je fais une gaussienne de taille 15x15 sur une image 512x512 en moins de 0,1s.

    Par contre, tu peux accélérer les calculs en utilisant une transformée de Fourier pour faire une convolution.

    La division par 255 n'est pas utile dans le calcul de la distance, car tu le fais sur tous les éléments.

    Si tu traites une image avec ImageJ, tu peux utiliser le DataBuffer pour accéder directement aux valeurs et ainsi accélérer le temps de lecture.
    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 éclairé Avatar de Imène_23
    Femme Profil pro
    Inscrit en
    Avril 2009
    Messages
    275
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 38

    Informations forums :
    Inscription : Avril 2009
    Messages : 275
    Par défaut
    Merci ToTo pour ta réponse

    Donc le temps énorme est à cause de la récupéartion des valeurs des pixels ?
    ou c'est peut être la distance Euclidienne entre les vecteurs de deux pixels que je passe à chaque fois comme valeur au noyau?
    J'aimerais bien savoir en quoi la convolution me serait utile dans ce cas-là ?

    Merci et très bonne année 2012

  6. #6
    Membre éprouvé
    Homme Profil pro
    Thésard BioInformatique
    Inscrit en
    Décembre 2008
    Messages
    97
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Thésard BioInformatique

    Informations forums :
    Inscription : Décembre 2008
    Messages : 97
    Par défaut
    Tu recrées les mêmes objets dans tes boucles à chaque tours.

    Tu peux les créer avant et juste changer les valeurs après. Normalement, JAVA gère les classes qui ne sont plus utilisées. Mais après test, tu as un gain de temps si tu fais toutes les instanciations avant et pendant les boucles tu leur attribut la valeur que tu souhaites.

    Le gain de temps sera minime, mais ça sera toujours ça de pris

Discussions similaires

  1. Problème de temps d'exécution aléatoire
    Par ouis dans le forum SQL
    Réponses: 4
    Dernier message: 04/09/2008, 09h55
  2. problème avec le temps d'exécution
    Par sam83 dans le forum C++Builder
    Réponses: 8
    Dernier message: 18/03/2008, 18h17
  3. [Interbase 7] Problème temps d'exécution
    Par ch0upette dans le forum InterBase
    Réponses: 9
    Dernier message: 20/02/2007, 23h31
  4. [SqlServer2000] Problème de temps d'exécution d'une proc stock
    Par GuillaumeBibaut dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 20/11/2006, 14h31
  5. [SQL] Problème de temps d'exécution maximum
    Par manshoon dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 18/05/2006, 14h07

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