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

C++ Discussion :

Optimisation d'une fonction


Sujet :

C++

  1. #1
    BNS
    BNS est déconnecté
    Membre du Club
    Inscrit en
    Juin 2005
    Messages
    129
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 129
    Points : 45
    Points
    45
    Par défaut Optimisation d'une fonction
    Bonjour à tous!
    Je cherche à optimiser une fonction. J'ai une image dans le domaine de couleur HSV (src_HSV) et je cherche à lui appliquer 2 valeurs de seuils (une normale, et une large).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    H_Threshold = 8;
    S_Threshold = 166;
    V_Threshold = 127;
     
    H_Threshold_large = 15;
    S_Threshold_large = 121;
    V_Threshold_large = 67;
    En résultera une image avec 3 niveaux de gris (dst_gray), selon la valeur de chaque pixel.
    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
    int CImageProcessing::HSV_Thresholding(IplImage* src_HSV, IplImage*
    dst_gray)
    {
    	int x,y;
     
    	char* MyImageData = m_pImage_gray->imageData ;
    	int MyStep = m_pImage_gray->widthStep ;
     
    	char* MyHSVImageData = src_HSV->imageData ;
    	int MyHSVStep = src_HSV->widthStep ;
     
    	for (y=269;y>=0;--y)
    		for (x=width-1;x>=0;--x)
    		{
    			Hue = ((uchar*)(MyHSVImageData + MyHSVStep*y))[x*3];
    			Saturation = ((uchar*)(MyHSVImageData + MyHSVStep*y))[x*3+1];
    			Value = ((uchar*)(MyHSVImageData + MyHSVStep*y))[x*3+2];
     
    			if ( ((Hue>H_Threshold_large) && (Hue<180-H_Threshold_large))
    					|| (Saturation<S_Threshold_large)
    					|| (Value<V_Threshold_large) )
    			{
    				((uchar*)(MyImageData + MyStep*y))[x] = 0 ;
    			}
     
    			else if ( ((Hue>H_Threshold) && (Hue<180-H_Threshold))
    					|| (Saturation<S_Threshold)
    					|| (Value<V_Threshold) )
    			{
    				((uchar*)(MyImageData + MyStep*y))[x] = 125 ;
    			}
     
    			else
    			{
    				((uchar*)(MyImageData + MyStep*y))[x] = 255 ;
    			}
    		}
     
    	return 0;
    }
    Pourriez-vous me conseiller pour ce qui est de l'optimisation de cette fonction, où puis-je gagner du temps de calcul (cette image a 3 canaux (H, S et V) et a pour dimensions 640*270)?
    Je vous remercie d'avance pour votre aide!

  2. #2
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Points : 4 625
    Points
    4 625
    Par défaut
    - Vois si tu peux pas avoir qu'une seule boucle.
    - Vois si tu peux pas virer les sauts conditionnels.

  3. #3
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    Eventuellement tester le remplacement des accès directs aux tableaux par un incrément de pointeur.

  4. #4
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 949
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 949
    Points : 5 665
    Points
    5 665
    Par défaut
    Gio,

    Des calculs sont faits plusieurs fois, comme MyHSVImageData + MyHSVStep*y ou x*3, faire une seule fois le calcul dans une variable intermédiaire.

  5. #5
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Points : 4 625
    Points
    4 625
    Par défaut
    Ça le compilateur le fait déjà...

  6. #6
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 949
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 949
    Points : 5 665
    Points
    5 665
    Par défaut
    Fio,
    Citation Envoyé par loufoque Voir le message
    Ça le compilateur le fait déjà...
    Souvent, mais pas forcément, c'est largement dépendant du compilateur utilisé, et surtout, rien ne garantit que le compilateur le fera toujours.

    Le seul moyen d'en être certain est d'aller voir le code généré.

  7. #7
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Points : 17 923
    Points
    17 923
    Billets dans le blog
    2
    Par défaut
    plus calculer UNE SEULE FOIS

    plus faire UNE SEULE FOIS le test :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    					|| (Saturation<S_Threshold_large)
    					|| (Value<V_Threshold_large) )

  8. #8
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Bonjour,
    tu peut aussi remplacer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    for (y=269;y>=0;--y)
    		for (x=width-1;x>=0;--x)
    par un seul for
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for (id =0;id<buffer_size;id+=3)

Discussions similaires

  1. Optimisation d'une fonction récursive
    Par lawwek dans le forum Scheme
    Réponses: 1
    Dernier message: 10/05/2009, 01h56
  2. [XL-2003] Optimisation d'une fonction à plusieurs variables
    Par kokoVBA dans le forum Macros et VBA Excel
    Réponses: 45
    Dernier message: 06/05/2009, 10h38
  3. Optimisation d'une fonction non convexe
    Par Kevin_18 dans le forum Mathématiques
    Réponses: 4
    Dernier message: 06/08/2008, 09h40
  4. Optimisation d'une fonction de découpage en sous-chaine
    Par FabaCoeur dans le forum Général Java
    Réponses: 9
    Dernier message: 05/01/2008, 14h00
  5. Réponses: 6
    Dernier message: 27/06/2007, 16h44

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