在某些特定的情况下，可以通过后期的方式来提升数码分辨率，把光学系统的光学分辨率榨取出来。这种提高分辨率的方法叫drizzle，在[天文摄影](/astrophoto-tutorial-1.html)和医学图像处理中被广泛使用。

懒人版摘要：

* drizzle要生效的基本要素有：镜头给力传感器不行+抖动
* 考虑到现代彩色相机的bayer matrix，drizzle有对应的彩色版本叫drizzle debayer。它的基本思路一致，可以提升色彩准确度和有效分辨率。
* 相关的工具有photoshop，deepskystacker

详细分析和算法介绍：

drizzle要生效的基本要素有：

* 首先这个光学系统应当是欠采样而不是过采样的。也就是说艾里斑的大小需要小于像素的大小（准确的说应当小于2倍像素的大小，这牵涉到奈奎斯特采样定律。搜索关键字是光学分辨率和传感器分辨率的匹配）。在这种情况下，前面光学系统给了足够的信息给传感器，只是传感器不够给力没办法精确记录这些信息。这个可以类比于解一个方程组，你有1000个方程，但只有200个未知数。此时就可以人为增加未知数的数目，把一个大像素切成4个小像素。但如果光学分辨率不够的话（俗话就是镜头喂不饱传感器），这时候需要的操作是[反卷积](/deconv-exp.html)。反卷积是个under-constrained线性问题，也就是你有900个方程但有1000个未知数。这种情况就不能再加更多的未知数了。
比较早的相关工作是NASA给哈勃望远镜做的，这主要是因为地面望远镜系统的光学分辨率限制在口径大到一定程度以后就不再是艾里斑，而是大气抖动。哈勃望远镜因为没有大气扰动问题，所以光学分辨率远超地面的望远镜，一不小心就欠采样了，非常适合做drizzle。
* 然后这个光学系统需要有一定的"抖动"。比如下面是一个典型的欠采样的例子。我们有一个圆形的物体的像落到了左边的像素网格中。这四个像素都感光了，所以出来的是一个方形的东西——欠采样的一个典型特征就是应该是圆形的小光点（比如天文摄影中的星点）看上去是方的。假设背景是黑的，因为右侧的两个像素曝光不足，所以颜色偏深。

![Single shot.](https://yage.ai/images/drizzle-1.png)

如果我们不作任何改变，就这么一直拍下去，我们得到的信息就一直是一个这样的方块。单从这个信息里面我们没办法反推原来的物体到底是什么形状。但如果我们还是用这么大的像素，但是从不同的x坐标去对同一个物体成像，就会有一些有意思的观察：

![Multiple shots.](https://yage.ai/images/drizzle-2.png)

比如，这时候我们就会咦像素的亮度随着传感器位置的移动而改变。因为传感器可以每次只移半个像素，所以我们有了更精细的空间信息可以反推。大概的说，我们把每个像素在x轴方向上切一刀，设这个新像素的亮度为未知数，然后就可以计算得到大像素在每个x轴坐标下的亮度。把这个亮度和观测值比较，最小化它们之间的误差就好。我没有做具体计算，但直觉是在欧式距离的误差量度下，这个优化问题的极值就是把空间校准之后的像素值取平均。当然同样的操作也可以在y轴上面做，甚至在不同的角度下面做，可以得到更精细的空间信息。

一些例子：

![An example.](https://yage.ai/images/drizzle-3.jpg)

左侧是drizzle后的，右侧是drizzle前，[图片来源](https://www.cloudynights.com/topic/580765-no-data-for-almost-4-weeks-so-decided-to-drizzle/).

可以明显看到原来是马赛克一样的星点变圆了。

从数学或者机器视觉的角度来说，这种用低分辨率的传感器来得到高分辨率图像的领域叫做compressed sensing。在医学里的应用主要是CT，用最少的X光剂量，比较便宜的相机来得到分辨率尚可的三维重建图像。在可见光的计算摄影学上面也有应用，比如一个极端的例子是可以用单像素的传感器拍出照片来。比如大米大学（狗头保命）有[相关研究](https://web.archive.org/web/20100605170550/http:/dsp.rice.edu/cscamera)，就用一个光电二级管通过随机生成的异形光圈拍1600次照，就能拿到一个16000像素的照片：

![An example.](https://yage.ai/images/drizzle-4.png)

图片来自[https://web.archive.org/web/20100605170550/http://dsp.rice.edu/cscamera](https://web.archive.org/web/20100605170550/http://dsp.rice.edu/cscamera)

但很多时候drizzle也是没有办法的办法，一般是光学分辨率和数码分辨率不匹配所致。需要花大量的时间去拍摄多张照片，还要算，很麻烦。最理想的两个分辨率直接匹配。我这里举个例子什么叫分辨率匹配。比如根据瑞利判据，一个200mm口径，f/10的diffraction limited的光学系统的角分辨率是 `1.22*550*0.001*0.001/200 = 3.36e-6` 弧度 (0.69角秒)。这个光学系统的焦距可以算出来是`200mm*10=2000mm`，所以对无穷远处来的光，焦平面处这么大的张角对应的距离是 `3.36e-6*2000=0.0067`, 也就是6.7微米。考虑到奈奎斯特采样定律，这个角分辨率用 6.7/2=3.35 微米大小的像素来采样能得到全部信息。如果像素比这个大小大，那就是欠采样，drizzle会带来帮助，否则就是过采样。注意以上计算并未考虑大气扰动。

对于我们日常的摄影，因为会有大光圈+各种相差，所以系统不是diffraction limited的。这种情况可以用厂商标注的线分辨率来计算。我的gut feeling是，以目前飞思哈苏的传感器技术，镜头分辨率和成像圈大小，数码分辨率应该远超光学分辨率，做drizzle的意义不大。不过有相关机器的土豪们不妨做做实验，也测量一下镜头分辨率，做做计算，看看我们上面的理论有没有可以改进的地方。
