精华内容
下载资源
问答
  • 2020-02-24 18:08:14

    RGB模式

    RGB是色光的色彩模式。R代表红色,G代表绿色,B代表蓝色,三种色彩叠加形成了其它的色彩。因为三种颜色都有256个亮度水平级,所以三种色彩叠加就形成1670万种颜色了。也就是真彩色,通过它们足以在现绚丽的世界。在RGB模式中,由红、绿、蓝相叠加可以产生其它颜色,因此该模式也叫加色模式。所有显示器、投影设备以及电视机等等许多设备都依赖于这种加色模式来实现的。就编辑图象而言,RGB色彩模式也是最佳的色彩模式,因为它可以提供全屏幕的24bit的色彩范围,即真彩色显示。但是,如果将RGB模式用于打印就不是最佳的了,因为RGB模式所提供的有些色彩已经超出了打印的范围之外,因此在打印一幅真彩色的图象时,就必然会损失一部分亮度,并且比较鲜艳的色彩肯定会失真的。。这主要因为打印所用的是CMYK模式,而CMYK模式所定义的色彩要比RGB模式定义的色彩少很多,因此打印时,系统自动将RGB模式转换为CMYK模式,这样就难免损失一部分颜色,出现打印后失真的现象。

    CMYK模式

    当阳光照射到一个物体上时,这个物体将吸收一部分光线,并将剩下的光线进行反射,反射的光线就是我们所看见的物体颜色。这是一种减色色彩模式,同时也是与RGB模式的根本不同之处。不但我们看物体的颜色时用到了这种减色模式,而且在纸上印刷时应用的也是这种减色模式。按照这种减色模式,就衍变出了适合印刷的CMYK色彩模式。CMYK代表印刷上用的四种颜色,C代表青色,M代表洋红色,Y代表黄色,K代表黑色。因为在实际引用中,青色、洋红色和黄色很难叠加形成真正的黑色,最多不过是褐色而已。因此才引入了K——黑色。黑色的作用是强化暗调,加深暗部色彩。CMYK模式是最佳的打印模式,RGB模式尽管色彩多,但不能完全打印出来。那么是不是在编辑的时候就采用CMYK模式呢?不是,原因如下:用CMYK模式编辑虽然能够避免色彩的损失,但运算速度很慢。主要因为:1、即使在CMYK模式下工作,Photoshop也必须将CMYK模式转变为显示器所使用的RGB模式。2、对于同样的图象,RGB模式只需要处理三个通道即可,而CMYK模式则需要处理四个 馈?/p>由于用户所使用的扫描仪和显示器都是RGB设备,所以无论什么时候使用CMYK模式工作都有把RGB模式转换为CMYK模式这样一个过程。因此,是否应用CMYK模式进行编辑都成在RGB模式和CMYK模式转换的问题。这里给个建议,也算是我的一点经验吧。先用RGB模式进行编辑工作,再用CMYK模式进行打印工作,在打印前才进行转换,然后加入必要的色彩校正,锐化和休整。这样虽然使Photoshop在CMYK模式下速度慢一些,但可节省大部分编辑时间。为了快速预览CMYK模式下图象的显示效果,而不转换模式可以使用View菜单下的CMYK Preview(CMYK 预览)命令。这种打印前的模式转换,并不是避免图象损失最佳的途径,最佳方法是将Lab模式和CMYK模式相结合使用,这样可以最大程度的减少图象失真。

     LAB模式

    Lab模式是有国际照明委员会(CIE)于1976年(哇,好遥远呀。)公布的一种色彩模式。你已经明白了:RGB模式是一种发光屏幕的加色模式,CMYK模式是一种颜色反光的印刷减色模式。那么,Lab有是什么处理模式呢?Lab模式既不依赖光线,也不依赖于颜料,它是CIE组织确定的一个理论上包括了人眼可以看见的所有色彩的色彩模式。Lab模式弥补了RGB和CMYK两种色彩模式的不足。Lab模式由三个通道组成,但不是R、G、B通道。它的一个通道是亮度,即L。另外两个是色彩通道,用A和B来表示。A通道包括的颜色是从深绿色(底亮度值)到灰色(中亮度值)再到亮粉红色(高亮度值);B通道则是从亮蓝色(底亮度值)到灰色(中亮度值)再到黄色(高亮度值)。因此,这种色彩混合后将产生明亮的色彩。Lab模式所定义的色彩最多,且与光线及设备无关并且处理速度与RGB模式同样快,比CMYK模式快很多。因此,可以放心大胆的在图象编辑中使用Lab模式。而且,Lab模式在转换成CMYK模式时色彩没有丢失或被替换。因此,最佳避免色彩损失的方法是:应用Lab模式编辑图象,再转换为CMYK模式打印输出。当你将RGB模式转换成CMYK模式时,Photoshop将自动将RGB模式转换为Lab模式,再转换为CMYK模式。在表达色彩范围上,处于第一位的是Lab模式,第二位的是RGB模式,第三位是CMYK模式。

    HSB模式

    在介绍完三种主要的色彩模式后,现在介绍另一种色彩模式——HSB色彩模式,它在色彩汲取窗口中才会出现。在HSB模式中,H表示色相,S表示饱和度,B表示亮度。色相:是纯色,即组成可见光谱的单色。红色在0度,绿色在120度,蓝色在240度。它基本上是RGB模式全色度的饼状图。饱和度:表示色彩的纯度,为0时为会色。白、黑和其他灰色色彩都没有饱和度的。在最大饱和度时,每一色相具有最纯的色光。亮度:是色彩的明亮读。为0时即为黑色。最大亮度是色彩最鲜明的状态专色通道专色通道,可以保存专色信息的通道——即可以作为一个专色版应用到图像和印刷当中,这是它区别于Alpha通道的明显之处。同时,专色通道具有Alpha通道的一切特点:保存选区信息、透明度信息。每个专色通道只是一个以灰度图形式存储相应专色信息,与其在屏幕上的彩色显示无关。专色及其特点专色油墨是指一种预先混合好的特定彩色油墨(或叫特殊的预混油墨),用来替代或补充印刷色(CMYK)油墨,如明亮的橙色、绿色、荧光色、金属金银色油墨等,或者可以是烫金版、凹凸版等,还可以作为局部光油版等等,它不是靠CMYK四色混合出来的,每种专色在付印时要求专用的印版 (可以简单理解为一付专色胶片、印刷时为专色单独晒版),专色意味着准确的颜色。专色有以下几个特点:1.准确性。每一种专色都有其本身固定的色相,所以它解决了印刷中颜色传递准确性的问题;2.实地性。专色一般用实地色定义颜色,而无论这种颜色有多浅。当然,也可以给专色加网,以呈现专色的任意深浅色调;3.不透明性和透明性。蜡笔色(含有不透明的白色)、黑色阴影(含有黑色)和金属色是相对不透明的,纯色和漆色是相对透明的;4.表现色域宽。专色色域很宽,超过了 RGB、CMYK的表现色域,所以,大部分颜色是用CMYK四色印刷油墨无法呈现的。我们在使用专色和专色通道之前,要清楚专色图像是否需要镂空;专色油墨叠印在其它油墨上时,如何防止龟纹的出现;如果要把专色图像导入排版软件或矢量软件,又如何把专色图像文件保存为DCS 2.0 EPS文件等问题都需要清楚。

    更多相关内容
  • RGB、CMYK、CIE Lab等几常用颜色空间

    万次阅读 2018-11-28 22:15:55
    在大自然中有无穷多种不同的颜色,而人眼只能分辨有限不同的颜色,RGB模式可表示一千六百多万不同的颜色,在人眼看来它非常接近大自然的颜色,故又称为自然色彩模式。红绿蓝代表可见光谱中的三基本颜...

    RGB颜色空间

    • 基本概念

            RGB颜色空间以R(Red:红)、G(Green:绿)、B(Blue:蓝)三种基本色为基础,进行不同程度的叠加,产生丰富而广泛的颜色,所以俗称三基色模式。在大自然中有无穷多种不同的颜色,而人眼只能分辨有限种不同的颜色,RGB模式可表示一千六百多万种不同的颜色,在人眼看来它非常接近大自然的颜色,故又称为自然色彩模式。红绿蓝代表可见光谱中的三种基本颜色或称为三原色,每一种颜色按其亮度的不同分为256个等级。当色光三原色重叠时,由于不同的混色比例能产生各种中间色,例如,三原色相加可产生白色。所以RGB模式是加色过程。屏幕显示的基础是RGB模式,彩色印刷品却无法用RGB模式来产生各种彩色,所以,RGB模式常用于视频、多媒体与网页设计。

    • 空间模型

            对图像处理而言,RGB是最为重要和常见的颜色模型,它建立在笛卡尔坐标系中,以红、绿、蓝三种基本色为基础,进行不同程度的叠加,产生丰富而广泛的颜色,俗称三基色模式。如下图所示:

    •  基本原理

            RGB模型的原理来自于颜色的三刺激理论,它基于以下假设:在眼睛的中央部位有3种类型的对色彩敏感的锥状细胞。其中一类对位于可见光谱中间位置的光波敏感,这种光波经人的视觉系统转换产生绿色感。而其他两种锥状细胞对位于可见光波的上、下端即较长和较短的波长的光波敏感,它们分别被识别为红色和蓝色。从生理学的角度来看,由于眼睛仅包含3种不同类型的锥状细胞,因而对任意3种颜色适当混合均可产生白光视觉,条件是这3中颜色中任意两种的组合都并不能产生第3种颜色,则这三种颜色就被称为三原色

    • 表达方式

             RGB空间是目前最常用的彩色信息表达方式,使用红、绿、蓝三原色的亮度来定量表示颜色,是以RGB三色光互相叠加来实现混色的方式。三种颜色所占比例不同,得到的颜色就不同。变换混合的比例,就会得到各种各样的混合效果。RGB颜色空间可以看作是三维直角坐标系中的一个单位正方体。任何一种颜色在RGB颜色空间中都可以用三维空间中的一个点来表示。在RGB颜色空间,任意色光F都可以用RGB三种颜色不同分量的相加混合而成:

                                                                                             F=r[R]+g[G]+b[B]

    色度学规则:
      (1)通过R,G,B这三种颜色能产生任何颜色,并且这三种颜色混合后产生的颜色是唯一的。
      (2)如果两个颜色相等,这三个颜色分量再乘以或者除以相同的数,得到的颜色仍然相等。
      (3)混合色的亮度等于每种颜色亮度的和。

    • 优点与缺点

            优点: RGB颜色空间最大的优点就是直观,容易理解

            缺点:R,G,B这3个分量是高度相关的,即如果一个颜色的某一个分量发生了一定程度的改变,那么这个颜色很可能要发生改变;人眼对于常见的红绿蓝三色的敏感程度是不一样的,因此RGB颜色空间的均匀性非常差,且两种颜色之间的知觉差异色差不能表示为该颜色空间中两点间的距离,但是利用线性或非线性变换,则可以从RGB颜色空间推导出其他的颜色特征空间

    CMYK模式

    • 基本概念

           当阳光照射到一个物体上时,这个物体将吸收一部分光线,并将剩下的光线进行反射,反射的光线就是我们所看见的物体颜色。这是一种减色色彩模式,同时也是与RGB模式的根本不同之处。不但我们看物体的颜色时用到了这种减色模式,而且在纸上印刷时应用的也是这种减色模式。CMYK代表印刷上用的四种颜色,C代表青色(Cyan),M代表洋红色(Magenta),Y代表黄色(Yellow),K代表黑色(Black)。因为在实际应用中,青色、洋红色和黄色很难叠加形成真正的黑色,最多不过是褐色而已。因此才引入了K——黑色。黑色的作用是强化暗调,加深暗部色彩。

    • 打印模式

             CMYK模式俗称四色打印模式,是最佳的打印模式。但是在进行实际打印时,两种模式存在转换问题,具体原因如下:

             1.  CMYK模式编辑虽然能够避免色彩的损失,但运算速度很慢。主要原因如下:

                   1)、即使在CMYK模式下工作,Photoshop也必须将CMYK模式转变为显示器所使用的RGB模式。

                   2)、对于同样的图像,RGB模式只需要处理三个通道即可,而CMYK模式则需要处理四个。

             2.  用户所使用的扫描仪和显示器都是RGB设备,所以无论什么时候使用CMYK模式工作都有把RGB模式转换为CMYK模式这样一个过程。因此,是否应用CMYK模式进行编辑都存在RGB模式和CMYK模式转换的问题。

           对于RGB模式和CMYK模式转换的问题,可以先用RGB模式进行编辑工作,再用CMYK模式进行打印工作,在打印前才进行转换,然后加入必要的色彩校正锐化和修整。这样虽然使Photoshop在CMYK模式下速度慢一些,但可节省大部分编辑时间。这种打印前的模式转换,并不是避免图像损失最佳的途径,最佳方法是将Lab模式和CMYK模式相结合使用,这样可以最大程度的减少图像失真。

    • 优缺点

          优点:可以满足打印的需求,解决RGB不能打印的问题

          缺点:一定程度上存在色彩的缺失,运行速度慢

    Lab颜色模型

    • 基本概念

             Lab模式是根据Commission International Eclairage(CIE)在1931年所制定的一种测定颜色的国际标准建立的。于1976年被改进,并且命名的一种色彩模式。Lab颜色模型弥补了RGB和CMYK两种色彩模式的不足。它是一种设备无关的颜色模型,也是一种基于生理特征的颜色模型。  Lab颜色模型由三个要素组成,一个要素是亮度(L),a 和b是两个颜色通道。a包括的颜色是从深绿色(低亮度值)到灰色(中亮度值)再到亮粉红色(高亮度值);b是从亮蓝色(低亮度值)到灰色(中亮度值)再到黄色(高亮度值)。因此,这种颜色混合后将产生具有明亮效果的色彩。

    • 空间模型

           Lab模式既不依赖光线,也不依赖于颜料,它是CIE组织确定的一个理论上包括了人眼可以看见的所有色彩的色彩模式。Lab模式弥补了RGB和CMYK两种色彩模式的不足。同RGB颜色空间相比,Lab是一种不常用的色彩空间。它是一种设备无关的颜色系统,也是一种基于生理特征的颜色系统。这也就意味着,它是用数字化的方法来描述人的视觉感应。Lab颜色空间中的L分量用于表示像素的亮度,取值范围是[0,100],表示从纯黑到纯白;a表示从红色到绿色的范围,取值范围是[127,-128];b表示从黄色到蓝色的范围,取值范围是[127,-128]。下图所示为Lab颜色空间的图示:

    • 优缺点

             Lab颜色空间比计算机显示器甚至比人类视觉的色域都要大  ,表示为Lab的位图比RGB或CMYK位图获得同样的精度需要要求更多的像素数据。Lab模式所定义的色彩最多,且与光线及设备无关并且处理速度与RGB模式同样快,比CMYK模式快很多。因此,可以放心大胆的在图象编辑中使用Lab模 式。而且,Lab模式在转换成CMYK模式时色彩没有丢失或被替换。因此,最佳避免色彩损失的方法是:应用Lab模式编辑图象,再转换为CMYK模式打印 输出。

    CIE XYZ表色系统

    • 基本概念

             1931CIE-XYZ系统,就是在RGB系统的基础上,用数学方法,选用三个理想的原色来代替实际的三原色,从而将CIE-RGB系统中的光谱三刺激值和色度坐标r、g、b均变为正值。

    • 空间模型

           x色度坐标相当于红原色的比例,y色度坐标相当于绿原色的比例。马蹄形的光谱轨迹各波长的位置,如下图可以看到:光谱的红色波段集中在图的右下部,绿色波段集中在图的上部,蓝色波段集中在轨迹图的左下部。中心的白光点E的饱和度最低,光源轨迹线上饱和度最高。如果将光谱轨迹上表示不同色光波长点与色度图中心的白光点E相连,则可以将色度图画分为各种不同的颜色区域。如果能计算出某颜色的色度坐标x、y,就可以在色度中明确地定出它的颜色特征。例如青色样品的表面色色度坐标为x=0.1902、y=0.2302,它在色度图中的位置为A点,落在蓝绿色的区域内。当然不同的色彩有不同的色度坐标,在色度图中就占有不同位置。因此,色度图中点的位置可以代表各种色彩的颜色特征。但是,前面曾经讨论过,色度坐标只规定了颜色的色度,而未规定颜色的亮度,所以若要唯一地确定某颜色,还必须指出其亮度特征,也即是Y的大小。

    • CIE XYZ颜色空间的不均匀性

           色彩差别量与其它物理量在性质上迥然不同。例如长度这一物理量,人们常常可以任意分割,即使人眼无法分辨的微小长度,还可以借助显微镜和其它物理仪器来测量和观察。但是,对于色彩差别量来说,主要取决于眼睛的判断。如果一个眼睛不能再分辨的色彩差别量,而人们又不能借助物理仪器来观察它,这样它就成了一个无意义的数值。我们把人眼感觉不出的色彩差别量(变化范围)叫做颜色的宽容量。颜色的宽容量反映在CIE xy色度图上即为两个色度点之间的距离。因为,每种颜色在色度图上是一个点,但对人的视感觉来说,当这种颜色的色度坐标位置变化很小时,人眼仍认为它是原来的颜色,感觉不出它的变化。所以,对视感觉效果来说,在这个变化的距离(或范围)以内的色彩差别量,在视觉效果上是等效的。对色彩复制和其它颜色工业部门来说这种位于人眼宽容量范围之内的色彩差别量是允许存在的。

           1942年,美国柯达研究所的研究人员麦克亚当(D.L.Macadam)发表的一篇关于人的视觉宽容量的论文,迄今为止,仍是在色彩差别定量计算与测量方面的基本著作。在研究的过程中,麦克亚当在CIE xy色度图上不同位置选择了25个颜色色度点作为标准色光,其色度坐标x、y。又对每个色度点画出5~9条不同的方向直线,取相对两侧的色光来匹配标准色光的颜色,由同一位观察者调节所配色光的比例,确定其颜色辨别的宽容量。通过反复做50次配色实验,计算各次所得色度坐标的标准差,即:

     

            如图所示,围绕指定标准色度点向各个方向的辐射线为各标准差的距离,发现在不同方向上,此距离是不相等。围绕标准色度点,在不同方向上取距离为一个标准差的点的轨迹近似一个椭圆。还可以看到在色度图不同位置上的25个颜色点的椭圆形状大小不一样,其长轴方向也不相同。这表明在xy色度图中,在不同位置不同方向上颜色的宽容量是不相同的。换句话说,标准CIE xy色度图上的相同的几何距离,在不同的颜色区域里和不同颜色变化的方向上,所对应的视觉颜色差别量大小是不同的,图中的各个椭圆形宽容量是按实验结果的标准差的10倍绘出的。

    HSV颜色空间

    • 基本概念

          HSV(Hue, Saturation, Value)是根据颜色的直观特性由A. R. Smith在1978年创建的一种颜色空间, 也称六角锥体模型(Hexcone Model)。这个模型中颜色的参数分别是:色调(H),饱和度(S),明度(V)。

    •  空间模型 

        色调H:

           用角度度量,取值范围为0°~360°,从红色开始按逆时针方向计算,红色为0°,绿色为120°,蓝色为240°。它们的补色是:黄色为60°,青色为180°,品红为300°;

       饱和度S:

         饱和度S表示颜色接近光谱色的程度。一种颜色,可以看成是某种光谱色与白色混合的结果。其中光谱色所占的比例愈大,颜色接近光谱色的程度就愈高,颜色的饱和度也就愈高。饱和度高,颜色则深而艳。光谱色的白光成分为0,饱和度达到最高。通常取值范围为0%~100%,值越大,颜色越饱和。

          明度V:

    明度表示颜色明亮的程度,对于光源色,明度值与发光体的光亮度有关;对于物体色,此值和物体的透射比或反射比有关。通常取值范围为0%(黑)到100%(白)。

           RGB和CMY颜色模型都是面向硬件的,而HSV(Hue Saturation Value)颜色模型是面向用户的。HSV模型的三维表示从RGB立方体演化而来。设想从RGB沿立方体对角线的白色顶点向黑色顶点观察,就可以看到立方体的六边形外形。六边形边界表示色彩,水平轴表示纯度,明度沿垂直轴测量。

                                                                             

    • 从RGB到HSV的转换

           HSV 在数学上定义为在 RGB 空间中的颜色的 R, G 和 B 的坐标的变换。设 (r, g, b) 分别是一个颜色的红、绿和蓝坐标,它们的值是在 0 到 1 之间的实数。设 max 等价于 r, g 和 b 中的最大者,设 min 等于这些值中的最小者。要找到在 HSV 空间中的 (h, s, v) 值,这里的 h ∈ [0, 360)是角度的色相角,而 s, v ∈ [0,1] 是饱和度和亮度,计算公式为:

     

           HSV对用户来说是一种直观的颜色模型。我们可以从一种纯色彩开始,即指定色彩角H,并让V=S=1,然后我们可以通过向其中加入黑色和白色来得到我们需要的颜色。增加黑色可以减小V而S不变,同样增加白色可以减小S而V不变。例如,要得到深蓝色,V=0.4 S=1 H=240度。要得到淡蓝色,V=1 S=0.4 H=240度。

          一般说来,人眼最大能区分128种不同的色彩,130种色饱和度,23种明暗度。如果我们用16Bit表示HSV的话,可以用7位存放H,4位存放S,5位存放V,即745或者655就可以满足我们的需要了。

           由于HSV是一种比较直观的颜色模型,所以在许多图像编辑工具中应用比较广泛,如Photoshop(在Photoshop中叫HSB)等等,但这也决定了它不适合使用在光照模型中,许多光线混合运算、光强运算等都无法直接使用HSV来实现。

     

     

     

     

    展开全文
  • 结合我之前已经写过一个随机颜色生成器,就想将这个随机颜色生成器写出来,作为一个工具使用,虽然实际应用场景不大,就当练练手了。 本示例中使用了大量的Generator,在写的过程发现ES6所提供的Generator在这个场景...

    最近在实现https://javascript30.com/的课程,其中有一门课程要求利用Canvas实现一个效果,我发现这个效果其中的颜色是线性生成的。结合我之前已经写过一个随机颜色生成器,就想将这个随机颜色生成器写出来,作为一个工具使用,虽然实际应用场景不大,就当练练手了。

    本示例中使用了大量的Generator,在写的过程发现ES6所提供的Generator在这个场景中非常适用。可以参考学习。

    本工具已经上传至NPM,详细介绍了使用方法与注意事项,请移步至:random-color-generator2
    1.2.0 版本现已支持HSL算法,线性输出更平稳。

    随机生成一个颜色

    在这里插入图片描述
    在浏览器中这么使用:

        // 生成随机色
        const pointer = rcg2.generateColor(false);
        const color = pointer.next().value;
    

    我的示例中使用了300个颜色块,所以颜色呈现上图效果。

    返回线性递增颜色

    在这里插入图片描述
    在浏览器中这么使用:

        // 生成线性色, 步长为5
        const pointer = rcg2.generateColor(true, 5);
        const color = pointer.next().value;
    

    我的示例中使用了300个颜色块,所以颜色呈现上图效果。

    And (Use HSL algorithm. 😃 Be better! 😃)

    HSL算法为360个单位一周期。

    HSL采用单次递增1个单位的效果:
    在这里插入图片描述
    HSL采用单次递增2个单位的效果:
    在这里插入图片描述
    文本示例:

    IndexColor
    0‘#ff0000’
    1‘#ff1100’
    2‘#ff2200’
    3‘#ff3300’
    4‘#ff4400’

    HSL算法说明图:
    在这里插入图片描述

    如有疑问,可以参见项目中的index.html示例文件。

    对generateColor方法及颜色模板的说明

    generateColor方法有两个参数.

    • 参数1,类型为boolean值,表示是否开启线性输出。
    • 参数2,类型为整型,表示线性输出情况下颜色的增量区间。例如这个值传入3,在第一个值为#00FF00的情况下,第二个值就为03FF00,以此类推。

    颜色模板的排列组合为: XXFF00 XX00FF FFXX00 FF00XX 00XXFF 00FFXX,目前从这6个中循环取模板,后期将支持自定义模板。

    分治算法求排列组合

    在实现线性递增的过程中,需要了解情况线性颜色的变化方式,在观察了ADOBE对于颜色的变化方式之后,知道需要有一个模板的排列组合。虽然这里需要的只有6种,不用多长时间就可以穷举出来,但是我还是想通过分治的方法将所有的可能列出来。

    实现代码如下:

    // 分治算法计算所有的颜色模板值
    function generateColorTemplate(array) {
    
        // 出口
        if (array.length === 1)
            return array;
    
        const resultArray = [];
        for (let index = 0; index < array.length; index++) {
            const firstEle = array[index];
    
            const shadow = array.slice();
            shadow.splice(array.indexOf(firstEle), 1);
            const temp = generateColorTemplate(shadow);
    
            // 组合
            for (let indexJ = 0; indexJ < temp.length; indexJ++) {
                const secondEle = temp[indexJ];
                resultArray.push(`${firstEle}${secondEle}`);
            }
        }
        return resultArray;
    }
    

    测试方式如下:

    // test.js
    const { generateColorTemplate } = require('./src/index.js');
    
    const result = generateColorTemplate(['A', 'B', 'C', 'D', 'E']);
    
    console.info(result.join(' '), result.length);
    

    对于5个元素的排列组合为: 5的阶层, 也就是 5 x 4 x 3 x 2 x 1 = 120.
    最终的结果经过多轮测试是正确的:

    ABCDE ABCED ABDCE ABDEC ABECD ABEDC ACBDE ACBED ACDBE ACDEB ACEBD ACEDB ADB
    CE ADBEC ADCBE ADCEB ADEBC ADECB AEBCD AEBDC AECBD AECDB AEDBC AEDCB BACDE 
    BACED BADCE BADEC BAECD BAEDC BCADE BCAED BCDAE BCDEA BCEAD BCEDA BDACE BDA
    EC BDCAE BDCEA BDEAC BDECA BEACD BEADC BECAD BECDA BEDAC BEDCA CABDE CABED 
    CADBE CADEB CAEBD CAEDB CBADE CBAED CBDAE CBDEA CBEAD CBEDA CDABE CDAEB CDB
    AE CDBEA CDEAB CDEBA CEABD CEADB CEBAD CEBDA CEDAB CEDBA DABCE DABEC DACBE 
    DACEB DAEBC DAECB DBACE DBAEC DBCAE DBCEA DBEAC DBECA DCABE DCAEB DCBAE DCB
    EA DCEAB DCEBA DEABC DEACB DEBAC DEBCA DECAB DECBA EABCD EABDC EACBD EACDB 
    EADBC EADCB EBACD EBADC EBCAD EBCDA EBDAC EBDCA ECABD ECADB ECBAD ECBDA ECD
    AB ECDBA EDABC EDACB EDBAC EDBCA EDCAB EDCBA 120
    

    对于这种场景使用分治算法求排列组合非常合适。


    代码已经上传Github,地址为:Random Color Generator
    这个工具已上传NPM,地址为:random-color-generator2

    TODOLIST:

    • 支持颜色模板可配置. 例如支持XXFFFF/XX0000/FFXXFF…
    • 支持步长可配置. 支持单次递增变化值: 1 ~ 255
    • 支持颜色随机范围可配置. 例如支持100 ~ 150的颜色范围区间
    • 支持递减
    展开全文
  • 两种不同的PBR工作流介绍

    千次阅读 多人点赞 2020-10-08 15:44:33
    本文介绍两种常用的PBR材质工作流:金属/粗糙度工作流(Metal/Roughness)和镜面反射/光泽度工作流(Specular/Glossiness)。这两种工作流都可以用来制作一个支持PBR的材质,并用PBR渲染出逼真的效果,它们没有优劣...

    本文介绍两种常用的PBR材质工作流:金属/粗糙度工作流(Metal/Roughness)和镜面反射/光泽度工作流(Specular/Glossiness)。这两种工作流都可以用来制作一个支持PBR的材质,并用PBR渲染出逼真的效果,它们没有优劣之分,只是对同一种现象的不同实现。理解了这两种工作流,才可以更好的理解PBR着色器的一些参数及其使用背后的原理。

    本文参考了Substance出版的The PBR Guide,原文连接在[1],如果想看中文版可以参考[2]。

    PBR需要什么

    无论是金属/粗糙度工作流还是镜面反射/光泽度工作流,他们的目的都是进行PBR渲染,获得尽可能真实的渲染结果。前文介绍了基于微表面理论的BRDF模型需要这样几个参数:

    • 粗糙度或者光滑度;
    • F 0 F_{0} F0,入射角为 0 ° 0\degree 0°时的反射光线radiance占入射光线radiance的比例;

    除此之外,有一个默认参数: F 90 = 1 F_{90}=1 F90=1,入射角为 90 ° 90\degree 90°时的反射光线radiance占入射光线radiance的比例。

    F 0 F_{0} F0的主要作用是,决定DiffuseColor和SpecularColor。
    F 0 F_{0} F0的值与物体是否为金属有很大关系,要说明白这一点,先看一下金属、非金属的区别。

    金属 vs. 非金属

    金属是优良的导体,导电性和传热性都非常好。当光线打到金属表面,部分被反射,折射部分全部被吸收。由于金属对不同波长的光线的吸收程度不同,所以金属的反射光线通常是有颜色的,即 F 0 F_{0} F0的RGB三通道值不同。而这也是金属本身的颜色的来源。比如黄金会吸收高频的蓝色波段,因此黄金看起来是黄色的。

    金属还有一个特性,那就是生锈(被腐蚀)。生锈的金属会失去金属光泽,变得类似非金属的材质。

    对于非金属(或者称为介电质、非导体、绝缘体),导电性很差,折射进入材质的光线会被散射或者吸收,然后折射离开材质。而非金属反射的光线也比金属少,即非金属的 F 0 F_{0} F0更小,通常在0.02到0.05之间,绝大部分情况都不会超过0.04。

    总结一下,金属的 F 0 F_{0} F0跟材质本身有关,非金属的 F 0 F_{0} F0约等于0.04。

    金属/粗糙度工作流

    mrworkflow

    金属/粗糙度工作流(简写为M/R工作流)采用了三张贴图来表示PBR所需的参数:

    • baseColor,RGB贴图,表示非导体(电介质)的反照率颜色(Albedo)或金属的 F 0 F_{0} F0,它不应该含有任何光照信息;
    • metallic,灰度贴图,可以视为一个遮罩,表示金属成分的占比:1表示100%的纯金属,0表示100%的非金属,metallic贴图可以用于表示金属-非金属的混合状态;
    • roughness,灰度贴图,数值越大越粗糙;

    M/R工作流的优劣:

    • 非金属的 F 0 F_{0} F0固定为0.04,无法调整;
    • 主流的工作流,用途广泛;

    镜面反射/光泽度工作流

    sgworkflow

    镜面反射/光泽度工作流(简写为S/G工作流)

    • Diffuse,即Albedo,RGB贴图,表示非金属的Albedo,如果是金属,Diffuse贴图给出的值是纯黑(0);
    • Specular,RGB贴图,定义金属和非金属的 F 0 F_{0} F0
    • Glossiness,灰度贴图,数值越大月光滑,跟M/R工作流的roughness刚好相反;

    S/G工作流的优劣:

    • 可以对金属、非金属的 F 0 F_{0} F0自由调整,但是这也非常容易做出违反能量守恒定律的材质;
    • 两张RGB贴图,对性能的要求会更高;

    总结

    下图展示了两个工作流的相同与不同。

    workflows

    通用的贴图

    两个工作流有几个通用的纹理贴图,包括:

    • 环境光遮蔽/环境光吸收贴图Ambient Occlusion,灰度贴图,表示环境光对材质的影响,这个贴图会作为一个系数与环境光结合;
    • 高度贴图Height,用于displacement mapping效果,模拟表面细节;
    • 法向贴图Normal,用于normal mapping,模拟表面细节;

    分辨率与纹素密度

    这个话题是The PBR Guide[1]提出的,我在实践中还没有遇到过。这里根据The PBR Guide的介绍理解一下。

    Resolution

    这种异常的边界通常出现在金属/非金属交界的位置,出现的原因是两张纹理贴图(M/R工作流中的baseColor和Metallic,S/G工作流中的Diffuse和Specular)之间的微小的误差。比如在M/R工作流中,白边处的Metallic比较小,但是baseColor认为它还是金属,因此baseColor里包含的非常亮的金属反射值,导致了白边。而S/G工作流中,Diffuse贴图中因为原始金属并没有漫射色,所以呈现为黑色。

    从上面的分析可以看出,出现这个问题主要原因是纹理贴图的精度不够,提高纹理的纹素密度,即纹理涂片的分辨率就可以解决这个问题。

    辨析baseColor,Diffuse,Albedo,F0,DiffuseColor

    这几个词在本文频繁出现,他们的意义非常接近,但是又有所不同,所以单独拎出来解释一下。

    首先,baseColor和Diffuse被用在了两个工作流里面,他们的意义前面已经详细介绍过了,这两个词都只是一个对纹理的称呼,可以理解为在特定工作流里面的专有名词。

    Albedo称为反射率本征图,表示物体本身的颜色,这个颜色是与光照无关的。

    F 0 F_{0} F0不是一个颜色,而是一个介于 [ 0 , 1 ] [0,1] [0,1]的比例,表示反射光线radiance占入射光线radiance的比例。这个值主要是用在BRDF公式里面的菲涅尔方程里,通常这个值与albedo有关。

    DiffuseColor更像是渲染里面的用词,表示入射光线或者出射光线的Diffuse分量,和SpecularColor相对。

    实例

    我在Github找到一个repo[3],支持了上面介绍的两个工作流,可以拿来参考一下。

    这个repo的做法是,将S/G工作流的参数转为M/R工作流的参数,它提取出来的参数包括:

    float perceptualRoughness;
    float metallic;
    vec4 baseColor;
    

    具体的shader实现如下,细节不在赘述:

    struct PBRInfo
    {
    	float NdotL;                  // cos angle between normal and light direction
    	float NdotV;                  // cos angle between normal and view direction
    	float NdotH;                  // cos angle between normal and half vector
    	float LdotH;                  // cos angle between light direction and half vector
    	float VdotH;                  // cos angle between view direction and half vector
    	float perceptualRoughness;    // roughness value, as authored by the model creator (input to shader)
    	float metalness;              // metallic value at the surface
    	vec3 reflectance0;            // full reflectance color (normal incidence angle)
    	vec3 reflectance90;           // reflectance color at grazing angle
    	float alphaRoughness;         // roughness mapped to a more linear change in the roughness (proposed by [2])
    	vec3 diffuseColor;            // color contribution from diffuse lighting
    	vec3 specularColor;           // color contribution from specular lighting
    };
    
    // Gets metallic factor from specular glossiness workflow inputs 
    float convertMetallic(vec3 diffuse, vec3 specular, float maxSpecular) {
    	float perceivedDiffuse = sqrt(0.299 * diffuse.r * diffuse.r + 0.587 * diffuse.g * diffuse.g + 0.114 * diffuse.b * diffuse.b);
    	float perceivedSpecular = sqrt(0.299 * specular.r * specular.r + 0.587 * specular.g * specular.g + 0.114 * specular.b * specular.b);
    	if (perceivedSpecular < c_MinRoughness) {
    		return 0.0;
    	}
    	float a = c_MinRoughness;
    	float b = perceivedDiffuse * (1.0 - maxSpecular) / (1.0 - c_MinRoughness) + perceivedSpecular - 2.0 * c_MinRoughness;
    	float c = c_MinRoughness - perceivedSpecular;
    	float D = max(b * b - 4.0 * a * c, 0.0);
    	return clamp((-b + sqrt(D)) / (2.0 * a), 0.0, 1.0);
    }
    
    void main()
    {
    	float perceptualRoughness;
    	float metallic;
    	vec4 baseColor;
    
    	vec3 f0 = vec3(0.04);
    
    	if (material.alphaMask == 1.0f) {
    		if (material.baseColorTextureSet > -1) {
    			baseColor = SRGBtoLINEAR(texture(colorMap, inUV)) * material.baseColorFactor;
    		} else {
    			baseColor = material.baseColorFactor;
    		}
    		if (baseColor.a < material.alphaMaskCutoff) {
    			discard;
    		}
    	}
    
    	if (material.workflow == PBR_WORKFLOW_METALLIC_ROUGHNESS) {
    		// Metallic and Roughness material properties are packed together
    		// In glTF, these factors can be specified by fixed scalar values
    		// or from a metallic-roughness map
    		perceptualRoughness = material.roughnessFactor;
    		metallic = material.metallicFactor;
    
            // Roughness is stored in the 'g' channel, metallic is stored in the 'b' channel.
            // This layout intentionally reserves the 'r' channel for (optional) occlusion map data
            vec4 mrSample = texture(physicalDescriptorMap, inUV);
            perceptualRoughness = mrSample.g * perceptualRoughness;
            metallic = mrSample.b * metallic;
    
    		// The albedo may be defined from a base texture or a flat color
            baseColor = SRGBtoLINEAR(texture(colorMap, inUV)) * material.baseColorFactor;
    	}
    
    	if (material.workflow == PBR_WORKFLOW_SPECULAR_GLOSINESS) {
    		// Values from specular glossiness workflow are converted to metallic roughness
            perceptualRoughness = 1.0 - texture(physicalDescriptorMap, inUV).a;
    
    		const float epsilon = 1e-6;
    
    		vec4 diffuse = SRGBtoLINEAR(texture(colorMap, inUV0));
    		vec3 specular = SRGBtoLINEAR(texture(physicalDescriptorMap, inUV0)).rgb;
    
    		float maxSpecular = max(max(specular.r, specular.g), specular.b);
    
    		// Convert metallic value from specular glossiness inputs
    		metallic = convertMetallic(diffuse.rgb, specular, maxSpecular);
    
    		vec3 baseColorDiffusePart = diffuse.rgb * ((1.0 - maxSpecular) / (1 - c_MinRoughness) / max(1 - metallic, epsilon)) * material.diffuseFactor.rgb;
    		vec3 baseColorSpecularPart = specular - (vec3(c_MinRoughness) * (1 - metallic) * (1 / max(metallic, epsilon))) * material.specularFactor.rgb;
    		baseColor = vec4(mix(baseColorDiffusePart, baseColorSpecularPart, metallic * metallic), diffuse.a);
    
    	}
    
    	vec3 diffuseColor;
    	diffuseColor = baseColor.rgb * (vec3(1.0) - f0);
    	diffuseColor *= 1.0 - metallic;
    		
    	float alphaRoughness = perceptualRoughness * perceptualRoughness;
    
    	vec3 specularColor = mix(f0, baseColor.rgb, metallic);
    
    	// Compute reflectance.
    	float reflectance = max(max(specularColor.r, specularColor.g), specularColor.b);
    
    	// For typical incident reflectance range (between 4% to 100%) set the grazing reflectance to 100% for typical fresnel effect.
    	// For very low reflectance range on highly diffuse objects (below 4%), incrementally reduce grazing reflecance to 0%.
    	float reflectance90 = clamp(reflectance * 25.0, 0.0, 1.0);
    	vec3 specularEnvironmentR0 = specularColor.rgb;
    	vec3 specularEnvironmentR90 = vec3(1.0, 1.0, 1.0) * reflectance90;
    
    	vec3 n = (material.normalTextureSet > -1) ? getNormal() : normalize(inNormal);
    	vec3 v = normalize(ubo.camPos - inWorldPos);    // Vector from surface point to camera
    	vec3 l = normalize(uboParams.lightDir.xyz);     // Vector from surface point to light
    	vec3 h = normalize(l+v);                        // Half vector between both l and v
    	vec3 reflection = -normalize(reflect(v, n));
    	reflection.y *= -1.0f;
    
    	float NdotL = clamp(dot(n, l), 0.001, 1.0);
    	float NdotV = clamp(abs(dot(n, v)), 0.001, 1.0);
    	float NdotH = clamp(dot(n, h), 0.0, 1.0);
    	float LdotH = clamp(dot(l, h), 0.0, 1.0);
    	float VdotH = clamp(dot(v, h), 0.0, 1.0);
    
    	PBRInfo pbrInputs = PBRInfo(
    		NdotL,
    		NdotV,
    		NdotH,
    		LdotH,
    		VdotH,
    		perceptualRoughness,
    		metallic,
    		specularEnvironmentR0,
    		specularEnvironmentR90,
    		alphaRoughness,
    		diffuseColor,
    		specularColor
    	);
    
        // ...
    

    最后利用纹理提取出来的材质信息以及光源信息构建结构体PBRInfo,用这个结构体的数据计算输出的颜色。

    Reference

    1. The PBR Guide, part 1 and part 2
    2. ISUX译文 | The PBR Guide 基于物理的渲染指引,
    3. github repo: Vulkan-glTF-PBR
    展开全文
  • 使用OpenCV中的色彩空间进行颜色分割

    万次阅读 多人点赞 2019-09-26 11:02:14
    在本教程中,我们将学习Computer Vision中使用的流行色彩空间,并将其用于基于颜色的分割。 1975年,匈牙利专利HU170062引入了一难题,在43,252,003,274,489,856,000(43亿亿)可能性中,只有一正确的解决...
  • tabSelectedTextColor:选中的tab的字体颜色 tabMode:模式(Scrollable fixed). 其中的fixed模式需要和tabGravity属性配合使用,此时tabGravity属性值为fill. tabIndicatorHeight:设置tab底部的横线高度.为0dp...
  • 【Web开发】HTML颜色代码表

    千次阅读 2021-10-21 22:03:56
    任何一种颜色,只要有光谱数据,就能用公式算出其在色度图上的坐标。也就是所有地球上能实现的颜色,都可以通过色品图的坐标标注出来,不会超过这个范围。而色空间是一个三维空间,所以色度图是不包含明度信息的。...
  • 这篇文章介绍一下有关终端颜色的相关的一些基础内容,主要围绕着CLICOLOR与LSCOLORS个环境变量。
  • 图像颜色校正的几方法

    万次阅读 2018-03-23 16:10:38
    9197转载路径https://blog.csdn.net/liu_xiao_cheng/article/details/50552762注:本文主要参考“彩色人脸图像颜色校正及其在肝病诊断中的应用研究”硕士论文 采集的图片颜色与采集环境有很大关系,同一个样本在...
  • 基于颜色指纹和内容信息的图像相似度计算方法
  • ...常用的图像特征有颜色特征、纹理特征、形状特征、空间关系特征。... 颜色特征是一全局特征,描 述了图像或图像区域所对应的景物的表面性质。一般颜色特征是基于像素点的特征,此时所有属于图像
  • SecureCRT 中如何配置颜色

    千次阅读 2021-12-30 18:30:55
    本技巧提供了有关这两种颜色配置方法的详细信息,包括有关它们如何组合交互的信息。 下面的问答部分提供了有关在 SecureCRT 中使用颜色的常见问题的答案。配色方案 SecureCRT 中的配色方案是本地配置设置,指示 ...
  • 计算机可以使用两种方式来显示图像: 一:点阵文件:又名:取样图像、点阵图像、位图图像。从现实世界中通过数字化设备(扫描仪)获取的图。点阵文件缩放会失真,保存起来占用空间比较大。 主要的参数有1.图像大小...
  • 计算图像中不同颜色的面积比

    千次阅读 2021-02-11 01:53:22
    我有很多“原木”的图像,它们是垂直的颜色序列,我想知道1种颜色的总面积与另一种颜色相比的差异,以及1种颜色相对于整个图像的比率。在举个例子,在下面的图片中,如果我计算蓝色所占的总面积,并将其与整个区域...
  • RGB颜色空间

    千次阅读 2020-02-25 09:43:41
    RGB颜色空间 基本概念         RGB颜色空间以R(Red:红)、G(Green:绿)、B(Blue...
  • 我们在之前的博客中已经介绍过了一些主流的图像颜色迁移方法。这些方法一般通过计算全局颜色分布对应或者语义分析对应,来构建颜色迁移策略。这带来了一个问题,就是对图像建立一个统一的颜色迁移策略,会降低颜色...
  • 一、颜色空间介绍 ...然而一般对颜色空间的图像进行有效处理都是在 HSV 空间进行的,HSV(色 调 Hue,饱和度 Saturation,亮度 Value)是根据颜色的直观特性创建的一种颜色空间, 也称六角 锥体模型。 &...
  • 编写一个登录页面,使用Tab栏实现“账号登录”和“二维码登录”这两种方式的切换,并通过transition组件结合animate.css实现切换时的动画效果 1.CSS样式 编写自己想要的大小,颜色等 #content{ width: 400px;; ...
  • arcmap的点图层的图例制作中,大小和颜色都是非常重要的信息,如果二者能够结合起来分别代表不同的属性信息,就能把更丰富的信息用更直观的方式体现出来。 方法比较简单,首先是打开属性对话框,点到symbology页。 ...
  • 转自:http://blog.csdn.net/mazy_ma/article/details/51775670有时,UITextField自带的Placeholder的颜色太浅或者不满足需求,所以需要修改,而...例如:系统默认的Placeholder颜色太浅 需要加深颜色,或者改变颜色
  • 混和颜色可以代替单一颜色(频率的光)吗? 2。如何判断不同人眼中的同一颜色(频率的光)是否一样?不同的生物呢?如果他们都不是色盲。 3。如何像物理的定义一样精确定义“色盲”? 关注者 837 被浏览 95,228 ...
  • opencv小球与颜色识别

    千次阅读 2019-10-06 11:40:39
    各种颜色小球 原理讲解 霍夫圆变换:的基本原理和上个教程中提到的霍夫线变换类似, 只是点对应的二维极径极角空间被三维的圆心点x,yx,yx,y还有半径rrr空间取代。 原理:从平面坐标圆上的点到极坐标转换的三个参数C...
  • 参考博文: http://blog.sina.com.cn/s/blog_44a9645c0101222r.html http://blog.csdn.net/szfhy/article/details/49805331 ... RGB颜色空间  RGB(red,gr
  • 灰度传感器(模拟和智能)两种

    万次阅读 多人点赞 2019-03-06 14:09:06
    Smart Grayscale Sensor 智能灰度传感器概述技术指标智能灰度传感器测试[点击观看:用作巡线时采集颜色方法的视频教程](http://v.youku.com/v_show/id_XMzE3NjQ1MTE5Ng==.html?spm=a2h3j.8428770.3416059.1)应用...
  • 图像特征提取(颜色特征)

    万次阅读 多人点赞 2016-10-28 11:03:55
    这种特征不但刻画了某一种颜色的像素数量占整个图像的比例,还反映了不同颜色对之间的空间相关性。实验表明,颜色相关图比颜色直方图和颜色聚合向量具有更高的检索效率,特别是查询空间关系一致的图像。 如果考虑...
  • 图像彩色化的研究主要有基于参考图像的颜色传递方法和基于人工着色的局部颜色扩展方法。一般来说,基于参考图像的颜色传递方法首要采取图像处理方法,例如:借助图像融合技术的红外图像彩色化、基于图像分割技术、...
  • 一 arcgis10.6种有这两种方法深度学习与图像分类图像分类是基于不同地物光谱、形状等特征差异将影像转化为分类数据和信息,用于统计分析。ArcGIS Pro支持面向对象分类及基于像素的分类两种方式,提供传统分类和先进...
  •  Kukharev等人为了提高模型的稳定性,将多个颜色空间结合,提出RGB颜色空间和YCbCr颜色空间的混合肤色检测器。像素值满足如下条件: 2. 实现代码  操纵图像的方法是在前面文章的基础上修改得到的,只是将RGB...
  • RGB三原色起源于上世纪初1809年Thomas Young提出视觉的三原色学说,随后Helmholtz在1824年也提出了三原色学说:即:视网膜存在三视锥细胞,分别含有对红、绿、蓝三光线敏感的视色素,当一定波长的光线作用于...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 125,869
精华内容 50,347
关键字:

两种颜色的结合