jojoduv
Messages postés3Date d'inscriptionjeudi 31 mai 2007StatutMembreDernière intervention 1 juin 2007
-
31 mai 2007 à 13:25
jojoduv
Messages postés3Date d'inscriptionjeudi 31 mai 2007StatutMembreDernière intervention 1 juin 2007
-
1 juin 2007 à 11:30
Bonjour a tous, je suis en projet et je developpe une petite application qui gère les modifications géométrique d'une image. J'utilise une interpolation bilinéaire.
Cependant lors de l'éxécution d'une fonction d'agrandissement sur X et Y, la programme met presque une minute à renvoyer l'image agrandie.
Quelqu'un pourrait-il m'aider ou me donner des piste pour rendre mon programme plus rapide ?
Merci d'avance
cs_laurent1024
Messages postés987Date d'inscriptionmardi 31 mai 2005StatutMembreDernière intervention30 août 201225 31 mai 2007 à 13:48
Premierement si ce n'est pas deja fait, tu peux mettre ton code en release au lieu qu'il soit de debug.
Après faut voir dans ton algo, peut etre que tu peut simplifier les boucles, et essayer de limiter les calculs couteux en temps de mémoire ( par exemple au lieu de faire sqrt(10) tu stocke la valeur dans une variable au lieu d'utiliser a chaque fois la fonction).
Sans le code, c'est difficile de dire ce que tu peux modifier d'autre.
++
jojoduv
Messages postés3Date d'inscriptionjeudi 31 mai 2007StatutMembreDernière intervention 1 juin 2007 1 juin 2007 à 08:45
Tout d'abord merci de prendre un peu de temps pour résoudre mon problème.
Mon code est déjà en release.
J'ai implémenté mon code de la façon la plus simple à mes yeux. Voici celui-ci:
void CImageBMP::agrandissement(CImageBMP& out, double factorX, double factorY)
{
int imageType = m_iTypeImage;
int HauteurIn = m_iHauteur;
int LargeurIn = m_iLargeur;
int HauteurOut = (int)ceil((double)HauteurIn * (double)factorY);
int LargeurOut = (int)ceil((double)LargeurIn * (double)factorX);
//remplissage de l'image et gestion des bords
if (((iPrim) <= HauteurIn-2)&&((jPrim) <= LargeurIn-2))
{
out (i, j) = (unsigned char) (m_ppucLigne[ flooriPrim ][ floorjPrim ] * ( (1-x) * (1-y) )
+ m_ppucLigne[ flooriPrim ][ ceiljPrim ] * ( (1-x) * y )
+ m_ppucLigne[ ceiliPrim ][ floorjPrim ] * ( x * (1-y) )
+ m_ppucLigne[ ceiliPrim ][ ceiljPrim ] * ( x * y ));
}
else
{
out (i, j) = 0;
}
}
}
Cette fonction permet l'agrandissement d'une image par des facteurs X et Y à l'aide d'une interpolation bilinéaire.
Mais lorsque je pose deux facteurs de 10, la fonction met presque une minute à me renvoyer la nouvelle image !!!
Pour moi, ce code est simplement deux boucles for imbriquée avec un calcul inséré.
Je ne vois pas les données que je pourrais stocker.
cs_laurent1024
Messages postés987Date d'inscriptionmardi 31 mai 2005StatutMembreDernière intervention30 août 201225 1 juin 2007 à 08:58
C'est normal que ce soit long si tu mets des grands facteurs sur des images assez grandes. La quantité d'informations à traiter devient forcément importante. Tu pourrais peut etre essayer d'utiliser des threads qui travaillent chqu'un sur des parties de l'images, mais je ne suis pas sur que cela puisse te faire gagner beaucoup de temps.
++
Vous n’avez pas trouvé la réponse que vous recherchez ?
Tu convertis 3 fois de double en int la meme quantité, alors que tu pourrais le faire une seule fois:
// interpolation bilineaire
flooriPrim = (int)(iPrim);
floorjPrim = (int)(jPrim);
ceiliPrim = flooriPrim +1;
ceiljPrim = floorjPrim +1;
x = (double)iPrim - flooriPrim ;
y = (double)jPrim - floorjPrim ;
Mais c'est en passant en float, que tu vas gagner le plus. Le float te permettrait aussi d'utiliser le GPU pour faire ca. Il serait content de pouvoir t'aider :) il est spécialiser la dedans. Il te le ferait en 1/10sec ce calcul pour peu que ton image ne soit pas trop grande. Dans le cas contraire, il faudrait la découper et l'envoyer a la carte video par morceau.