专栏名称: 牧夫天文
中国最早的天文社区网站,成立于1999年,这里是牧夫天文论坛的官方交互电子刊。通过本微信公众订阅号,您可以及时了解天文、航天和牧夫论坛的最新资讯,并可深入学习天文器材和双筒望远镜等光学仪器的使用方法,和全球华人一起交流分享使用经验。
51好读  ›  专栏  ›  牧夫天文

如何拍出好星野

牧夫天文  · 公众号  · 科学  · 2017-02-21 07:12

正文

周日 · 天文周历  |   周二 · 牧夫专栏  |  周三 · 太空探索

 周四 · 观测指南  |  周五 · 天文视频



作者:章佳杰

编排:冯中


在上一篇文章(《星野摄影降噪(1):基础知识》)中,我大致介绍了星野摄影中相机噪声的一些特性,以及减少噪声的大致手段。其中,拍摄多张图片进行叠加降噪,是一种非常有效的降噪手段。

现在网上也已经有很多介绍叠加降噪的文章了,我这篇文章要说的和别人有什么不同呢?其实我自己在拍摄实践的过程中发现,网上的文章大多使用 Photoshop 软件自带的自动对齐功能,这个功能对普通场景的照片是挺好用的,不过并不太适合星野摄影的场景,很多情况下会对齐失败。一旦失败,往往需要手动对图层进行变形对齐,费时费力不说,精度也很差。为此,我自己上手撸代码,写了一些处理图片的小程序,来帮助对齐星空的图片。

在本篇文章中,我会介绍在 Photoshop 里怎样进行叠加降噪,还会详细地介绍我自己写程序处理对齐星野图片的思路。



1

使用 Photoshop 叠加

 

要叠加降噪,首先要对图片进行对齐。这个「对齐」的操作,在这里对两个对象需要分别对待:天空和地面。当使用三脚架拍摄多张图片的时候,地面的对齐就比较简单,甚至不用做特别的设置,直接叠加就行;但对于天空部分,就比较麻烦,需要仔细处理。

对一张照片来说,怎么叫对齐了呢?我们可以很直接地提出一个标准:对照片上的「特征点」,比如明显的纹理、明显的明暗交界、物体明显的边缘、拐角等,如果画面里的所有「特征点」在前后多张照片中都具有相同的位置坐标,那就是对齐了。直观上说,就是把多张照片「摞起来」,「透视」地看下去,所有的特征点都能重合上。

对一般场景的照片来说,特征点比较丰富,软件自动识别比较容易,这时 Photoshop 的自动对齐功能是很好用的。在 Photoshop 菜单中选择「文件」-「脚本」-「将文件载入堆栈」(我使用的是英文系统,菜单名字是我按照记忆写的,可能与实际中文版软件略有出入),

 

 

在弹出的对话框里选择需要叠加的若干张图片,同时勾选「尝试自动对齐」和「创建智能对象」这两个选项,

 

 

点击确定,Photoshop 就开始自动加载所有图片,并且会分析图片上的「特征点」,根据特征点尝试对图片进行对齐,之后就会创建一个智能对象的图层。如果你没有看到一个单独的智能对象图层,而是出现了多个图层,那是因为在载入图片的对话框中漏勾选了「创建智能对象」的选项。此时除了重走以上流程载入图片,还可以把所有图层选中,右键单击,在菜单中选择「转换为智能对象」,把所有图层一起转换为一个智能对象。

 


转换为智能对象之后,在菜单中选择「图层」-「智能对象」-「堆栈模式」-「平均值」,就可以得到叠加之后降噪的图片了。



看起来一切都很顺利,然而仔细看我们发现,Photoshop 自动对齐的结果,仅仅对齐了地面景物,天空的部分仍然是没有对齐的。在这个过程中我们没办法控制让软件按照地景对齐还是按照星空对齐。在这个例子中地面景物占据画面很大一部分,对齐过程也比较顺利,如果拍摄的画面中大部分是星空,则很可能会对齐失败。因为对星空来说,很难让软件自动识别。随便取一块局部的星空,上面密密麻麻布满了大大小小的星点,看起来和另一块随便选的星空局部差不多。换句话说,星空缺少「特征」,这也是为什么Photoshop的自动对齐功能在面对星空的场景时,往往无能为力。

(此处是不是该有高能预警?因为接下来的部分,可能要进入另一个世界了)


2

提取星点

 

如果是人手动操作对齐,星空最明显的特征就是一个个的星点。为了让电脑自动计算,我们也需要找出星空中的一个个星点,并且进一步地,我们需要识别出这些星点的对应关系,确定出前后几张画面中哪些星点实际上是同一颗星,然后以此为「特征点」,计算不同照片之间的变换关系。

那怎么才算是一个星点呢?

一个最朴素直观的想法就是,把亮度大于某个值的像素作为星点。这个想法有一个很大的问题,照片中,即使是天空部分,亮度也是不均匀的,有来自地面的光污染,有银河,有气辉。如果简单按照亮度一刀切,要么会遗漏大量暗弱的星点,要么会把银河当做一个巨大的星点。

 

 

上图就是直接按照亮度进行划分的,可以看到,在银河中心部分,以及月亮周围,由于本身背景的亮度就比较亮,在这个朴素的算法下直接被当做两团巨大的「星点」。此外,这个方法也不够稳定,多张画面之间如果曝光有变化,比如有薄云、气辉等造成画面亮度的细微变化,这个方法识别出来的星点就会受到很大的影响,这对后续的星点匹配是不利的。

有没有更好的办法呢?

在之前朴素想法的基础上,我们更深入地想想看,不是看绝对亮度,而是看相对于周围背景的亮度。如果一个很小的区域,比它周围的背景像素都要亮,就把它当做一个星点。这个判断条件就比较好了,即使是银河这样的明亮区域,其中的星点也符合这样的规律。

怎么做呢?既然是相对背景,那直接减去背景不就行了?背景是什么?背景就是亮度变化比较缓慢的、大尺度的区域。和画面尺度有关,图像处理中有个很好用的工具叫「小波变换」,可以把一张图片在不同的尺度上进行分解。大尺度的成分对应画面的大块面的明暗,小尺度的成分对应画面的细节。我们可以把最大尺度上的分解成分作为近似的背景,减掉它,然后根据相对的亮度判断是否是一个星点。

 

 

不妨假设画面中的噪声是独立同分布的(事实上这一点是几乎成立的,在暗环境下占主导地位的随机噪声和固定噪声,都近似满足这一条件),那么根据统计学知识,n 张画面叠加后,信噪比变为原来的倍。

 

 

可以看到这次的划分结果就好多了,这次筛选出来的区域,都是一些画面细节的部分,比如星点、比如山峰边缘等,并且不会受到画面整体亮度的影响。

这种方法对星点的判断更加稳定可靠,在后续的程序处理中,只要再加上一点简单的判断,就可以把真正的星点给选出来了。比如判断筛选出来的区域面积大小,星点都是比较小的,太大的区域排除;比如判断筛选出来的区域长宽比,星点一般接近圆形,长宽比太大的区域排除掉。

 

3

匹配星点

 

提取了星点之后,就需要匹配星点,也就是判断多张照片中的哪几个星点实际上是同一颗星。人类要完成这个任务并不困难,比如我一眼看到了画面里有北斗七星大勺子,那么我可以轻易地在前后画面中把大勺子的七颗星分别标记出来对应好。

 

 

但是这个过程怎么让计算机自动地做呢?我注意到人在识别星点的时候,会去识别某种「模式」,一般来说是星点与它周围星点组成的形状特征,比如北斗七星的「大勺子」。通过星点与其「邻居」之间的连线关系,匹配星点构成的图形模式,进而对星点进行确认。

受此启发,我设计了利用图形模式进行匹配的算法。具体来说,针对每一颗星点,挑选出最近的 k个邻居,每一个邻居都可以用两个参量来描述其相对于主星点的关系:角度θ和距离 r,其中角度从最亮的那个邻居开始逆时针度量。选择以最亮的邻居为参考点开始计算角度,是为了避免画面旋转带来的不确定性。由于星点都可以看做分布于一个半径无限大的球面上,因此这里的角度和距离都是用球面三角来表示,参见下图。

 

 

对每一个星点,其 k个邻居总共有 2k个参量,这 2k个参量共同描述了这个星点与周围邻居之间的几何关系。从前面的构造过程可以看出,这种描述是旋转平移不变的。一堆星点,无论经过怎样的平移旋转,这种局部的几何关系是保持不变的。为方便起见,这里把每一个星点对应的这2k个参量叫做这个星点的「特征」。画在图上,角度作为横坐标,距离作为纵坐标,就表现为一系列高低起伏的「谱线」,就像光谱一样,这个特征图,可以算做这颗星点的「特征谱」。

 

 

如果两张图中某两个星点实际上对应同一颗星,那么这两个星点与周围邻居的几何关系是相似的,他们各自的「特征谱」应该是很接近的。至于衡量两个「特征谱」之间的相似程度,在数学上有很多方便简单的方法,这里就不深入介绍了。



上图是对前后两张图匹配星点的结果,画出了前后图片中同一颗星点的相对位移。为了显示清楚,这里把匹配星点的位移放大了 10 倍画出来。


4

射影变换


由于地球自转,星空也会有东升西落的运动。直观想象,前后几张照片中,似乎通过平移和旋转,就能将星空完全重叠,然而果真如此吗?对星空熟悉的人一定会说不是。比如通过长时间曝光得到的星轨我们可以看出星星在画面里移动的轨迹,可以看到一般情况下这些轨迹并不是同心圆(事实上是一系列的圆锥曲线),这有力地说明了前后几张图片之间,并不是平移加旋转的变换关系。经过数学分析我们知道,这个变换是射影变换(Projective Transformation)。




如果直接按照旋转加平移的方式进行对齐,在镜头视角小的情况下误差较小,对于广角镜头误差就大了(实际上对于拍摄深空天体的情况,由于视角非常小,通常用于处理深空拍摄的软件都是直接用旋转加平移的方法进行对齐的,比如著名的深空拍摄处理软件DeepSkyStacker)。镜头越广,误差就越大。很多人会误认为这是镜头畸变造成的,这是完全误解了。



上图是一个例子,来自我的朋友苍老湿,可以看到,在画面中心部分,星点非常细腻,到画面边缘可以明显看到星点拖成了条状,这就是进行了旋转平移,而没有采用真正的射影变换造成的。如果按照射影变换对图片进行对齐,就不会出现广角镜头边缘无法完全对齐的情况。

假设第一张画面中某星点的坐标是 (x,y),第二张画面中对应星点的坐标是 (x′,y′),那么这两个坐标之间满足以下关系,

或者用齐次坐标写成矩阵形式,

这就是射影变换的数学表达,其中各个 m 就是需要计算的射影变换的参数。利用上面提到的技术识别出星点并匹配成功之后,就可以利用这些星点的位置关系来计算两张图片之间的射影变换参数了。对射影变换来说,一般取 4 个对应点就可以计算参数了。一般是通过随机选取 4 个点计算出一个初始参数,然后再将所有匹配的星点坐标放进来对参数进行优化,以便得到相对整个画面来说最优的变换参数。具体的计算过程可以参见《Multiple View Geometry in Computer Vision》一书的第四章《Estimation – 2D Projective Transformations》



5

总结


1.      星野摄影图片,对于地面部分,按照通常的方法使用 Photoshop 进行叠加,一般而言软件会根据地景的特征进行自动匹配对齐。这种自动对齐的功能却难以适用于星空部分。

2.      对星空部分,采用小波变换的方法,提取画面中的星点。

3.      利用星点与周围邻居星点之间的几何关系,构造属于一个星点的「特征」,不随平移旋转而改变,可以用于匹配不同画面中的星点。

4.      根据星点匹配的结果,计算画面之间射影变换的参数,据此对画面进行变换对齐。

5.      综合以上步骤,就可以利用计算机程序,自动将星野摄影图片按照星空进行对齐叠加了。再加上使用 Photoshop 自动对齐的地景部分,就可以得到一张天空和地景都得到降噪的高画质图片了。



责任编辑:冯中

牧夫新媒体编辑部



『天文湿刻』 牧夫出品

微信号:astronomycn

垃圾回收从火箭开始

via Google



◢ 打赏是美德 ◣

支付宝账号:[email protected]

打完赏记得加牧夫君好友:aimufu



谢谢阅读