Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用Python堆叠天文图像_Python_Image_Python Imaging Library_Astronomy_Color Depth - Fatal编程技术网

用Python堆叠天文图像

用Python堆叠天文图像,python,image,python-imaging-library,astronomy,color-depth,Python,Image,Python Imaging Library,Astronomy,Color Depth,我以为这会更容易,但过了一段时间,我终于放弃了,至少有几个小时 我想从一组时间点的图片中复制这张后星图像。受此启发: 使用VirtualDub拍摄的低分辨率视频帧,并与imageJ结合使用。我想象我可以很容易地复制这个过程,但是使用Python时使用了更注重内存的方法,因此我可以使用它来获得更好的输出 我的算法思想很简单,一次合并两幅图像,然后通过将结果图像与下一幅图像合并进行迭代。这样做了数百次,并对其进行了适当的称重,以便每个图像对最终结果的贡献相同 我对python相当陌生(这一点很明显

我以为这会更容易,但过了一段时间,我终于放弃了,至少有几个小时

我想从一组时间点的图片中复制这张后星图像。受此启发:

使用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)组合之前将其相乘,以使图像“不那么暗”,但结果同样糟糕)

这里的问题是,您要平均每个像素的亮度。这似乎是合理的,但实际上根本不是你想要的——明亮的恒星会被“平均化”,因为它们沿着图像移动。以以下四帧为例:

1000 0000 0000 0000
0000 0100 0000 0000
0000 0000 0010 0000
0000 0000 0000 0001
如果你平均这些,你将得到:

0.25 0    0    0
0    0.25 0    0
0    0    0.25 0
0    0    0    0.25
当您需要时:

1000
0100
0010
0001
代替混合图像,您可以尝试为每个像素获取任何图像中看到的最大值。如果您有PIL,您可以尝试ImageChops中的打火机功能

from PIL import ImageChops
import os, Image
files = os.listdir("./")
finalimage=Image.open("./"+files[0])
for i in range(1,len(files)):
    currentimage=Image.open("./"+files[i])
    finalimage=ImageChops.lighter(finalimage, currentimage)
finalimage.save("allblended.jpg","JPEG")
以下是我得到的:

编辑:我阅读了Reddit帖子,发现他实际上结合了两种方法——一种是针对恒星轨迹的,另一种是针对地球的。这是一个更好的平均方法,你尝试了,有适当的权重。我使用numpy阵列作为中间存储,而不是uint8映像阵列

import os, Image
import numpy as np
files = os.listdir("./")
image=Image.open("./"+files[0])
im=np.array(image,dtype=np.float32)
for i in range(1,len(files)):
    currentimage=Image.open("./"+files[i])
    im += np.array(currentimage, dtype=np.float32)
im /= len(files) * 0.25 # lowered brightness, with magic factor
# clip, convert back to uint8:
final_image = Image.fromarray(np.uint8(im.clip(0,255)))
final_image.save('all_averaged.jpg', 'JPEG')
这是一张图片,你可以将它与前一张照片中的星光轨迹结合起来。

您的图像权重不相等。例如,您的第一张图像的不透明度
1/(1+1)=0.5
,而您的第九张图像的不透明度
0.1
。Blender,我认为它的权重相等。当i=0时,1/(i+1)=1,则对于第一次迭代,该图像的权重为0.5,因为第二个图像(文件[1])拍摄了其他0.5,然后当i=2时,文件[2]的权重为0.33,前两个加起来的总权重为0.66。。也就是说,每个0.33。因此,第9幅图像确实有0.1 alpha,但这意味着前8幅图像的综合不透明度为0.9,即每幅图像0.1(考虑到文件[0])。不,@Blender是对的,您需要为每幅图像设置一个恒定的权重,这意味着
1/len(文件)
。如果你有两张图片,每张图片的总重量为0.5。如果你总共有10张图片,每张图片的权重为0.1。我相信这就是它得到的(相等的权重)。使用blend函数,每次调用结果时,结果都会被规范化,也就是说,如果我对第一个贡献进行0.1加权(对于10幅图像),例如,对黑色背景,当下一次迭代到来时,0.9黑色和0.1图像的图像将成为下一次混合贡献的0.9部分。第一个图像贡献0.09,第二个图像贡献0.1。最后,第10个图像的贡献率为0.1,第一个图像的贡献率为0.039(即0.1*(0.9)^10)。blend=image1*(1.0-alpha)+image2*alpha很棒!!非常感谢你。(尽管因imgur的尺寸限制而有所降低)[1]:@JunCTionS不用担心,看起来真的很不错。我读了Reddit的评论,他做了和我建议的一样的事情,但是有点像你最初对地球的平均方法。我会在这方面有一个快速裂纹,并添加它作为编辑。