Bonsoir,
J'ai quelques exercices d'informatique à faire, certains programmes fonctionnent, mais d'autres non.
Comment pourrais-je vous envoyer par mail ce que j'ai fait ?
En effet mon professeur fréquente ce forum...
Merci pour l'aide !
Version imprimable
Bonsoir,
J'ai quelques exercices d'informatique à faire, certains programmes fonctionnent, mais d'autres non.
Comment pourrais-je vous envoyer par mail ce que j'ai fait ?
En effet mon professeur fréquente ce forum...
Merci pour l'aide !
bonsoir,
Si tu as du codes qui ne fonctionne pas comme tu le veux, tu peux toujours le poster ici pour qu'on puisse t'aider.
A moins que dans les consignes que le professeur t'ai donné il y ai de ne pas avoir une aide quelquonque je ne vois ou est le problème.
Non, il n'a pas dit que l'on n'avait pas le droit de solliciter de l'aide, mais je crains que s'il voit cela, j'ai une mauvaise note...
Est-il possible de l'envoyer par mail à quelqu'un ? C'est assez rapide !
Merci beaucoup.
Vous trouverez finalement l'énoncé, la fonction test, et ce que j'ai fait.
Bonjour,
je n'ai pas pu regarder tout le code mais:
pour la rotation regarde bien le résultat attendu et le résultat que sort ta fonction rotation(image_tab).
pour la dilation c'est le traitement sur image_tab qui ne fonctionne pas mais fonctionne apparement sur image_tab3pour l'érosion même problème cas que la dilation. donc à mon avis si tu résous le problème de la fonction dilation tu résoudras celui de la fonction erosion.
tu peux voir la différence de résultat à l'aide de print() dans le fichier test.py et ainsi voir ce qui va pas.
Pour la rotation, il y a 2 types d'erreurs fréquentes :
- Oublier d'inverser la largeur et la hauteur (ou le faire 2 fois).
- Mal placer les pixels : un petit dessin avec qqs exemples bien choisis permet de se faire une idée. Ensuite en affichant ces pixels (avec "print"), on peut vérifier que cela colle.
Dernier conseil, appliquer la fonction sur une image ou la largeur vaut par exemple 2 fois la hauteur avec des choses bien distinctes aux 4 coins.
Salut,
image_tab_90degres[j, i, :] = image_tab[i, j, :] fabrique la transposée i.e. une symétrie sur la diagonale principale.
Ça devrait se voir en regardant ce que çà donne avec une image avant/après la transformation.
Après pour trouver ce qu'il faut faire, c'est juste prendre un simple tableau:
et réfléchir à l'opération à effectuer pour obtenir:Code:
1
2 123 456
et nonCode:
1
2
3 36 25 14
Pour le reste, c'est pareil, papier crayon pour visualiser l'opération à effectuer puis quand çà fonctionne sur des exemples simples, on peut s'aventurer à coder quelque chose...Code:
1
2
3 14 25 36
- W
Bonsoir,
Merci beaucoup pour vos réponses.
J'ai réussi à régler le problème pour rotation, merci !
Par contre, pourriez-vous me dire ce qui ne va pas pour dilatation et erosion svp ?
Car là je ne vois pas du tout...
Merci beaucoup pour l'aide !
En ce qui me concerne, je vous ai déjà indiqué quoi faire: réfléchir papier/crayon avant de coder, puis une fois que vous avez une idée vous la testez sur quelques exemples, puis vous codez et si çà ne fonctionne pas ben vous relisez votre code en essayant de comprendre pourquoi çà ne fonctionne pas.
Relisez un peu çà:
Si vous n'avez pas d'idées vous ajoutez des "print" pour vous assurez que l'état de vos différentes variables est cohérent avec ce que vous attendez.Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 def erosion(image_tab): image_tab2 = image_tab.copy() hauteur = len(image_tab) longueur = len(image_tab[0]) for i in range(1,hauteur-1): for j in range(1,longueur-1): a=0 voisins = [-1]*8 c=0 for i2 in range(3): for j2 in range(3): voisins[c] = image_tab2[i-1+i2 ,j-1+j2] if all(voisins): image_tab2[i,j]=255 else : image_tab2[i,j]=0 return image_tab2
note: c'est en faisant ce boulot de mise au point que vous apprenez à programmer... Si vous ne le faites pas autant attendre la correction que vous donnera le prof.
- W
Merci beaucoup pour la réponse.
Malheureusement, j'ai déjà fait depuis 1 mois ce genre de test, et je n'aboutis à rien, c'est pour erosion et pour dilatation que j'ai besoin d'aide, j'ai fait tout le reste tout seul...
Pourriez-vous me corriger ce qui ne va pas svp ?
Voici plus précisément mon problème :
Bonjour,
Qu'est censé faire la fonction int ? et à quel type de variable python essayez-vous d'accéder avec vos index i et j ?Code:matimagegrise [i,j] = int (image_tab [i,j][0]/3 + image_tab [i,j][1]/3 + image_tab [i,j] [2]/3)
Merci pour la réponse.
Int est censé retourner un entier.
Par contre pour i et j ne vois pas où vous voulez en venir ?
Désolé, mais je ne comprends déjà pas ce qu'est image_tab
Pour ma part, je pars d'une image que j'ouvre, par exemple :
Si cela t'intéresse, j'ai un cours sur le traitement de l'image ici :Code:
1
2
3
4
5
6
7
8 from PIL import Image import numpy as np nom_image = "billes.jpg" mon_image = Image.open(nom_image) cont = contour(mon_image) dilat = dilatation(mon_image) cont.show() dilat.show()
http://obelix56.free.fr/spip.php?article55
Par contre, c'est peut-être un tord, mais je n'ai pas effectué les traitements avec numpy mais directement sur les listes de listes de pixels. Je trouvais au moment de la conception que c'était plus facile à la compréhension.
Comme le dit wiztricks, attends la correction. Le fait d'avoir cherché est déjà très formateur.
Edit :
J'imagine que c'est avec :
Code:
1
2
3
4
5 import numpy as np import imageio nom_image = "billes.jpg" mon_image = imageio.imread(nom_image) print(mon_image)
image_tab correspond à une image sous forme matricielle...
Malheureusement je ne peux pas rendre mon devoir "en l'état", c'est interdit tant qu'il reste des erreurs "en rouge"...
Voyez-vous comment enlever mon erreur ?
Merci encore.
Voilà comment on utilise image_tab :
Est-ce plus clair comme ça ?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
33
34
35
36
37
38
39
40
41
42 from PIL import Image import numpy as np nom = "image.jpg" image = Image.open(nom) image.show() image_tab = np.array(image) def niveaux_de_gris (image_tab): L = len(image_tab) C = len(image_tab[0]) matimagegrise=np.zeros ((L,C),dtype=np.uint8) for i in range (L) : for j in range (C) : matimagegrise [i,j] = int (image_tab [i,j][0]/3 + image_tab [i,j][1]/3 + image_tab [i,j] [2]/3) return matimagegrise def dilatation(image_tab): image_tab2=niveaux_de_gris(image_tab2) hauteur , longueur = image_tab3.shape for i in range(1,hauteur-1): for j in range(1,longueur-1): a=0 voisins = [-1]*8 c=0 for i2 in range(3): for j2 in range(3): voisins[c] = image_tab2[i-1+i2 ,j-1+j2] if any(voisins): image_tab2[i,j]=255 else : image_tab2[i,j]=0 return image_tab3 image_tab2=dilatation(image_tab) nouvelle_image = Image.fromarray(image_tab2) nouvelle_image.show() nouvelle_image.save("nouveau_"+nom)
Non, pas encore mais je ne vais pas traîner...
Premier problème : ton image en niveaux de gris ne fonctionne pas.
Voici une correction, cela pourra peut-être t'aider :
J'ai supposé que tu avais cela pour l'affichage :Code:
1
2
3
4
5
6
7
8
9 def niveaux_de_gris (image_tab): L = len(image_tab) C = len(image_tab[0]) k=3 matimagegrise=np.zeros ((L,C,k),dtype=np.uint8) for i in range (L) : for j in range (C) : matimagegrise [i,j] = int (image_tab [i,j][0]/3 + image_tab [i,j][1]/3 + image_tab [i,j] [2]/3) return matimagegrise
Code:
1
2
3
4
5
6
7
8 nom_image = "billes.jpg" mon_image = imageio.imread(nom_image) print(mon_image) nvg = niveaux_de_gris(mon_image) print(nvg) from matplotlib import pyplot as plt plt.imshow(nvg, interpolation='nearest') plt.show()
Merci beaucoup pour la réponse.
J'ai modifié la fonction
Voici pour terminer qqchose qui fonctionne mais je ne sais pas si c'est vraiment ce que tu attends. L'énoncé précise qu'il faut convertir l'image en niveaux de gris, c'est ce que j'ai fait au début de la fonction contour.
Tu avais une grosse erreur je crois car tu avais un return de l'image initiale.
Ce code fonctionne chez moi et il n'y a pas de raison que cela ne soit pas le cas chez toi.
Comme tu peux le voir, je pars d'une image en "jpg" et celle-ci est en couleurs !
Je ne pourrai pas t'aider plus, j'ai aussi du travail...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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50 def contour(image_loc): image_loc=niveaux_de_gris(image_loc) L = len(image_loc) C = len(image_loc[0]) m=3 image_loc2=np.zeros ((L,C,m),dtype=np.uint8) for i in range (1,C-1): for j in range (1,L-1): somme = 0 for i2 in range(3): for j2 in range(3): somme += image_loc[i-1+i2 ,j-1+j2] tmp = 8 * image_loc[i,j] - somme for k in range(len(tmp)): if tmp[k]>255: tmp[k]=255 elif tmp[k]<0: tmp[k]=0 image_loc2[i,j] = tmp return image_loc2 def niveaux_de_gris (image_tab): L = len(image_tab) C = len(image_tab[0]) m=3 matimagegrise=np.zeros ((L,C,m),dtype=np.uint8) for i in range (L) : for j in range (C) : matimagegrise [i,j] = int (image_tab [i,j][0]/3 + image_tab [i,j][1]/3 + image_tab [i,j] [2]/3) return matimagegrise #from PIL import Image import numpy as np from PIL import Image nom_image = "billes.jpg" image = Image.open(nom_image) image.show() mon_image = np.array(image) nvg = niveaux_de_gris(mon_image) nouvelle_image = Image.fromarray(nvg) nouvelle_image.show() cont = contour(mon_image) nouvelle_image = Image.fromarray(cont) nouvelle_image.show() #dilat.show()
Bon courage.
Merci infiniment !
Maintenant, comment pourrais-je obtenir une fonction dilatation et une fonction erosion justes ?
Voici la fonction "test" qui permet de tester le DM si besoin...
Oui, mais je ne vais pas faire le devoir à ta place. Pour toi aussi, il est temps d'aller se coucher !
Un dernier point et je te quitte : n'est-il pas précisé dans l'énoncé qu'il faut d'abord convertir l'image en noir et blanc avant de dilater ou d'éroder ?
Sur ce, bonne nuit !
Merci pour la réponse.
Effectivement il faut convertir l'image en noir et blanc avant d'utiliser erosion et dilatation, mais c'est ce que je fais en écrivant image_tab3=niveaux_de_gris(image_tab) au début des 2 programmes, non ?
Pourriez-vous me mettre sur la piste de ce que je dois modifier pour ne plus avoir l'erreur s'il vous plaît ?
J'ai déjà fait tout le reste tout seul, et tant qu'il y a encore des erreurs je n'ai pas le droit de le rendre, mais je dois le rendre avant ce soir...
Merci beaucoup.
Une conversion en niveaux de gris donne des valeurs de pixel compris entre 0 et 255.
Une conversion en noir et blanc donne des valeurs à 0 ou bien à 255.
On pourrait écrire un truc comme ça :
Pour la dilatation et l'érosion, désolé mais je n'ai pas le temps aujourd'hui.Code:
1
2
3
4
5
6
7
8
9
10
11 def noir_et_blanc (image): hauteur,largeur,profondeur = image.shape new_image=np.zeros((largeur,hauteur,profondeur),dtype=np.uint8) for i in range (hauteur) : for j in range (largeur) : if int(image[i,j][0]/3+image[i,j][1]/3+image[i,j][2]/3) >=128: new_image[i,j] = 255 else: new_image[i,j]=0 # pb de dépassement de uint8 si division après la somme return new_image
Je ne comprends pas pourquoi tu mets les pixels à -1 ni pourquoi tu as 8 valeurs : il devrait y en avoir 9 en comptant la cellule elle-même, non ?
Un peu de temps.
Pour la dilatation, tu peux créer une liste vide "voisins" puis parcourir comme tu le fais les voisins et ajouter le premier canal (ils sont tous égaux dans un même pixel). Ensuite mettre le centre donc voisins[4] à 255 et enfin mettre le nouveau pixel à 0 si il y a un 0 dans les voisins (0 in voisins), 255 sinon.
Pour l'érosion, même principe mais mettre voisins[4] à 0 et comparer voisins à la liste [0,0,0,0,0,0,0,0,0].
Merci encore pour la réponse.
Le premier canal, c'est le rouge, donc image[i,j][0].
Ma fonction niveaux_de_gris est la suivante :
Elle fonctionne évidemment.Code:
1
2
3
4
5
6
7
8 def niveaux_de_gris (image): hauteur,largeur,profondeur = image.shape new_image=np.zeros((hauteur,largeur,profondeur),dtype=np.uint8) for i in range (hauteur) : for j in range (largeur) : new_image[i,j] = int(image[i,j][0]/3+image[i,j][1]/3+image[i,j][2]/3) # pb de dépassement de uint8 si division après la somme return new_image
Pour le reste, je t'ai expliqué comment je ferais (il y a d'autres possibilités) et de mon côté, je ne suis pas chez moi ce soir. Je ne ferai pas ton devoir, je crois t'avoir déjà bien aiguillée.
Enfin, je trouve cette phrase étrange : "Je dois rendre mon travail ce soir, et il ne faut plus qu'il y ait d'erreur sinon il ne corrige rien..."
C'est donc 0 ou 20 ??? Drôle de prof si c'est le cas.
Bon courage.
[edit] Une erreur entre largeur et hauteur que je viens de modifier.
OK, merci pour la réponse !