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 confirmé
    Inscrit en
    Juin 2005
    Messages
    129
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 129
    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
    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
    Par défaut
    Eventuellement tester le remplacement des accès directs aux tableaux par un incrément de pointeur.
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  4. #4
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 966
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 966
    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
    Par défaut
    Ça le compilateur le fait déjà...

  6. #6
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 966
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 966
    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 confirmé

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    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 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    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 035
    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