Ok alors si je peux avoir un peu plus d'explication car là si je me trompe pas il lit pas linéairement les données en memoire il fait a chaque fois un saut y*columns.
Donc si vous pouvez m'expliquer il doit y avoir un truc qui m'echappe ?
Version imprimable
Ben c'est ce qu'à dit sardik.
La mémoire n'est pas mis entièrement en cache. Seulement des morceaux.
Donc si tu accède à des données côte à côte, il n'y as pas besoin de mettre en cache à chaque fois.
x en premier : les accès successif sont éloigné en mémoire => perte de temps sur le cache
y en premier :les accès successif sont proche en mémoire => moins de perte de temps
Oui vous avez tout a fait raison c'est moi c'est vendredi je suis fatigué je regardait en fait ton code dans celui du message de lisco. C'est pour ca que je comprennais pas et que je te disais que a chaque tour de boucle tu faisais un saut de y*columns.
Desolé les gars heureusement que j'ai trois jours ce week end. :aie:
Y a t-il une classe qui gere les structure en Qt car quand je declare une structure dans le .h de mon projet à la compilation j'ai l'erreur:
Ensuite:Code:c:/Qt/2009.01/mingw/bin/../lib/gcc/mingw32/3.4.5/../../../../include/c++/3.4.5/ext/new_allocator.h::-1: error: multiple definition of `fxd'
Tu peux m'expliquer pourquoi , parce que je vois pas trop pourquoi il nous donne des valeurs nulles??
Tu peux m'expliquer car je suis debutant , en fait en quoi tu initialise ici tes valeurs min et max??? je suppose bien initialement ces deux variables contiennent bien des valeurs?
Pour la fameuse regle de 3, si tu peux expliquer aussi suis preneur!Donc les valeurs des pixels etaient bien des float comprises entre 0 et 2^32??
J'ai bien teste ton code il marche parfaitement, ma question est que est ce que je doit donc utiliser un QScrollArea pour pouvoir l'afficher corrctement dans mon IHM car j'utilise qu'un QLabel mais l'affichage n'est pas bonne j'ai pas la bonne image??
Ma derniere question est ce possible d'inverser le fond avec l'image c'est a dire de rendre l'image blanc et le fond noir car le but etant de visualiser l'interieur de la crane??
Encore merci pour tous ces semaines que vous avez accepter de m'aider!!
Pour ton erreur de compilation je suppose comme c'est marqué que tu as plusieur fois une variable qui se nomme fxd ?
L'initialisation des valeur min et max se font ici :
De meme quand yan dit que tes valeur sont fausse je suppose que se sont celle là :Code:
1
2
3
4
5
6
7
8
9 for ( int i = 0; i < bufferSize; ++i) { float f; in >> f; //Initialisation des valeurs if (f >max) max = f; if (f <min) min = f; imageBuffer[i] =f; }
Celle de la structure rempli au debut quand tu lis ton fichier.Code:
1
2 float MaxSignalLevel; // maximum value in the image float MinSignalLevel; // minimum value in the image
Pour les float je crois que tu as toujours pas compris comment cela marche.
Les float ne sont pas compris entre 0 et 2^32. Merci de regarder le lien que je t'ai envoyé hier.
Essaye pour changer le fond de l'image de faire ça :
Code:pixel = abs(pixel - 255);//A verifier si cela marche (inclure <cmath> dans le .cpp)
Pas besoins de abs() essaye plutot ça :
Comme quoi je suis vraiment crevé en ce moment. :aie:Code:pixel = 255 - pixel;
Pas besoins de abs() essaye plutot ça :
Comme quoi je suis vraiment crevé en ce moment. :aie:Code:pixel = 255 - pixel;
pour compléter les réponses de superjaja
:koi:Citation:
Tu peux m'expliquer pourquoi , parce que je vois pas trop pourquoi il nous donne des valeurs nulles??
de quoi tu parle?
min: valeur max que peut prendre un float
max: -1 * valeur max que peut prendre un float
8O...Citation:
Pour la fameuse regle de 3, si tu peux expliquer aussi suis preneur!
Tu mélange tout. Si tu exécute mon code, tu as juste à les afficher. C'est un truc comme -127.xxx à 4530.xxxCitation:
Donc les valeurs des pixels etaient bien des float comprises entre 0 et 2^32??
Le QScrollArea sert uniquement à avoir des scrollbar et à rien d'autreCitation:
J'ai bien teste ton code il marche parfaitement, ma question est que est ce que je doit donc utiliser un QScrollArea pour pouvoir l'afficher corrctement dans mon IHM car j'utilise qu'un QLabel mais l'affichage n'est pas bonne j'ai pas la bonne image??
Pour là suite, ce n'est plus du Qt, c'est du traitement d'image. Il y as un forum beaucoup plus adapté :
http://www.developpez.net/forums/f64...ement-dimages/
Masi un conseil commence par apprendre les bases. Tu trouvera ici beaucoup de cour et tuto :
http://www.developpez.net/forums/d39...erique-images/
Je te conseil celui-çi :
http://raphaello.univ-fcomte.fr/IG/T...mentImages.htm
bon courage
Bonjour, merci pour toutes ces conseils et pour le temps que vous avez passez sur mon sujet.Pour clore ce thread je veux generaliser le code à mes differents types d'images:
Voici les bouts de codes que j'ai fait adapter:
Si cela c'est bon ; je dois peut etre faire des templates ou des switch!!Code:
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 /*======================================Pour une image Unsigned int===============================================*/ unsigned int bufferSize = fxd.NbColumns * fxd.NbRows; quint16 min = std::numeric_limits<quint16>::max();; quint16 max = - std::numeric_limits<quint16>::max(); std::vector<quint16> imageBuffer(bufferSize); for ( int i = 0; i < bufferSize; ++i) { quint16 f; in >> f; if (f > max) max = f; if (f < min) min = f; imageBuffer[i] =f; } /*===================================Pour une image Unsigned short==================================================*/ unsigned int bufferSize = fxd.NbColumns * fxd.NbRows; unsigned short min = std::numeric_limits<unsigned short>::max();; unsigned short = - std::numeric_limits<unsigned short>::max(); std::vector<unsigned short> imageBuffer(bufferSize); for ( int i = 0; i < bufferSize; ++i) { unsigned short f; in >> f; if (f > max) max = f; if (f < min) min = f; imageBuffer[i] =f; } /*==================================================================================================================*/
Et Yan tu me disais que ya des metodes beaucoup plus adaptées à mes images si tu peux me dire je suis preneur?
Encore merci.
Je pense qu'un template serait parfait. :D
Attention, situ utilise des type non signé, cette ligne ne veut rien dire
Une autre manière est d'initialiser min/max avec la valeur du premier pixel.Code:unsigned xxx max = - std::numeric_limits<unsigned xxx>::max();
Plutôt template
demande de l'aide sur l'autre forum pour ceci. Il existe une infinité de méthode qui permettent de convertir tes valeur entre 0 et 255. Et une tranformation linéaire ne donnera pas souvent le résultat voulue.Citation:
Et Yan tu me disais que ya des metodes beaucoup plus adaptées à mes images si tu peux me dire je suis preneur?
Par exemple, tu est d'accord que
est compris entre zéro et un. Au lieu de cette valeur, utilise la racine carré ou le carré. Tu obtiendra des résultats différents.Code:
1
2
3 (imageBuffer[y*columns + x] - min) / (max - min);
Code:
1
2
3
4
5 float tmp = (imageBuffer[y*columns + x] - min) / (max - min); pixel = 255 * sqrt(tmp);
Bonjour, je suis entrain de faire des templates, mais là n'étant pas trop habitué et en suivant les regles j'ai rencontré des beugs dont je comprends pas trop,voici mon code:
Et voici les beugs que cela m'affiche:Code:
1
2
3
4
5
6
7
8
9 template<typename T> T min = std::numeric_limits<T>::max() ; //Pour trouver le min et le max de l'image. T max = -std::numeric_limits<T>::max() ; template<typename T> std::vector<T>& imageBuffer(bufferSize) ; template<typename T> T f ;
Si quelqu'un peut m'aider svp.Code:
1
2
3
4
5 error: template declaration of `T min' error: `T' does not name a type error: template declaration of `std::vector<T, std::allocator<_CharT> >&imageBuffer' error: template declaration of `std::vector<T, std::allocator<_CharT> >&imageBuffer'
Merci d'avance.
La réponse se trouve dans le code que tu as posté.
:(Eh Oui, je suis debutant en templates, si je peux avoir plus d'explication je suis preneur
J'arrive pas à trouver le bogue, et la partie que j'essaye de generaliser est:
Pour que cela puisse marcher pour les differents types de pixels que je peux renconter!!Et ces templates me semblent correctes :(, je vois pas ce qui m'echappe!!help please!!Code:
1
2
3
4
5
6
7
8
9
10
11 float min = std::numeric_limits<float>::max(); float max = - std::numeric_limits<float>::max(); std::vector<float> imageBuffer(bufferSize); for ( int i = 0; i < bufferSize; ++i) { float f; in >> f; if (f > max) max = f; if (f < min) min = f; imageBuffer[i] =f; }
Code:
1
2
3
4
5
6
7
8
9 template<typename T> T min = std::numeric_limits<T>::max() ; //Pour trouver le min et le max de l'image. T max = -std::numeric_limits<T>::max() ; template<typename T> std::vector<T> imageBuffer(bufferSize) ; template<typename T> T f ;
tu peut montrer le code template que tu as fait?
et
Code:
1
2 T min = std::numeric_limits<T>::max() ; T max = -std::numeric_limits<T>::max() ;
Citation:
Envoyé par yan
Tu peux revenir sur cette ligne Yan stp car je vois 2 fois la methode max() sur min et max??est ce une erreur? et le signe - pour max??pourquoiCode:
1
2 float min = std::numeric_limits<float>::max(); float max = - std::numeric_limits<float>::max();
Si j'ai bien compris là on initialise min à la valeur minimale des pixels et max à la valeur maximale!
C'est symétrique, l'opposé de max c'est -max.
non c'est l'inverse :
min : valeur max du pixel
max : valeur min du pixel
donc pour les type signé les valeur min et max sont symétrique mais pas pour les type non signé.
Par exemple unsigned char est compris entre 0 et 255.
Donc, une autre manière d'initialiser ces valeurs pour la recherche est de les initialiser avec la valeur du premier pixel.
Oui bien sur moi je parlais pour de float et effectivement pour les valeurs non signées ca ne marche pas. De meme pour un char cela te donnera des valeurs compris entre -128 (min) à 127 (max) alors que ta technique yan va donner si je ne me trompe pas des valeur -127 (min) à 127 (max).
Sinon pourquoi pas utiliser ça:
Code:std::numeric_limits<T>::min();