Объединение астрономических изображений с помощью Python

Я думал, что это будет проще, но через некоторое время Я, наконец, отказываюсь от этого, по крайней мере, на пару часов ...

Я хотел воспроизвести это изображение звезды из набора интервальных снимков. Вдохновленный этим: Inspiration

Первоначальный автор использовал видеокадры с низким разрешением, снятые с помощью 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")

Это делает то, что должно, но результирующее изображение темное, и если я просто попытаюсь его улучшить, станет очевидно, что информация была потеряна из-за недостаточной глубины в значениях пикселей. (Я не уверен, какой здесь правильный термин, глубина цвета, точность цвета, размер пикселя). Вот окончательный результат с использованием изображений с низким разрешением:

Low resolution result

или один, который я пробовал с полным разрешением 4k на 2k (из другого набора фотографий):

High resolution result with another set of images

Итак, я попытался исправить это, установив режим изображения:

firstimage=Image.open("./"+files[0])
size = firstimage.size
finalimage=Image.new("I",size)

, но очевидно, что Image.blend не принимает этот режим изображения.

ValueError: изображение имеет неправильный режим

Есть идеи?

(Я также пытался сделать изображения «менее темными», умножив их перед объединением их с im.point (lambda i: i * 2), но результаты были так же плохо)

18
задан JunCTionS 12 February 2012 в 20:58
поделиться