窄带摄影里有很多流行的调色方法，比如HOO，SHO。但拍多了不免腻歪，到处都是黄蓝哈勃色。同时很多目标用传统方法很难调色，比如乌贼星云，用SHO就是大黄配大蓝，HOO就是大红配大蓝，极高的饱和度让美学处理很难办。虽然可以通过一定程度的后期来对色调和饱和度拉曲线，但后期毕竟是有限度的，没办法在各个调色盘直接自由变换。有没有可能我们可以自己指定一组符合美学的调色盘，而不是用RGB=SHO这种饱和度拉到顶的方法来调色呢？这篇文章主要就来介绍这样的一种方法。

下图是一个成品例子，对乌贼星云，我们从黑客帝国中获得灵感，用带有警惕感的红色来给O为主的乌贼调色，而把背景缭绕的Ha+S云气用海蓝色来表现，以此来体现一只机械乌贼在海中警戒执行任务的观感。同时这两种颜色都不是正红正蓝，而是带有一点粉色的弱化版本，不会显得太城乡结合部。

![Final result](https://yage.ai/images/sho-tune-final-result.jpg)

这个是如何实现的呢？很简单，我们先介绍怎么做，然后介绍里面的数学原理。整个过程分为两步。首先我们先在PS里面选择想要的颜色。比如对H，我们想用海蓝色来表现，就在拾色器里面调出来我们想要的蓝色：

![H](https://yage.ai/images/sho-tune-h.png)

记下来它的RGB值是18, 65, 186。类似的，我们选用粉蓝色（56, 128, 235）来给S上色，选用带一点紫色的红色（235, 56, 174）来给O上色。

![S](https://yage.ai/images/sho-tune-s.png)

![O](https://yage.ai/images/sho-tune-o.png)

那么，我们如果把这些RGB列成一个表的话，是这样的：

```
	R	G	B
H	18	65	186
S	56	128	235
O	235	56	174
```

第二步来了，下面我们竖着看这个表，然后把每一列的内容和HSO乘起来然后加起来，就可以直接得到PixelMath的公式了。比如我们看R这一列，HSO对应的三个数是18, 56, 235。那么R通道的公式就是`18*H+56*S+235*O`。 但此时有个问题，是这样算出来的结果会超出0和1的范围，所以需要做一个简单的归一化。也就是出来的结果还要除以这三个数的和，也就是R的公式是(18*H+56*S+235*O)/(18+56+235)。如果我们对G和B也做同样的处理，最终的公式是：

* R: `(18*H+56*S+235*O)/(18+56+235)`
* G: `(65*H+128*S+56*O)/(65+128+56)`
* B: `(186*H+235*S+174*O)/(186+235+174)`

把它输入到PixelMath里面，出来的图像是这样的：

![Intermediate result](https://yage.ai/images/sho-tune-result.png)

可以看到红色基本上就是我们挑选的颜色。为什么背景和挑选的颜色不一样，主要是因为背景同时有H有S，两种蓝色一混合就变成了这种青色。不过没关系，我们在CurveTransform里面稍微拉一下色调，饱和和明度，就可以得到上面的成图了。

拓展出去，其实[RGB图](/resolution-limit-of-135-system.html)也完全可以这么玩，只要当做伪色调色就好。甚至多于3个通道的调色也可以套用同样的方式解决。只要把这个表拓展到4行5行就好。总之这种方法通过简单的数学（不超过加减乘除），提供了一种系统性，可拓展，可控制的调色方法。

如果感兴趣的话可以继续看一下原理。我们现在面临的问题是线性代数里面比较典型的线性空间投影问题。我们有三组正交基H, S和O，张成了一个线性空间。这个空间里面的任何一个向量(H, S, O)都有自己的坐标，这个坐标的三个值就是HSO三个通道在这个像素的亮度。然后现在的问题是，如果我们想要把这个线性空间投影到另一组基上，应该怎么算出来(H, S, O)这个点在新空间下的坐标(R, G, B)。一般情况下，这组新的基向量应当是正交的，也就是SHO调色，HOO调色等情况。但在我们的例子里，我们放宽了这个条件，让颜色可以不正交，但还是用同样的方法来投影。所谓投影，根据线性代数，其实就是用一个变换矩阵去和待变换的向量(H, S, O)去做矩阵乘法，然后这个变换矩阵也很简单，就是把三个新的基罗列成一个矩阵就好。那么问题就很简单了，一个公式就可以表达：

$$ \text{RGB}^T = R \cdot \text{HSO}^T $$

R是变换矩阵。或者如果我们把这个矩阵展开，就是：

$$ \begin{bmatrix} R \\ G \\ B \end{bmatrix} = \begin{bmatrix} H_R & S_R & O_R \\ H_G & S_G & O_G \\ H_B & S_B & O_B \end{bmatrix} \cdot \begin{bmatrix}H \\ S \\ O\end{bmatrix} $$

也就是我们上面列的那个表格。这里只是转置了一下，第一列是H对应的RGB值，而不是第一行。以此类推。所以用简单的线性代数，我们就可以定量精确地控制SHO的出图，甚至因为这里不要求R是正交矩阵，可以提供多于三通道的投影。

<script async data-uid="49b08a3e73" src="https://yage-ai.kit.com/49b08a3e73/index.js"></script>
