原创:照片滤镜的破解
个人日记
PS的大多数命令的算法都已攻破,照片滤镜是少数未攻破的算法之一,她的设置以及意图是那么的简单明了,通过滤镜设置色改变白平衡达到调整底色的目的。因为与颜色相关,这个命令属于三通道共同调整型。我先大致讲讲PS调整命令的分类。
一,点对点型:针对于某一个像素点,和周围的像素值无关。
1,单通道调整型:调整某个通道的色阶值,与其他通的色阶值大小无关。也就是说结果值大小由设置值决定,与其他两通道的值无关。曲线,色阶,亮度对比度,色彩平衡等都属于单通道调整。单通道调整是改变本通道色阶值。
2,多通道调整型:调整某通道或者全部通道,本通道的调整与其他通道值有关。如通道混合器,色相饱和度,可选颜色,黑白命令等。这类调整属于颜色类调整。更分细一些,如通道混合器这类,和混合模式一样,属于颜色通道通过某种运算得出结果色。它们与颜色通道(rgb,cmyk等)相关,而色相饱和度,黑白,可选颜色则是与相对大小通道(max,mid,min)相关。
二,与周围像素有关:如模糊锐化等,通过一个小卷积窗口定义内的系数值改变中心像素值。或者如色调均化或颜色匹配这类通过改变直方图达到调整像素值的目的。
照片滤镜属于第一类的第二小类,多通道调整型;但它和我们以前见过的这类命令似乎有很大的不同,我们先看看它的模拟曲线:
非常怪异的曲线,而且它不是线性的。这让我们不由得想起了伽玛,不错,造成这种怪异曲线的原因的确有伽玛影响,但其中最根本的原因是,照片滤镜不是基于RGB模型!
我这里先谈谈这里“基于RGB模型”的含义,若某个像素值在任意RGB空间里经过相同的某个命令的调整,结果值一样,则它是基于RGB模型的。如色相饱和度,无论你的颜色空间是ARGB,SRGB,甚至PRORGB,只要原始像素值和调整值是一样的,最终的结果值一定是一样的。
我们先用几张图来证明一下照片滤镜不属于RGB模型。如底层原始像素值为RGB(200,100,50),滤镜色(照片滤镜中的设置色)为(80,180,220),看看不同空间中的RGB结果值:
argb
SRGB:
PRORGB:
ARGB,SRGB,PRORGB,三者虽然参与运算的原始值都一样,滤镜色的值和调整值也一样,但结果值有很大的区别.其中proRGB与其他两者相差更大一些(这是因为它的色域最大)。
现在至少我们知道了照片滤镜是与色彩空间有关,更细致的说就是与原色和白场的定义坐标和定义的伽玛有关。 那么我们可以设置采用线性伽玛(gamma=1)一个颜色空间,再看看它的模拟曲线:
这下好多了,至少那些该死的曲线没有了,都是直线了。现在我们就选用伽玛为1的空间作为我们的研究空间。
我们还可以另外得出两个现象:
1,当底色或滤镜色其中之一为中性灰时,照片滤镜的结果和正片叠底相同
2,底色和滤镜色具备相互交换性,即把底色和滤镜色互换后,结果值不变
某种色为中性灰时与正片的结果一样,而可交换性也恰恰是正片叠底算法的一个特点,这个命令一定与正片叠底有很大的关系。但是当底色和滤镜色都为彩色时,和正片的结果又不一样了:
尽管两者很接近,但还是有一些差别。其根本原因是:“照片滤镜不是RGB下的正片叠底,而是XYZ下的正片叠底."
XYZ,一个虚拟三原色构成的与设备无关的颜色空间。虚拟的意思是它的三原色都不是光谱色,且位于可见光谱之外。关于XYZ的来源这里按下不表,你可以理解它是一个颜色表,计算机里的其他RGB,CMYK这些都是在这个颜色表里所定义的。从这个意义来说,XYZ和LAB一样,都属于更底层的颜色系统。而我们常用的RGB颜色模式这些,是基于这个系统之上的,所以它们被称为与设备相关的颜色模式。
我们的色彩空间里定义的是xy表,它是由XYZ转化而来的,我们先大概谈谈RGB转XYZ,xyY的方法(其实就是一个坐标转换):
首先把空间中的rgb进行伽玛转换(x^k=X)为RGB
Xr,Yr,Zr表示RGB(1,0,0)在XYZ系统中坐标
Xg,Yg,Zg表示RGB(0,1,0)在XYZ系统中的坐标
Xb,Yb,Zb表示RGB(0,0,1)在XYZ系统中的坐标
Xn,Yn=1,Zn表示RGB(1,1,1)(白场)在XYZ系统中的坐标
则任意RGB颜色在XYZ系统中的坐标为
X=Xr*R+Xg*G+Xb*B
Y=Yr*R+Yg*G+Yb*B
Z=Zr*R+Zg*G+Zb*B
因为x=X/(X+Y+Z)
y=Y/(X+Y+Z)
z=Z/(X+Y+Z)
所以xr=Xr/ar
yr=Yr/ar
zr=Zr/ar
其中ar=Xr+Yr+Zr
同理,xg=Xg/ag
yg=Yg/ag
zg=Zg/ag
ag=Xg+Yg+Zg
xb=Xb/ab
yb=Yb/ab
zb=Zb/ab
ab=Xb+Yb+Zb
代入,则X=ar*xr*R+ag*xg*G+ab*xb*B
Y=ar*yr*R+ag*yg*G+ab*yb*B
Z=ar*zr*R+ag*zg*G+ab*zb*B
我们把ar,ag,ab称为这个方程的系数
ar,ag,ab为RGB对应的(X+Y+Z),也是XYZ系统和xyY系统转换所必须的系数。
若我们知道RGB三原色分别所对应的亮度值,Yr,Yg,Yb
则ar=Yr/yr,ag=Yg/yg,ab=Yb/yb,可惜PS里没有直接给出来。它直接给出来的只有白点和RGB原色的x,y坐标,以及隐含条件:白色的亮度值Yn=1
在XYZ中定义的白色自然是R=G=B=1所对应的XYZ坐标
因为,X=x*Y/y,Z=z*Y/y=(1-x-y)*Y/y,而白色的Y=Yn=1,且白色定义为R=G=B=1
则:x/y=ar*xr+ag*xg+ab*xb
1=ar*yr+ag*yg+ab*yb
(1-x-y)/y=ar*zr+ag*zg+ab*zb
白点修正(归一化)
我们回过头来再看一下RGB白色的三个刺激值:
Xn=xn/yn Yn=1 Zn=(1-xn)
显然,Yn=1,但Xn、Zn却不一定为1,也就是说,RGB原色的刺激值并不对应于XYZ空间中的白色。根据相对比色的转换意图,需要将RGB白色(1,1,1)映射到XYZ空间中的白色(1,1,1)。这样事实上是相当于将RGB颜色对应的XYZ刺激值进行了归一化。
设RGB颜色修正前的三刺激值为(X,Y,Z)修正后的三刺激值为(X’,Y’,Z’),则:
X’=X/Xn Y’=Y/Yn Z’=Z/Zn
这样,经过修正后的 X’,Y’, Z’,当它们的值相同时,则颜色为灰色。
照片滤镜其实就是把底色和滤镜色的RGB值分别转换为XYZ值,然后再用正片叠底的方式混合。如同RGB中正片方式一样,AB/255,ab(归一化方式),在XYZ中也可以表示为如同Xa*Xb/Xn,或者 Xa’*Xb’(归一化)。
这样我们得出了正片后的XYZ结果值Xc=Xa*Xb/Xn,Yc=Ya*Yb/Yn,Zc=Za*Zb/Zn,然后再利用RGB转XYZ的逆方程得出RGB值,再经过伽玛逆运算后就可以得出照片滤镜的RGB结果值。
在通过PS里的原色和白场xy设置值定义XYZ方程系数(ar,ab,ag)有一个细节问题,即可能存在ps里的设置值不能准确定义方程系数的问题,这里附上我们讨论的一些细节,由雪拂心尘整理:
(1)RGB空间和原色的色度值在底层都是基于D50白场的转换值。当RGB空间的白场非D50时,这种转换将在底层自动进行,将其转换为基于D50白场的原色值。这种转换机制似乎不是PS的一种内部实现,而是一种业界规范,因为ICC配置文件中记录的就是基于D50的转换值。
(2)PS中进行RGB空间转换时,采用的RGB原色的色度值都是基于D50白场的转换值。与之对应,不论什么RGB空间白场的色度值是多少,都将统一替换为D50。D50的xyz色度值为(0.3457,0.3585,0.2958),XYZ刺激值为(0.96429,1,0.82510)。由于PS中各个RGB空间均统一采用D50白场,因此在不同RGB空间进行转换时,白点修正这一步骤事实上可以省略。
(3)如何获知RGB原色的D50转换值?如果RGB空间的白场为D50,则PS中自定RGB面板中的显示值就是真正的原色值;如果RGB空间的白场非D50,则需要用专门的ICC配置文件查看软件(如ICC Profile Inspector)查看。
可能这些看起来有些头大,下面来点轻松的,我们想在PS里模拟照片滤镜的实现,首先我们要定义一个"模拟的XYZ空间”,其定义原理就是我们要把RGB坐标与XYZ坐标重合,R与X重合,G与Y重合,B与Z重合,以R为例,R原色xy坐标自然就是x=X/X+0+0=1,y=0/X+0+0=0....由于上面细节所述,原色色度值是基于D50的转换值,所以白场坐标我们就设置为D50,伽玛我们设置为1
由于PS规定y的最小值只能设置为0.0001,不能为0,不过不管怎样,这个设置很接近于XYZ了,它的色域很大,甚至超过了PRORGB。我们把这个模拟的XYZ空间作为我们的工作空间。
在这个空间里,照片滤镜是完全等同于正片叠底的:
我们还可以加入“浓度”的改变,浓度的算法其实就和不透明度的算法一样:
我们把两者做差值比较一下,可以看出,非常非常接近,只是有一些计算的误差:
在任意RGB空间呢,我们也可以通过转换配置文件的方式来尽量的模拟这种照片滤镜的效果,比如,这张图是在argb下的照片滤镜:
我们可以设置一个和滤镜色一样的正片叠底来模拟,当然,在argb下,差距是很大的:
由于照片滤镜是对底色和滤镜色分别转换为XYZ再正片,所以现在我们不合并图层直接“转换配置文件”:
由于照片滤镜是由正片后的XYZ再转为RGB,所以我们要先合层,在转化配置文件为argb:
这种误差就比刚才直接在模拟XYZ空间中大得多了。有十几个色阶的误差.我也不想去细究这个问题了。
至此,照片滤镜完美破解, 当然还有个地球人都知道的关于勾选“保留明度”的含义我没说,不想为这个花笔墨了。
文章评论