7

利用简单的线性代数实现精确可控的窄带调色

 2 years ago
source link: https://grapeot.me/sho-tune.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

利用简单的线性代数实现精确可控的窄带调色

Fri 02 September 2022 , by grapeot | 0 Comments astrophotography

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

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

Final result

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

H

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

S
O

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

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

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

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

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

Intermediate result

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

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

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

RGBT=R⋅HSOTRGBT=R⋅HSOT

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

⎡⎣⎢RGB⎤⎦⎥=⎡⎣⎢HRHGHBSRSGSBOROGOB⎤⎦⎥⋅⎡⎣⎢HSO⎤⎦⎥[RGB]=[HRSRORHGSGOGHBSBOB]⋅[HSO]

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

Comments


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK