Я думал, что это будет проще, но через некоторое время Я, наконец, отказываюсь от этого, по крайней мере, на пару часов ...
Я хотел воспроизвести это изображение звезды из набора интервальных снимков. Вдохновленный этим:
Первоначальный автор использовал видеокадры с низким разрешением, снятые с помощью VirtualDub и объединенные с imageJ. Я вообразил, что смогу легко воспроизвести этот процесс, но с более внимательным к памяти подходом с Python, поэтому я мог бы использовать исходные изображения с высоким разрешением для лучшего вывода.
Идея моего алгоритма проста: объединение двух изображений за раз, а затем повторение путем объединения полученного изображения со следующим изображением. Это делалось несколько сотен раз и тщательно взвешивалось, чтобы каждое изображение вносило одинаковый вклад в конечный результат.
Я новичок в python (и я не профессиональный программист, это будет очевидно), но, глядя вокруг, мне кажется, что библиотека изображений Python очень стандартна, поэтому я решил использовать ее (поправьте меня если думаете, лучше бы что-нибудь другое).
Вот что у меня есть на данный момент:
#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")
Это делает то, что должно, но результирующее изображение темное, и если я просто попытаюсь его улучшить, станет очевидно, что информация была потеряна из-за недостаточной глубины в значениях пикселей. (Я не уверен, какой здесь правильный термин, глубина цвета, точность цвета, размер пикселя). Вот окончательный результат с использованием изображений с низким разрешением:
или один, который я пробовал с полным разрешением 4k на 2k (из другого набора фотографий):
Итак, я попытался исправить это, установив режим изображения:
firstimage=Image.open("./"+files[0])
size = firstimage.size
finalimage=Image.new("I",size)
, но очевидно, что Image.blend не принимает этот режим изображения.
ValueError: изображение имеет неправильный режим
Есть идеи?
(Я также пытался сделать изображения «менее темными», умножив их перед объединением их с im.point (lambda i: i * 2), но результаты были так же плохо)