你的位置:首页 > 操作系统

[操作系统]一步一步自己做滤镜(一)色彩基础知识


提前声明一下,我的目标是要实现自己编写滤镜函数,不是使用开源滤镜或者系统滤镜,我觉得那些滤镜虽然好,但是无法实现定制,如果你的软件想要集成自己的滤镜功能的话光是使用系统滤镜或者第三方的滤镜模块就很没有特色了,无法从国内众多的滤镜软件中脱颖而出,还不如不加这个功能,因为反正也没别人做的好。

 

要做滤镜,那么就要首先从色彩的基础知识开始学起,万丈高楼平地起,否则无法写出合适的函数。

 

1.首先是色彩的加色和减色理论

首先人们将 红(R)、绿(G)、蓝(B) 定义为发光色彩的三原色,人肉眼可见的颜色都可以通过这三种颜色表示,这就是电子设备常用的RGB颜色表示法,这个理论可以在PS工具里面进行演示,只需要定义三个图层,图层颜色RGB值分别设置为 红(255,0,0)、绿(0,255,0)、蓝(0,0,255),然后将三种颜色图层进行部分叠加,然后将三个图层的图层混合模式设置为“滤色”,叠加效果如下即可:

 

从图上可以看出颜色叠加的部分分别为 黄、青、品红,而通过PS自带的取色工具可以测量得出这三个叠加颜色值分别为 黄(255,255,0)、青(0,255,255)、品红(255,0,255),请看他们的值可以看出颜色的叠加在RGB的表示法里面只是简单的相应位置的数值叠加。

因此我们有一个公式如下:

 

红(R 255,0,0)+绿(G 0,255,0)=黄(Y 255,255,0)

绿(G 0,255,0)+蓝(B 0,0,255)=青(C 0,255,255)

蓝(B 0,0,255)+红(R 255,0,0)=品红(M 255,0,255)

 

上面这个公式被称为加色法。。

通过以上理论可以得出,颜色叠加都是可以通过数学表达式进行计算的。

因为白色的RGB为(255,255,255),根据上面的得出的颜色数值叠加原理,可以得到如下公式:

 

红(R 255,0,0)+青(C 0,255,255)=白(255,255,255)

绿(G 0,255,0)+品红(M 255,0,255)=白(255,255,255)

蓝(B 0,0,255)+黄(Y 255,255,0)=白(255,255,255)

 

因此形成了补色理论

 

红 补色为 青

绿 补色为 品红

蓝 补色为黄

 

说到这里需要引入两个概念,叫做 自发光色反射光色。顾名思义,自发光色就是能够自己发光的物体的颜色,例如LED灯光发出的各种光颜色。反射光色就是通过反射发光物体的光来让我们看见的颜色,例如一副油画让我们看到的颜色。 

颜色理论将 红、绿、蓝 设置为自发光的三原色。青、品红、黄 设置为反射光三原色。我们上面讲的加色法的体系就是基于红绿蓝的自发光三原色体系来讲的。

下面这张图可以说明反射光的颜色叠合理论

 

在反射光体系中以下公式是成立的

品红(C 255,0,255)+黄(Y 255,255,0)=红(R 255,0,0)

黄(Y 255,255,0)+青(C 0,255,255)=绿(G 0,255,0)

青(C 0,255,255)+品红(C 255,0,255)=蓝(B 0,0,255) 

 青()+品红+黄=黑(0,0,0)

上面的理论被称之为减色法

 

 

 

 

 

 

 

如何得到非彩色图像?

 R=G=B 的时候图像就是灰度图像,也就是非彩色图像。反推得到,如果需要将一个图片处理成黑白图像,只需要将图像中的每个像素点的 R、G、B 同时设置为(R+G+B)/3,这个图像就会转换为一个黑白图像。

 

2.RGB 和 CMYK 颜色体系

RGB颜色主要用于显示器、霓虹灯等颜色设备上,称之为自发光色系,也就是说应用这种颜色体系理论的只能是自己发光的物体的颜色叠加。

CMYK颜色分别代表 C(青)、M(品红 或者 洋红)、Y(黄)、K(黑),主要用于印刷业和绘画等场景,因此成为反光色系,也就是说应用这种颜色体系理论的只能是通过反光才能看到的物体颜色叠加。

这两种颜色体系有哪些区别和联系呢?

我们在上面提到的颜色 加色 和 减色 理论中也出现了  C(青)、M(品红)、Y(黄) 这几个颜色。对了,那就是说明 RGB的颜色体系 是可以跟CMYK体系进行相互转换的。我们还在上面看到 RGB表示法中,三原色同时叠加之后显示为中间的色块为白色,这是RGB的特性,但是在CMYK颜色体系中 CMY颜色叠加之后显示为黑色,这就是CMYK颜色表示法的特性。不会自发光的颜色叠加之后显示为黑色,自发光的颜色叠加之后显示为白色。

 

3.RGB 和 HSL颜色体系

是另外一种颜色表示法,色相(H)、饱和度(S)、明度(L),每个通道的取值范围仍然是 0-255,这一点跟RGB非常相似,但是相同的颜色在HSL表示法和RGB表示法的取值差别很大。

 

下一篇将讲述如何实现PS中的一些操作的模拟函数。

 

以上是本人根据资料总结得到的非专业言论,请专业人士指正,勿喷。