色彩空间的个人理解
色彩空间,顾名思义,是由色彩组成的空间。在此写下我个人对色彩空间的基本看法。
初次接触到色彩空间,是在自学PS时期,为了把女神P的美美的~ 然后就看见了这个:
用画笔进行进一步美颜的时候,又看见了这个:
震惊!我该怎么从这么多颜色里选到想要的那个TAT
如何准确的找到我们想要的颜色?人们把不同的颜色按照不同的组织方式放在一起,组成了不同的色彩空间。每一种色彩都能在色彩空间中有固定的模拟和数字表示。不同的色彩空间的定义方法不同。
如何表示颜色?比如上图所出现的RGB颜色。由红色(Red,R),绿色(Green,G),蓝色(Blue,B)组成。红绿蓝是光的三原色,将这三种颜色分别看作坐标系X,Y,Z轴,便构成了RGB表示法的颜色空间。除此之外,还有通过色相、饱和度、明度建系组成的HSB色彩空间,用于印刷的CMYK色彩空间等等。下面列出几种常见的色彩空间解释。
1、 RGB色彩空间
初中科学告诉我们,光的三原色是红绿蓝。RGB所采用的就是加法混色,通过描述光的比例来定义颜色。普通常见的色彩空间,诸如srgb,Adobe rgb等都是在此基础上发展而来。而RGBA则是在RGB基础上加上Alpha透明通道。
2、 CYMK色彩空间
在一系列印刷产品设计软件中比较常见,和RGB类似采用混色的方法,但不同的是这种空间用于油墨混色。其四种原色为 青色、品红色、黄色、黑色。印刷产品靠反射光来体现颜色,故采用与RGB不同的减法混色。其对比图如下
3、 HSV色彩空间
HSV空间不采用原色混叠的方式,而是通过独特的定义表示颜色。其通过色相、饱和度、明度来记录颜色信息,它的颜色空间大概长这个样子
4、 HSL色彩空间
类似于HSV,将明度用亮度替代,在HSL中,纯色明度与白色的明度相等,而在HSV中,纯色亮度相当于灰色亮度。具体区别可从下图中看出。
最后我们特别的来讲一下色域的概念。我们经常能在买电脑的网站看到这种图:
(截自某果厂)
色域是色彩模型和色彩空间之间的对应关系,是一种编码方法,也体现了显示设备能产生的颜色总和。各厂给出这张图无非就是证明他们的色域“多么宽广”。色域显示了色彩空间和输出装置的成色范围,如下图不同色彩编码方法所对应的色域。
每台设备都有自己的颜色解释体系和呈现范围,因此有时对图片进行迁移时就有可能造成视觉颜色不正常,这时候就要用到校色。
综上所述,不同的颜色空间给予颜色不同的编码,各颜色空间是可以互相转换的。但是使用怎样的色彩空间,需要适应实际,每种色彩空间各有优劣,例如当有必要获取图像的饱和度时,应转换到HSL色彩空间。合理利用不同的空间才能达到想要的效果。
萌新啥也不知道,第一次发文,如有错误欢迎指正,大佬勿喷~
参考文献:
色域百度百科
Mac 色域测试
HSL和HSV Wiki
关于颜色-Adobe
应要求补一点和OpenCV中的Mat类相关的知识。
Mat类,在OpenCV中经常用来存储图像信息。Mat的实质是矩阵,存储图像信息的时候,Mat分为数据头和数据块两个部分。
矩阵头记录着图片的长、宽、通道、数据类型等信息。
矩阵的数据块记录着图片的信息,将每个像素的数据采取数值表示。
新建初始化Mat类型的步骤之一为
Mat image(rows,cols,type);
rows:行 cols:列 type:数据类型
据我所知存在CV_8UC1,CV_8UC2,CV_8UC3几种基本类型。末尾的数字分别代表通道数。正因如此有些时候初始化还可以再后面跟上Scalar属性初始化各通道数据。
在OpenCV中可以使用cvtColor函数对颜色空间进行转换。
cvtColor(src,dst,type);
src:图像输入Mat
dst:目标Mat
type:转换方法 COLOR_BGR2GRAY 转化灰度图 COLOR_BGR2HSV转换成为HSV格式 COLOR_BGR2Lab转化为Lab格式。
转换完成后用imwrite输出。
值得注意的是,Mat中Scalar属性访问的顺序不是R\G\B,而是B\G\R 即Scalar(0,255,0)输出的是纯绿色图形。
那么如何访问Mat中每一个通道的值?可以使用at方法。
//image.at<Vec3b>(rows,cols)[tunnel]
image.at<Vec3b>(1,2)[0] //访问image中(1,2)像素在0通道的B分量
Vec3b是RGB的一种表示方式,代表输入的图像为RGB类型(存疑?)