使用 OpenCV 进行星轨的后期处理

在文章鱼眼镜头与小行星特效中,笔者介绍了摄影师 Stephane Vetter 创作的一幅非常震撼的星轨照片。通过后期堆栈叠加的方式,将许多张连续拍摄的星空照片进行合成,即可得到星轨。这样的拍摄方式相比于 B 门曝光具有一些优势,例如可以避免拍摄过程中出现问题而前功尽弃,并且也有更多的数据用于后期处理。后期处理的软件也有很多选择,例如 Photoshop 的堆栈功能,或者著名的 Startrails.exe。笔者也用 Python 和 OpenCV 写了一段星轨的后期处理代码,但此前一直没有机会实测一下效果。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#!/usr/bin/env python3

import os
import cv2
import numpy as np

# 放置原始图片的路径
base = '/path/to/pictures'
names = sorted(os.listdir(base))

out_img = 'star-trails.jpg' # 保存的图片文件名
out_video = 'star-trails.mp4' # 保存的视频文件名
fps = 24 # 保存视频的 FPS,可以适当调整
frameSize = (3840, 2160) # 视频的尺寸

# 需要先装 ffmepg: sudo apt install ffmepg
fourcc = cv2.VideoWriter_fourcc(*'avc1')
videoWriter = cv2.VideoWriter(
out_video, fourcc, fps, frameSize)
frame = None

for name in names:
if os.path.splitext(name)[1].lower() == '.jpg':
print(name)
path = os.path.join(base, name)
curr = cv2.imread(path)
if frame is None:
frame = curr
else:
frame = np.maximum(frame, curr)
# 图片需要缩放到与视频尺寸一致
videoWriter.write(cv2.resize(frame, frameSize,
interpolation=cv2.INTER_AREA))
# 保存中间结果
cv2.imwrite(out_img, frame)

videoWriter.release()

最近几天天气都很不错,笔者终于可以填坑了。下图使用的拍摄参数是:焦距 17mm,光圈 f/4,ISO 1250,单张曝光时间 30s,连续拍摄了 240 张进行合成。

摄于北京大学


参考文章:star-stacker

拓展阅读:叠加法星轨的拍摄及后期方法