主页 > 编织

2400万像素摇身一变9600万,堆栈拍摄方法解读

时间:2019-06-25 来源:熊猫流量小王子

提高像素密度是未来传感器发展的一个重要方向,不过现在走在最前面的索尼其实一直是把重心放到了速度上,密度可能还要很长时间才能实现再次突破,这意味着单纯靠传感器硬件来捕捉高像素图像就成了看天吃饭,那么有没有技术可以曲线救国呢?答案就是多帧堆栈。

我们知道多帧堆栈的图像算法大方向之一是代数求和取均值而降噪,但事实上哈苏、奥林巴斯、索尼、宾得也早就给了我们另一个方向的启示——像素偏移,它的原理我以前也讲过,就是通过位移像素来实现采样率的提升,从而实现解析力的增强,而K1-M2又进一步向大家展示了这个方法的进化型:手持多帧,利用手持时的自然抖动来实现采样率的提升。

这个方法有一定的随机性(因为手抖是随机的),但并非不可复制,比如下图就是手持拍摄20张手动后期堆栈后,与单张的等比100%放大对比:

2400万像素摇身一变9600万,堆栈拍摄方法解读

2400万像素摇身一变9600万,堆栈拍摄方法解读

左侧为单张原图,右侧为堆栈高分辨率,可以看到空间分辨率与锐度明显提升,而且摩尔纹与伪色大大降低。那么这张照片是如何拍摄和后期的呢?

最重要的就是手持相机(不需要上脚架,但手要端稳),快门速度最好是1/两倍焦距,比如50mm镜头就是1/100秒,尽量低的ISO,光圈不建议太大F5.6以下最好,锁定对焦和测光,连拍RAW至少20张,得到一个原始文件序列。

2400万像素摇身一变9600万,堆栈拍摄方法解读

接下来在PS里打开所有文件并导入堆栈,这时候要注意不要自动对齐。这个步骤会比较吃处理器单核性能和内存容量,我的测试机是64GB内存,2400万像素图像的20张堆栈。

2400万像素摇身一变9600万,堆栈拍摄方法解读

堆栈完成后强行放大照片尺寸,比例为200%(也就是9600万像素),此时要点选重新采样模式为邻边(硬边缘)以防止过锐化。

2400万像素摇身一变9600万,堆栈拍摄方法解读

这时候全选所有图层,选择编辑、自动对齐,然后选择自动模式并取消勾选镜头校正功能,完成后点OK。对齐完成后仔细检查是否对齐,如果出现问题,一张张的隐藏来看问题出在哪里,情况严重的话就删掉有明显问题的图像图层。

接下来就是一层层调整透明度,以20张为例最顶层就是1/20,也即5%,从底层到顶层可以分别是100%(1/1), 50%(1/2), 33%(1/3), 25%(1/4), 20%(1/5)……5%(1/20),完成后拼合所有图层。这个调整虽然繁琐,但比起通过智能对象堆栈来计算均值还是要快很多,建议堆栈张数比较少的时候用这个简单粗暴的方法。最后可以用数量300%、半径2像素的智能锐化来压榨一下细节,但这样也可能会导致锐化过冲,因此需要具体问题具体分析。

那么问题来了,这种堆栈方式的实现原理是什么?简化的观念是每一帧的每一像素都有不同的采样,通过堆栈的方式实现高分辨率下更低的边缘锯齿,把图像等比放大到像素级对比单张效果就非常明显了:

2400万像素摇身一变9600万,堆栈拍摄方法解读

2400万像素摇身一变9600万,堆栈拍摄方法解读

2400万像素摇身一变9600万,堆栈拍摄方法解读

很明显,多帧堆栈后的9600万像素图像在等比放大的情况下锯齿要少非常多,可以直观地看出采样率提升对解析力的增益效果,对于高放大倍率的细节识别很有帮助(可参考下面的对比GIF图)。其实这个技术跟NVIDIA用在Maxwell GPU上的MFAA在原理上很类似,都是时域空域结合计算,应对静态拍摄主题是很好用的技术,合理利用的情况下对数毛感受的提升会非常明显。

2400万像素摇身一变9600万,堆栈拍摄方法解读

但它的缺点也很直观——随着堆栈张数的增加,对内存和存储容量要求会很高,9600万像素的20张图像对齐在Core i7 8700K处理器和64GB DDR4-2666的组合下也需要超过5分钟,而且暂存盘需要经20GB的空间(C盘空间不富裕的记得改一下位置)。对拍摄机身的缓存要求也比较高,如果缓存写满但未达所需张数下限,手抖的影响会变得更不可控,最终出片锐度可能会明显降低,除此之外对动态物体也是无能为力的。当然,最大的问题是你拍完后并不知道最终能不能达到想要的效果,很可能回到电脑上操作了很久才发现无法很好的对齐或者设置出现了问题……所以这是一个相对而言更偏理论的方法,实用成功率因人而异。

不过,机智如你应该能看出来,这也就是手持式像素偏移的手动处理方式了,从技术上来看并不算是什么新鲜事儿,早在15年前就有了类似的基本概念出现,甚至可以说是多帧移位图像堆栈处理最基本的应用,在机器视觉、环境监控等领域,它还能提供还原模糊画面的功能:

2400万像素摇身一变9600万,堆栈拍摄方法解读

在摄像机拍摄到的抖动画面中随机取3帧(上行),可以看到画面非常模糊,细节呈现并不出色,而下行a为单帧锐化;b为视频数字防抖;c为数字超采样;d就是我们前面教程用到的拍摄方法,也就是很成熟MFSR(Multi-Frame Super Resolution)方案,但它应对画面锯齿很OK,对动态模糊确实无可奈何;而e则是在此基础上,优化了动态模糊的算术核,进而得到了几乎完美的动态画面还原。

本文设计的具体算法细节有点复杂(尤其是针对动态模糊的部分),比之前所写的要更深一些,而且还有针对单张的计算方案,也可以用神经网络学习的方式来进行优化,有兴趣的话就有空再聊。中秋节带熊孩子出去玩就不更新了,但这次出行要带上索尼RX100 M6,这算是第一次旅行不带更大画幅的单反/微单,回来再写写感受吧,希望不要被坑……