J'ai testé ce code sous visual :
Donc je pense surtout pour un template que ce code serait peut etre le plus approprié.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 int max = std::numeric_limits<char>::max();//max == 127 int min = std::numeric_limits<char>::min();//min == -128
je viens de tester aussi.
Le min dépend du type.... pour un float
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 float max= std::numeric_limits<float>::max(); float min= std::numeric_limits<float>::min();c'est pour cela que j'avais utilise - max.max = 3.4028235e+038
min = 1.1754944e-038
Effectivement avec des float c'est pas fiable comme technique. C'est curieux, c'est du a quoi ? c'est un bug de la STL ??![]()
Oui au moins comme ca cela marchera tout le temps. En meme temps c'est vrai que c'est l'algo de base pour trouver le min et le max d'un tableau alors pourquoi ce compliquer la vie...![]()
Avec les float, tout les "problèmes" sont dû à la façon d'être stocké, je t'encourage à lire cette page qui donne le minimum à comprendre (si tu ne veux pas te taper l'intégralité de l'IEEE754)
Merci IrmatDen je vais lire ça attentivement.![]()
Bonjour, merci les guars pour toutes ces precisions vraiment y a tout pour s'améliorer dans ce forum encore merci.
Aprés une dure journée de travail je me retrouve avec pleines de questions :
1éja j'ai essayé de faire un template ce qui est fondamental pour que je puisse generaliser ce code à tous mes images:je croyé que j'avais pas grand chose à faire que de generaliser les types et de faire le developpement dans le .h, mais je pense que c'est plus compliquer que ça , voici le bout que je considere comme mon template mais
c'est pas ça??
Je pensais que c'est la seule partie à generaliser car le reste ne depend pas des types(voir code precedent).Si vous pouvez me guider svp!!
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 T max = std::numeric_limits<char>::max();//max == 127 T min = std::numeric_limits<char>::min();//min == -128 std::vector<T>imageBuffer(bufferSize) ; for ( int i = 0; i < bufferSize; ++i) { T f; in >> f; if (f > max) max = f; if (f < min) min = f; imageBuffer[i] =f; }
2:Ma deuxieme question reviens sur la convertion des valeurs des pixels?En fait pouquoi on doit la faire cette convertion , j'ai compris que c'est pour que les valeurs des pixels soient comprises entre 0 et 255??Mais pourquoi?pour quelle raison??
J'attends votre aide avec impatience et merci d'avance!!!
Il faudrait déjà que tu change ça :
en
Code : Sélectionner tout - Visualiser dans une fenêtre à part T max = std::numeric_limits<char>::max();
Mais au final cela devrait t'etre inutile car comme te la dit yan tu devrais chercher le min le max en te referant au premier pixel de ton image.
Code : Sélectionner tout - Visualiser dans une fenêtre à part T max = std::numeric_limits<T>::max();
Pour ce qui est des images c'est juste parce que l'on a codé les composant RGB sur 8 bits donc valeur de pixel compris entre 0 et 255. C'est le type d'image le plus courant. Dans le scientifiques on utilise souvent des images avec des pixel codé sur 8, 10, 12 bits par exemple mais cela est necessaire uniquement parce que on souhaite faire du traitement dessus.
Ok, merci Superjaja.
Voici ce que j'ai fait en initialisant le min et max avec le premier pixel:
Est ce le depart sur le template est bon?
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 template<typename T> std::vector<T>imageBuffer(bufferSize) ; for ( int i = 0; i < bufferSize; ++i) { T f; in >> f; imageBuffer[i] =f; } T max = imageBuffer[0] ; T min = imageBuffer[0] for ( int j = 1; j < bufferSize; ++j) { if(imageBuffer[j] > imageBuffer[0]) max = imageBuffer[j]; if(imageBuffer[j] < imageBuffer[0]) min = imageBuffer[j]; } //convertion vers une QImage QImage img(fxd.NbColumns , fxd.NbRows,QImage::Format_RGB32); for (int y = 0; y < fxd.NbRows; y++) for (int x = 0; x < fxd.NbColumns; x++) { //simple règle de trois unsigned char pixel = 255 * (imageBuffer[y*fxd.NbColumns + x] - min) / (max - min); pixel = abs(pixel - 255) ; img.setPixel(x , y , qRgb( pixel , pixel, pixel )); }
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager