Bonjour,
J'aurais besoin d'aide pour faire a partir d'une image, un programme Python permettant de construire une image anaglyptique rouge-cyan.
Version imprimable
Bonjour,
J'aurais besoin d'aide pour faire a partir d'une image, un programme Python permettant de construire une image anaglyptique rouge-cyan.
j'ai déjà fait une image anaglyptique mais a partir de deux images et non une.
from PIL import Image
im=Image.open("Image.jpg")
im2=Image.open("Imagedecale.jpg")
taille=im.size
nbPixel=taille[0]*taille[1]
data=list(im.getdata())
data2=list(im2.getdata())
data3=list()
for i in range(0,nbPixel):
pixel=data[i]
rouge=pixel[0]
data3.append(data[i])
pixel2=data2[i]
vert=pixel[1]
bleu=pixel[2]
data3.append(data2[i])
im3.putdata(data3)
im3.save("iamge3D.jpg")
par dichotomie ?
(private "joke" - ne cherchez pas)
Il faut que je fasse par dichotomie ?
Non, c'était du second degré pour te rappeler une discussion où une autre intervenant et moi avions passé pas mal de temps à débrouiller ton problème de dichotomie sans que tu daignes te manisfester et répondre à nos questions, bref, une attitude purement consommatrice sur un forum plutôt communautaire où les gens prennent sur leur temps pour aider les autres.
J'en suis vraiment désoler mais je ne suis pas très souvent sur l'ordinateur car je n'y est pas toujours accès mais j'ai lue vos messages qui mon aider pour mon problème
Salut!
Peut-être pourrait-t-on commencer par ce sur quoi tu butte. Une petite explication sur le principe de la construction d'une image anaglyptique ne serait pas superflue je pense.
Ensuite une mise en forme du code à l'aide des balises est fortement recommendée (obligatoire devrais-je dire), ne serait-ce que pour l'indentation.
Bon courage!Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 from PIL import Image im=Image.open("Image.jpg") im2=Image.open("Imagedecale.jpg") taille=im.size nbPixel=taille[0]*taille[1] data=list(im.getdata()) data2=list(im2.getdata()) data3=list() for i in range(0,nbPixel): pixel=data[i] rouge=pixel[0] data3.append(data[i]) pixel2=data2[i] vert=pixel[1] bleu=pixel[2] data3.append(data2[i]) im3.putdata(data3) im3.save("iamge3D.jpg")
Ju
Quand je fait exécuter le programme j'obtient une image toute noir
C'est tout bonnement impossible : la ligne 21 lève, à tous les coups, une exception NameError et empêche de sauvegarder quoi que ce soit (image toute noire ou pas)Citation:
Envoyé par jojo5457
Le code n'est manifestement pas complet.
Supposons que im3 à été créé précédement, une autre question se pose.
À quoi servent les lignes
Si elles sont là, peut-être sont-elles utiles. Une autre version du code ?Code:
1
2
3
4
5
6
7 pixel=data[i] rouge=pixel[0] ... pixel2=data2[i] vert=pixel[1] bleu=pixel[2]
Ba non en faite elle serve a rien mais du coup je sais pas comment faire
Bonsoir,
J'ai également un projet d'image anaglyphe cependant je dois le faire en créant une image cyan et une autre rouge et assembler les deux pour obtenir mon image 3D.
J'ai réussi à créer les images cyan et rouge cependant je n'arrive absolument pas à créer mon image 3D.
Voici mon code :
import Image
imD= Image.open("D.jpg") #ouvrir D.jpg
imG= Image.open("G.jpg") #ouvrir G.jpg
taille = imD.size #calcul taille
l=taille[0]
h=taille[1]
t=l*h
dataD=list(imD.getdata())
dataG=list(imG.getdata())
imrouge=Image.new('RGB',taille)
datarouge=list()
imbleu=Image.new('RGB',taille)
datableu=list()
for i in range (0,t):
pixel=dataD[i]
Rd= pixel[0]
Vd= pixel[1]
Bd= pixel[2]
datarouge.append((Rd,0,0))
pixel=dataG[i]
Rg= pixel[0]
Vg= pixel[1]
Bg= pixel[2]
datableu.append((0,Vg,Bg))
imrouge.putdata(datarouge)
imrouge.save('imagerouge.jpg')
imbleu.putdata(datableu)
imbleu.save('imagebleu.jpg')
im3D=Image.new('RGB',taille)
imRouge=Image.open("imagerouge.jpg")
imBleu=Image.open("imagebleu.jpg")
dataRouge=list(imRouge.getdata())
dataBleu=list(imBleu.getdata())
data3=list()
for i in range (0,t):
pixel=dataRouge[i]
Rd= pixel[0]
Vd= pixel[1]
Bd= pixel[2]
data3.append((Rd,0,0))
pixel=dataBleu[i]
Rg= pixel[0]
Vg= pixel[1]
Bg= pixel[2]
data3.append((0,Vg,Bg))
im3D.putdata(data3)
im3D.save('image3D.jpg')
Je vous remercie par avance pour votre aide.
Cordialement,
Tixium.
Ouais, il me semblait bien de la décomposition des pixels était utile à quelque chose.
D'après le code de Tixium, une image anaglyptique se construirait comme ceci:
Image droite: [RD,VB,BD][RD,VB,BD][RD,VB,BD][RD,VB,BD][....
Image gauche: [RG,VG,BG][RG,VG,BG][RG,VG,BG][RG,VG,BG][....
Image résultante: [RD,0,0][0,VG,BG][RD,0,0][0,VG,BG][RD,0,0][0,VG,BG][...
Mais tous les pixels de chaque image sont utilisés donc la taille de l'image résultante doit être doublée.
Est-ce ainsi que se construit un anaglyphe ? Les pixels de l'image 'droite' originale sont placés à gauche dans l'image finale ? Faut-il deux images au départ ?
Si oui, alors, après correction de la taille, le code de Tixium devrait donner le résultat attendu.
Et si ça ne marche toujours pas, faudra donner le détail de ce qui ne va pas.
"un dessin (ici, une image) vaut mieux qu'un long discours"
http://plx.free.fr/dvp_images/anaglyphe_montage.jpg
tiré(e) de ce site
un autre proverbe "sauce chinoise" (qui n'existe certainement pas) :
"Quand on ne sait pas où on va, on a peu de chance d'y arriver"
Bonjour,
Merci pour vos réponses. J'ai donc changé la taille en la doublant et modifié le code. Le code s'éxécute correctement mais l'image finale est noire. Une idée ?
import Image
imD= Image.open("D.jpg") #ouvrir D.jpg
imG= Image.open("G.jpg") #ouvrir G.jpg
taille = imD.size #calcul taille
l=taille[0]
h=taille[1]
t=l*h
dataD=list(imD.getdata())
dataG=list(imG.getdata())
imrouge=Image.new('RGB',taille)
datarouge=list()
imbleu=Image.new('RGB',taille)
datableu=list()
for i in range (0,t):
pixel=dataD[i]
Rd= pixel[0]
Vd= pixel[1]
Bd= pixel[2]
datarouge.append((Rd,0,0))
pixel=dataG[i]
Rg= pixel[0]
Vg= pixel[1]
Bg= pixel[2]
datableu.append((0,Vg,Bg))
imrouge.putdata(datarouge)
imrouge.save('imagerouge.jpg')
imbleu.putdata(datableu)
imbleu.save('imagebleu.jpg')
im3D=Image.new('RGB',taille)
imRouge=Image.open("imagerouge.jpg")
imBleu=Image.open("imagebleu.jpg")
dataRouge=list(imRouge.getdata())
dataBleu=list(imBleu.getdata())
data3=list()
n=2*t
for i in range (0,n):
pixel=dataRouge[i]
dataRouge.append(data3)
pixel=dataBleu[i]
dataBleu.append(data3)
im3D.putdata(data3)
im3D.save('image3D.jpg')
Cordialement.
Heu, c'est uniquement la largeur qu'il faut doubler.
Si ton image est noire par contre, cela vient d'ici:
c'est le contraire:Code:
1
2
3
4
5
6 for i in range (0,n): pixel=dataRouge[i] dataRouge.append(data3) pixel=dataBleu[i] dataBleu.append(data3)
De toutes manières cela ne crée aucun décalage, il n'apparaît pas deux images dans le résultat.Code:
1
2 data3.append(pixel)
Merci de ta réponse. Cependant j'ai encore un problème :p
J'ai donc mit ceci :
for i in range (0,n):
pixelrouge=dataRouge[i]
data3.append(pixelrouge)
pixelbleu=dataBleu[i]
data3.append(pixelbleu)
Cependant, lorsque que j'éxécute, le messaged'erreur est le suivant :
line 48 pixelrouge=dataRouge[i]
Indexerror: list index out of range.
Une petite idée ? je sais que je suis ps loin du but mais je vois absolument pas comment terminer ce programme :/.
Merci d'avance.
Doubler ? doubler quoi ? L'image postée au post #15 s'affiche mal chez vous ?
Je ne comprend pas où vous voulez en venir.
Où vois tu sur le "poster" que j'ai posté, une image qui a 2 fois plus de colonnes que les images de départ ?
J'ai compris le principe pour la création de l'image, il n'y a pas de problèmes. Je ne vois simplement pas comment le "transcrire" en python. La seule chose qui me bloque c'est la fusion des 2 images.
Ps: j'ai aussi essayé avec n=(2*l)*h et j'ai le même soucis.
Si quelqu'un a une aide à me proposer pour la fusion, je prend ! :)
C'est dans les images gauche et droite que les décalages ont été préalablement introduits :Citation:
Envoyé par VinsS
- soit artificiellement si on ne dispose que d'un seul cliché original (pour reproduire sommairement un phénomène physique)
- soit physiquement, "naturellement", en ayant pris 2 clichés d'un même paysage mais avec 2 points de vue différents
Je suis presque sur du contraire. C'est pour cela que je traîne les pieds et te donne des indices au compte-goutte (encore que tout, absolument tout est dans l'image que j'ai postée, il n'y a aucun piège) ou te réorientes quand ça part de travers (le doublement de ?).Citation:
Envoyé par Tixium
L'embêtant c'est que c'est aussi la principale ! Quand tu as ton image gauche et ton image droite, ce n'est plus qu'une affaire de fusion. Il ne te reste donc plus qu'à traiter ... 90% du problème.Citation:
Envoyé par Tixium
C'est ce genre de choses qui me fait dire que tu n'as pas compris le principe. Tu tatonnes en Python en essayant différents "trucs" mais c'est le principe de base que tu n'as pas compris. Tu aurais le même souci dans tout autre langage. Ce n'est pas un problème d'implémentation et ce n'est pas au moment de coder qu'il faut résoudre ça. D'où mon "proverbe chinois" inventé pour l'occasion.Citation:
Envoyé par Tixium
Donc, qu'as-tu compris du principe de base ? Comment un pixel de l'image résultat (anaglyphe) est-il construit ?
Une fois que c'est compris, avec PIL, en partant de tes 2 images G.jpg et D.jpg (le passage par les images rouge et bleue n'est pas utile), sans aucune boucle, tu fais tout ça en ... (je compte) ... 7 instructions : import (1), ouverture de tes images origine (2 et 3), lecture des "choses nécessaires" dans les images origine (4 et 5), création de l'anaglyphe (6) et sauvegarde (7)
Bientôt Noël alors voilà les 7 lignes annoncées :
qui font la même chose que (dans un style plus proche des codes postés) ça :Code:
1
2
3
4
5
6
7 >>> from PIL import Image >>> image_G = Image.open('G.jpg') >>> image_D = Image.open('D.jpg') >>> red = image_G.split()[0] >>> green, blue = image_D.split()[1:] >>> anaglyphe = Image.merge("RGB",(red, green, blue)) >>> anaglyphe.save('anaglyphe.jpg')
Aucun doublement de quoi que ce soit mais, avec des images gauche et droite de même taille et phasées, récupération du plan rouge dans l'image gauche et des plans bleu et vert dans l'image droite.Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 from PIL import Image image_G = Image.open('G.jpg') image_D = Image.open('D.jpg') pixels_gauche = image_G.getdata() pixels_droite = image_D.getdata() pixels = list() for i in range(len(pixels_gauche)): r = pixels_gauche[i][0] g = pixels_droite[i][1] b = pixels_droite[i][2] pixels.append((r,g,b)) anaglyphe = Image.new("RGB",image_G.size) anaglyphe.putdata(pixels) anaglyphe.save('anaglyphe.jpg')