Maximum (ou seuil) puis ses coordonnées dans une image 8bits?
cs_yannick01
Messages postés2Date d'inscriptionmercredi 9 janvier 2002StatutMembreDernière intervention 7 juin 2005
-
5 juin 2005 à 23:12
vdust
Messages postés43Date d'inscriptionjeudi 16 décembre 2004StatutMembreDernière intervention14 mars 2007
-
8 juin 2005 à 20:03
Bonjour à tous,
pour mon boulot, j'ai une ptite chose à faire en c++, c'est pas
tellement mon truc de programmer, mais j'ai besoin de modifier un
programme existant, pas de moi (d'ailleurs, vu mon niveau extrêment
nul, ça risque pas), pour les besoins de mon travail.
Comme je l'ai dit précédemment, mon niveau en programmation est
vraiment nul, je sais manipuler des bouts de codes pour les coller
entre eux, à la rigueur, les modifier, bref, je sais à peine faire une
boucle if. (soyez pas trop méchant avec moi ).
Je de parcourir toute la catégorie "Graphique" dans les codes, et même
chose sur le forum pour voir si je trouvais quelquechose s'en
rapprochant, mais rien (ptet que je sais pas chercher), donc si vous
pensez que je peux trouver mon bonheur dans une autre catégorie, je
suis tout ouïe.
Donc pour en revenir à ce que j'aimerai faire, dans mon programme
existant, je charge une image en ram (en générale de type 8bits, donc
valeur des pixels entre 0 et 255), je lance une des nombreuses fonction
dispo (en pointant sur cet image), qui est de connaître le maximum, sachant que l'image est en noir
et blanc, mon max est plutôt dans le blanc, prenons pour exemple
233, et c'est là que j'aimerai connaître ses coordonnées?
Et toujours à partir du max (233), j'aimerais connaître le nombre de pixel dans l'image dont la valeur est supérieur à max/2?
Pour info, je suis sous labwindows sur windows2000.
Voilà, j'espère que c'est possible, je n'ai absolument aucune idée sur
la façon de faire, mais c'est vraiment important pour moi.
Merci d'avance à tout ceux qui me donneront un sérieux coup de mains.
A voir également:
Maximum (ou seuil) puis ses coordonnées dans une image 8bits?
vdust
Messages postés43Date d'inscriptionjeudi 16 décembre 2004StatutMembreDernière intervention14 mars 2007 6 juin 2005 à 23:28
Petite précision sur la fonction de buno : remplace
tous les "&" (référence) dans le prototype par des "*" (pointeurs)
; ou bien supprime tous les "*" apparaissant dans le corps de la
fonction. Comme tu débutes en programmation, peut-être que le concept
de pointeur t'es inconnu et/ou te fais peur (moi, ça a été le cas au
début ^^). Dans ce cas, utilise la deuxième solution (supprimer tous
les "*"). Saches seulement que toute modification d'un argument précédé
d'un "&" modifie la variable utilisée pour cet argument lors de
l'appel de la fonction.
cs_yannick01
Messages postés2Date d'inscriptionmercredi 9 janvier 2002StatutMembreDernière intervention 7 juin 2005 7 juin 2005 à 20:58
Bonsoir à tous, je remercie tout d'abord Buno pour sa réponse rapide,clair et compréhensible
j'ai testé aujourd'hui mais ya quelques problèmes, je vais m'expliquer.
Merci aussi à Virtual Dust, c'est crai que je ne comprend pas vraiment
le concept des pointeurs, et que par exemple ici, un de mes problèmes
est sur ce sujet.
Donc, le plus simple, je colle la moitié du code que j'ai modifié pour mes besoin:
int i,j;
*Max=*Max_X=*Max_Y=*nbPixels=0;
for (i=0; i < *ptRefImage0.height; i++) //
Ici, j'ai une erreur à la compilation: Left operand of . has
incompatible 'pointer to long' (même chose à la ligne d'en dessous), je
pense que ça vient du height et width, car en fouillant un peu, j'ai vu
que la personne ayant réalisé ce gigantesque programme
(plusieurs milliers de lignes réparti sur une cinquantaine de fichiers)
à "redéfini" ces paramètres (enfin je pense, je suis pas sûr). Y a-y-il
un autre moyen pour parcourir les lignes et les colonnes? est-ce que si
je connaissai les dimensions de l'image, ça pourrait arrangé les choses?
{
for (j=0; j < *ptRefImage0.width; j++)
{
if (*ptRefImage0[i][j] > *Max) //Ici,
j'ai aussi une erreur à la compilation: "Type error: pointer expected"
(2 fois), donc il bloque sur [i] et [j], pourquoi? je n'arrive pas à le
déterminer.
{
*Max = *ptRefImage0[i][j];
*Max_X = j;
*Max_Y=i;
}
}
}
Voilà, donc si ça vous dérange pas de m'orienter une fois de plus, ça
m'arrangerait beaucoup, en tout cas merci encore une fois pour vos
réponse.
BunoCS
Messages postés15472Date d'inscriptionlundi 11 juillet 2005StatutModérateurDernière intervention25 mars 2024103 8 juin 2005 à 09:13
Hi!
Il faut savoir que je t'ai donné un code général, à adapter suivant tes besoins. A savoir:
- quand j'ai mis "image.height", il faut que tu le remplace par la hauteur de l'image (idem pour la largeur)
- quand j'ai mis "image[i][j]", cela veut dire qu'il faut
accéder au pixel (i,j) donc cela dépend de ta structure image (tableau?
matrice?). essaie sinon ceci: image[i*image.width+j]
@+
Buno
----------------------------------------
L'urgent est fait, l'impossible reste à faire. Pour les miracles, prévoir un délai...
Vous n’avez pas trouvé la réponse que vous recherchez ?
vdust
Messages postés43Date d'inscriptionjeudi 16 décembre 2004StatutMembreDernière intervention14 mars 2007 8 juin 2005 à 20:03
Le problème vient effectivement d'un pointeur. Prenons la première ligne qui pose problème
for (i=0; i < *ptRefImage0.height; i++)
ici, l'étoile '
*
'
indique le déréférencement d'un pointeur. En gros, ça veut dire que
l'on veut accéder à la valeur pointée par le pointeur. Or, ce
qu'il faut savoir, c'est que l'étoile est d'une priorité inférieur au
point '.
' (qui
signifie "l'objet après le point est membre de l'objet avant le
point"). Le compilateur interprète donc la ligne comme suit
for (i=0; i < *(ptRefImage0.height); i++)
Or, ce que tu veux, c'est
for (i=0; i < (*ptRefImage0).height; i++)
car c'est ptRefImage0 qui
est le pointeur. Il y a un autre moyen d'accéder à un membre de ton
objet lorsque l'on à affaire à un pointeur vers cet objet. En utilisant
le symbole '->' comme suit
for (i=0; i < ptRefImage0->height; i++)
Là,
plus besoin du point ni de l'étoile. Cette syntax est souvent préférée,
étant donné que l'on voit tout de suite que l'on a un pointeur vers un
objet et non pas l'objet lui même.
Cependant, si cela va résoudre une erreur de compilation, tu vas
surement en avoir d'autres derrière. Tout dépend de la manière dont a
été défini l'objet ptRefImage0.
Comme je ne le sais pas, essaie de corriger comme je viens de l'indiquer, et tu diras à nouveau où ça coince.
Pour ce qui est du deuxième problème, il est relié au premier par ce même problème de pointeur. ptRefImage0
est un pointeur... qui est peut-être un simple tableau. Dans ce cas,
l'étoile est inutile. En effet, lorsque tu déclares un tableau,
int tableau[100]
par exemple. Ici, tableau[i] (i=0..99) est un entier, tandis que 'tableau' sans rien derrière est un pointeur vers le premier élément du tableau (de sorte que *tableau est équivalent à tableau[0]). La ligne de ton code devient donc (en supposant que img_width est la largeur du tableau :
*Max = ptRefImage0[i*img_width + j];
En espérant que maintenant, ça fonctionne
^^ (mais j'en doute... car un autre problème se pose... on y reviendra
s'il y a d'autres erreurs de compilation.)
Je te recommande vivement de lire des docs sur les pointeurs. Ca parait
difficile comme ça, mais avec un peu de pratique (en essayant), on y
arrive. Je n'ai pas de site comme ça en tête, mais en tapant "pointeurs
C" dans Google, tu devrais avoir de nombreux liens utiles. ^^