ho pensato che questo sarebbe stato più facile, ma dopo un po 'sono finalmente rinunciare a questo, almeno per un paio d'ore ...immagini astronomia impilabile con Python
ho voluto riprodurre questo un finale stelle l'immagine di una serie di immagini timelapse. Ispirato da questo:
The original author utilizzato frame video a bassa risoluzione presi con VirtualDub e combinati con imageJ. Ho immaginato di poter riprodurre facilmente questo processo, ma con un approccio più attento alla memoria con Python, così ho potuto usare the original high-resolution images per un risultato migliore.
L'idea del mio algoritmo è semplice, unendo due immagini alla volta e quindi iterando unendo l'immagine risultante con l'immagine successiva. Questo è stato fatto centinaia di volte e correttamente pesato in modo che ogni immagine abbia lo stesso contributo al risultato finale.
Sono abbastanza nuovo per Python (e non sono un programmatore professionista, sarà evidente), ma guardandomi attorno mi sembra che la libreria di immagini Python sia molto standard, quindi ho deciso di usarla (correggere se pensi che qualcos'altro sarebbe meglio).
Ecco quello che ho finora:
#program to blend many images into one
import os,Image
files = os.listdir("./")
finalimage=Image.open("./"+files[0]) #add the first image
for i in range(1,len(files)): #note that this will skip files[0] but go all the way to the last file
currentimage=Image.open("./"+files[i])
finalimage=Image.blend(finalimage,currentimage,1/float(i+1))#alpha is 1/i+1 so when the image is a combination of i images any adition only contributes 1/i+1.
print "\r" + str(i+1) + "/" + str(len(files)) #lousy progress indicator
finalimage.save("allblended.jpg","JPEG")
Questo fa quello che si suppone, ma l'immagine risultante è buio, e se ho semplicemente cerco di valorizzarlo, è evidente che l'informazione è stata persa a causa mancanza di profondità nei valori del pixel. (Non sono sicuro di quale sia il termine corretto, profondità del colore, precisione del colore, dimensioni dei pixel). Ecco il risultato finale con immagini a bassa risoluzione:
o uno cercavo con la piena 4k da 2k risoluzione (da un altro insieme di foto):
Quindi, ho cercato di risolvere il problema impostando la modalità immagine:
firstimage=Image.open("./"+files[0])
size = firstimage.size
finalimage=Image.new("I",size)
ma a quanto pare Image.blend d o non accetta quella modalità immagine.
ValueError: image has wrong mode
Qualche idea?
(ho anche provato a fare le immagini "meno oscuro" moltiplicandolo prima di loro combinazione con im.point (lambda I: i * 2), ma i risultati sono stati altrettanto male)
Le immagini non sono ugualmente ponderate. Ad esempio, la tua prima immagine ha opacità '1/(1 + 1) = 0.5', mentre la tua nona immagine ha opacità' 0.1'. – Blender
Blender, penso che sia ugualmente ponderato. quando i = 0, 1/(i + 1) = 1, quindi per la prima iterazione l'immagine ha un peso di 0.5 perché l'altra 0.5 è presa dalla seconda immagine (file [1]), e quindi quando i = 2 , il file [2] ha un peso di 0,33, lasciando i primi due combinati con un totale di 0,66 .. cioè 0,33 ciascuno. Quindi la nona immagine ha effettivamente 0.1 alfa, ma ciò significa che i primi 8 hanno un'opacità combinata di 0,9, cioè 0,1 per immagine (considerando il file [0]). – JunCTionS
No, @Blender ha ragione, è necessario un * peso costante per ogni immagine *, che significa '1/len (file)'. Se hai 2 immagini in totale, ogni immagine diventa 0.5. Se hai 10 immagini in totale, ciascuna immagine assume il peso 0.1. –