一开始我以为这会很容易,但过了一会儿我最终还是放弃了,至少要休息几个小时...
我想复制这个星轨图像,它是从时间序列照片集中生成的。受到这个启发:
原作者使用了用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)相结合之前对其进行乘法来使图像“变暗”,但结果仍然很糟糕)
1 / (1 + 1) = 0.5
,而你的第九张图片的不透明度为0.1
。 - Blender1/len(files)
。如果你总共有2张图片,每张图片的权重为0.5。如果你总共有10张图片,每张图片的权重为0.1。 - mathematical.coffee