我以为这会更容易,但过了一段时间我终于放弃了,至少几个小时......
我想从一组延时摄影中重现这张尾随的星星图像。受此启发:
原作者使用了用 VirtualDub 拍摄的低分辨率视频帧,并结合了 imageJ。我想我可以很容易地重现这个过程,但使用 Python 的方法更注重内存,所以我可以使用原始的高分辨率图像来获得更好的输出。
我的算法思路很简单,一次合并两张图片,然后通过合并生成的图片和下一张图片进行迭代。这完成了数百次并适当地权衡它,以便每张图像对最终结果都有相同的贡献。
我对 python 还很陌生(而且我不是专业程序员,这很明显),但是环顾四周,在我看来 Python Imaging Library 是非常标准的,所以我决定使用它(如果你认为请纠正我别的东西会更好)。
这是我到目前为止所拥有的:
#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 x 2k 分辨率(来自另一组照片):
所以,我尝试通过设置图像模式来修复它:
firstimage=Image.open("./"+files[0])
size = firstimage.size
finalimage=Image.new("I",size)
但显然 Image.blend 不接受该图像模式。
ValueError:图像的模式错误
有任何想法吗?
(我还尝试通过在将它们与 im.point(lambda i: i * 2) 组合之前将它们相乘来使图像“不那么暗”,但结果同样糟糕)