目录

前言

整体框图

EOTF-NolinearToLinear

sRGB中的EOTF

BT.1886的EOTF

BT.709

色域

sRGB色域

DCI-P3色域

Display P3色域

Adobe RGB (1998) 色域

BT2020色域

RGB2XYZ

计算公式

代码

仿真结果

颜色空间

LAB颜色空间

JzAzBz颜色空间

ICtCp颜色空间

ICaCb颜色空间

ColorSpaceToLCH

RGB2HSV/L

RGB和HSV互转

RGB与HSL互转

RGB2YUV

参考文献


前言

在图像处理中,经常会遇到各种颜色空间,比如RGB,YUV,Lab,HSV等等,同时,也会涉及到各种色域,比如sRGB色域,DCI-P3,Display P3色域,BT2020色域等等。有时,为了处理图像颜色,更加直观的看颜色,会进行颜色空间转换,从一种颜色空间转到另一种颜色空间,或者是从RGB转到LCH,来看亮度饱和度和色度。

整体框图

用下面这个图来表示从RGB到LCH的变换过程,从中可以看到,大体上分两类,一类是区分色域空间的,一类是不区分色域空间的。区分色域空间的,即使RGB的数值完全相等,只要对应的色域不一样,得到LCH也会不一样,这一类都是先将RGB转到和人眼比较相似的CIE1931 XYZ空间上,然后再选取某种颜色空间来衡量颜色,当然,不同的颜色空间,其得到的LCH也会不一样。总体来说,这一类是比较准确的,符合人眼特性的。而另一类,不区分色域的,哪怕是不同色域,RGB一样,得到的LCH就一样(实际人眼感知是不一样的),所以这一类是不准确的,不过这一类的计算相对要简单很多,经常一步或者两步就可以了。

下面,分不同模块来介绍。

EOTF-NolinearToLinear

EOTF主要是将非线性域RGB转到线性域RGB,对应的还有个OETF,就是将线性域转到非线性域,而不同标准下,其转换是不同的,主要介绍以下几种:

sRGB中的EOTF[1]

在sRGB色域中,有对EOTF应的规定,如下所示:

其反变换OETF为:

由IEC 61966-2-1:1999 (International Electrotechnical Commission, 1999) 发布的,其函数是分段的,使用的是gamma2.4,暗处是线性。

BT.1886的EOTF[2]

BT.1886中,对EOTF进行如下规定:

基本上就是采用了gamma2.4,LB是屏幕最暗,就是0对应的亮度,Lw是屏幕的最亮,就是1对应的亮度,都是用nit为单位。

BT.709[3]

BT709中,对OETF的定义如下,也是分段函数,一段是线性,另一段是gamma2.2,和BT1886中和sRGB色域中,都有些不同。

当然,除了上面几种,还有些HDR标准的EOTF定义,比如PQ,HLG等,具体可以参照以下资料。

HDR相关标准-HLG/HDR10/HDR10+/DOLBY VISION_图像算法菜鸟的博客-CSDN博客_hlg和hdr10什么区别

PQ和HLG标准及其转换_图像算法菜鸟的博客-CSDN博客_hlg pq

色域

在业界,有很多种色域标准,sRGB色域,DCI-P3,Display P3色域,BT2020色域,他们都是定义在XYZ空间上,规定RGB三个色坐标和白点色坐标即可。色域色坐标都确定了,那么就可以在线性RGB和XYZ空间进行转换了。主要介绍以下色域:

sRGB色域

sRGB的色坐标定义如下:

RGB Primaries:

[[ 0.64  0.33]

[ 0.3   0.6 ]

[ 0.15  0.06]]

Whitepoint: [ 0.3127  0.329 ]

DCI-P3色域

DCI-P3的色坐标定义如下:

RGB Primaries:

[[ 0.68   0.32 ]

[ 0.265  0.69 ]

[ 0.15   0.06 ]]

Whitepoint: [ 0.314  0.351]

Display P3色域

Display P3的色坐标定义如下:

RGB Primaries:

[[ 0.68   0.32 ]

[ 0.265  0.69 ]

[ 0.15   0.06 ]]

Whitepoint: [ 0.3127  0.329 ]

和DCI-P3对比,二者的差异是白点色坐标不同,Display P3使用的是D65的白点,而DCI-P3不是

Adobe RGB (1998) 色域

Adobe RGB的色坐标定义如下:

RGB Primaries :

[[ 0.64  0.33]

[ 0.21  0.71]

[ 0.15  0.06]]

Whitepoint : [ 0.3127  0.329 ]

BT2020色域

BT2020的色坐标定义如下:

RGB Primaries :

[[ 0.708  0.292]

[ 0.17   0.797]

[ 0.131  0.046]]

Whitepoint: [ 0.3127  0.329 ]

可以使用Python提供的colour库[4]进行画图,得到各个色域的信息和画图,参考代码如下:

import colour
import colour.plotting
if __name__ == '__main__':srgb = colour.RGB_COLOURSPACES['sRGB']print('srg :', srgb)dcip3 = colour.RGB_COLOURSPACES['DCI-P3']print('dci-p3:', dcip3)bt2020 = colour.RGB_COLOURSPACES['ITU-R BT.2020']print('ITU-R BT.2020:', bt2020)adobe1998 = colour.RGB_COLOURSPACES['adobe1998']print('adobe1998:', adobe1998)DisplayP3 = colour.RGB_COLOURSPACES['Display P3']print('DisplayP3:', DisplayP3)colour.plotting.plot_RGB_colourspaces_in_chromaticity_diagram_CIE1931(['sRGB', 'ITU-R BT.2020', 'adobe1998','DCI-P3', 'Display P3'])

结果图如下:

RGB2XYZ

只要色域的RGB三个色坐标和白点色坐标确定了,就可以得到RGB到XYZ空间的转换矩阵,很多时候,我们都是记住这个矩阵,不过有时,会定义一个不是标准的色域,这个时候就没有对应的转换矩阵了。而实际上,这个转换矩阵是可以通过计算得到的[5],

计算公式

代码

其实现代码和测试代码如下:

import numpy as npdef XYZToxy(XYZ):XYZ = XYZ.reshape(-1, 3)num, _ = XYZ.shapesumXYZ = np.sum(XYZ, axis=0)xy = np.zeros((num, 2), np.float)xy[:, 0] = XYZ[:, 0] / sumXYZxy[:, 1] = XYZ[:, 1] / sumXYZreturn xydef xyToXYZ(xy):xy = xy.reshape(-1, 2)num, _ = xy.shapeXYZ = np.zeros((num, 3), np.float)XYZ[:, 0] = xy[:, 0] / xy[:, 1]XYZ[:, 1] = 1XYZ[:, 2] = (1 - xy[:, 0] - xy[:, 1]) / xy[:, 1]return XYZdef GetRGBXYZMatrices(xy):XYZ = xyToXYZ(xy)# print(XYZ)matXYZrgb = XYZ[0:3, :].TXYZw = XYZ[3, :]Srgb = np.linalg.inv(matXYZrgb) @ XYZw.T# print(Srgb.shape)matRGB2XYZ = np.zeros((3, 3), np.float)matRGB2XYZ[0, 0] = Srgb[0] * matXYZrgb[0, 0]matRGB2XYZ[0, 1] = Srgb[1] * matXYZrgb[0, 1]matRGB2XYZ[0, 2] = Srgb[2] * matXYZrgb[0, 2]matRGB2XYZ[1, 0] = Srgb[0] * matXYZrgb[1, 0]matRGB2XYZ[1, 1] = Srgb[1] * matXYZrgb[1, 1]matRGB2XYZ[1, 2] = Srgb[2] * matXYZrgb[1, 2]matRGB2XYZ[2, 0] = Srgb[0] * matXYZrgb[2, 0]matRGB2XYZ[2, 1] = Srgb[1] * matXYZrgb[2, 1]matRGB2XYZ[2, 2] = Srgb[2] * matXYZrgb[2, 2]matXYZ2RGB = np.linalg.inv(matRGB2XYZ)print('matRGB2XYZ:', matRGB2XYZ)print('matXYZ2RGB:', matXYZ2RGB)return matRGB2XYZ, matXYZ2RGBif __name__ == '__main__':xysRGB = np.array([[0.64, 0.33],[0.30, 0.60],[0.15, 0.06],[0.3127, 0.3290]])xyDisplayP3 = np.array([[0.68, 0.32],[0.265, 0.69],[0.15, 0.06],[0.3127, 0.3290]])xyBT2020 = np.array([[0.708, 0.292],[0.17, 0.797],[0.131, 0.046],[0.3127, 0.3290]])xySMPTE_C = np.array([[0.63, 0.34],[0.31, 0.595],[0.155, 0.07],[0.3127, 0.3290]])xyNTSC = np.array([[0.67, 0.33],[0.21, 0.71],[0.14, 0.08],[0.3101, 0.3162]])xyAdobe = np.array([[0.64, 0.33],[0.21, 0.71],[0.15, 0.06],[0.3127, 0.3290]])GetRGBXYZMatrices(xysRGB)GetRGBXYZMatrices(xyDisplayP3)GetRGBXYZMatrices(xyAdobe)

代码中计算了三种色域的转换矩阵,分别为

仿真结果

sRGB色域

matRGB2XYZ:

[[ 0.4123908   0.35758434  0.18048079]
 [ 0.21263901  0.71516868  0.07219232]
 [ 0.01933082  0.11919478  0.95053215]]
matXYZ2RGB:

[[ 3.24096994 -1.53738318 -0.49861076]
 [-0.96924364  1.8759675   0.04155506]
 [ 0.05563008 -0.20397696  1.05697151]]

Display-P3色域

matRGB2XYZ:

[[  4.86570949e-01   2.65667693e-01   1.98217285e-01]
 [  2.28974564e-01   6.91738522e-01   7.92869141e-02]
 [ -3.97207552e-17   4.51133819e-02   1.04394437e+00]]
matXYZ2RGB:

[[ 2.49349691 -0.93138362 -0.40271078]
 [-0.82948897  1.76266406  0.02362469]
 [ 0.03584583 -0.07617239  0.95688452]]

Adobe RGB色域

matRGB2XYZ:

[[ 0.57666904  0.18555824  0.18822865]
 [ 0.29734498  0.62736357  0.07529146]
 [ 0.02703136  0.07068885  0.99133754]]
matXYZ2RGB:

[[ 2.0415879  -0.56500697 -0.34473135]
 [-0.96924364  1.8759675   0.04155506]
 [ 0.01344428 -0.11836239  1.01517499]]

颜色空间

当转到XYZ以后,一般就会将XYZ再转到各种颜色空间来衡量,最常见的就是CIE的Lab空间,后面还有些其他的颜色空间,比如ICtCp, ICaCb, JzAzBz等等,下面主要介绍以下几种。

LAB颜色空间[6]

XYZ转到LAB的公式如下:

JzAzBz颜色空间[7]

XYZ转到JzAzBz的颜色空间公式如下:

ICtCp颜色空间[8]

XYZ转到ICtCp颜色空间公式如下:

ICaCb颜色空间[8]

XYZ转到ICaCb颜色空间公式如下:

当然,还有些其他的颜色空间,比如proLab[9],zICaCb[10]颜色空间等等,这些颜色空间基本上都是考虑颜色的更加均匀性和一致性,和人眼的感知接近,或者是和XYZ直接是线性转换,而不是非线性转换。

ColorSpaceToLCH

当转到各种颜色空间,比如LAB,ICtCp, ICaCb, JzAzBz和YUV或者YCbCr之后,其中L,I,Jz和Y等是亮度,其他两个分量是颜色,但也没有转到饱和度和色度上。以Lab为例,按如下方法计算即可:

RGB2HSV/L

RGB和HSV互转

RGB转HSV的公式如下,这个颜色空间相对来说,色相和饱和度比较好点,当然均匀性和一致性和LAB,JzAzBz等空间没法比,但亮度V和人眼感知的相差很远,并不能代表真实亮度。

HSV转到RGB的公式如下:

RGB与HSL互转

RGB2HSL的公式:

HSL2RGB的公式:

HSL颜色空间的色度和HSV是一样的,亮度分量L比HSV中的亮度分量要好些,但也不是很准确,饱和度S分量不好,均匀性很差,只要RGB里有0或者255,算出来的S就为1,很不连续,和人眼感知相差很远。

RGB2YUV

RGB转YUV有多种公式,不同标准,其系数不一样,不过都是线性变换,格式类似,只是数值不一样,详细可以参考如下资料。

各种标准下的YUV与RGB间的转换公式_图像算法菜鸟的博客-CSDN博客

参考文献:

[1] Multimedia systems and equipment - Colour measurement and management - Part 2-1: Colour management - Default RGB colour space - sRGB。

IEC 61966-2-1:1999 | IEC Webstore

[2] R-REC-BT.1886-0-201103-I!!PDF-E.pdf

[3] R-REC-BT.709-6-201506-I!!PDF-E.pdf

[4] API Reference — Colour 0.4.1 documentation

[5] Welcome to Bruce Lindbloom's Web Site

[6] CIE 1976 uniform colour spaces

[7] Perceptually uniform color space for image signals including high dynamic range and wide gamut

[8] Encoding High Dynamic Range and Wide Color Gamut Imagery

[9] ProLab: perceptually uniform projective colour coordinate system

[10] investigating performance of uniform color spaces for high dynamic range and wide gamut color difference applications

颜色空间转换-从RGB到LCH-亮度饱和度色度相关推荐

  1. 使用MFC实现将图像的RGB值转换到HSV空间,同时进行调节HSV,再将调节后的HSV值传进去转换到RGB空间实现图像在HSV空间中的色度、饱和度、亮度的调节

    工程上传到了github ,之前有一版忘记推送了,现在这个链接应该是没问题的了 工程的github链接 希望能帮到你. 文章内容: 1.回顾上文 2.实验步骤&要点提示&代码分析 3. ...

  2. 使用Opencv将RGB颜色空间转换到HSV颜色空间/灰度图

    一. 使用cvCvtColor函数将RGB颜色空间转换到HSV颜色空间 所需函数: 1.cvCvtColor 函数功能:颜色空间转换 函数原型: void cvCvtColor( const CvAr ...

  3. FFmpeg入门详解之121:颜色空间转换RGB和YUV的原理与实战

    5.颜色空间转换RGB和YUV的原理与实战 三种颜色空间模型:RGB.YUV.HSV 一.概述 颜色通常用三个独立的属性来描述,三个独立变量综合作用,自然就构成一个空间坐标,这就是颜色空间. 但被描述 ...

  4. 数字图像处理与Python实现-颜色空间转换-RGB颜色空间与HSV颜色空间转换

    RGB颜色空间与HSV颜色空间转换 RGB颜色空间与HSV颜色空间转换 1. 前言 2. RGB颜色空间与HSV颜色空间转换描述 3. 代码实现 1. 前言 HSV(Hue, Saturation, ...

  5. 颜色空间系列2: RGB和CIELAB颜色空间的转换及优化算法

    颜色空间系列代码下载链接:http://files.cnblogs.com/Imageshop/ImageInfo.rar (同文章同步更新) 在几个常用的颜色空间中,LAB颜色空间是除了RGB外,最 ...

  6. RGB和CIELAB颜色空间转换及偏色检测

    RGB转为CIELAB 首先RGB是不可以直接转为CIELAB颜色空间的,RGB需要先转为CIEXYZ颜色空间,然后再由CIEXYZ颜色空间转为CIELAB颜色空间.关于这2个颜色空间的互转,主要参考 ...

  7. 【Pytorch】rgb转lab颜色空间转换

    最近有需要,自己按照opencv实现的方式,自测! 个别tensor,numpy互转参考:https://oldpan.me/archives/pytorch-tensor-image-transfo ...

  8. 详解色彩模型、色域以及颜色空间转换

    常见的色彩模型 RGB色彩模型:常用于电视.摄像机等显示器,遵循加色法则(光的三原色,越混越白):缺点是色彩空间不够均匀,不容易进行色差的评价:与直观的色调.饱和度.亮度没有直接联系,不符合人的认知心 ...

  9. 【OpenCV3图像处理】颜色空间转换(一)颜色空间分类总结

    颜色空间 近100多年来,为了满足不同用途的需要,人们开发了许多不同名称的颜色空间,"可以说表示颜色空间的数目是无穷的",但是,现有的颜色空间还没有一个完全符合人的视觉感知特性.颜 ...

  10. 颜色空间转换及切割车牌(python)

    如愿 一.前置准备 二.颜色空间转换 2.1 转为灰度图片 三.切割车牌 四.总结 五.参考资料 一.前置准备 软件及使用库 python 3.8.12 opencv 3.4.11 图片 二.颜色空间 ...

最新文章

  1. loadrunner11使用常见问题(不断整理中)
  2. Makefile常用模板(静态链接库、动态链接库、可执行文件)
  3. TikTok推出招聘服务、 沃尔玛收购虚ekit、开源圆桌、AI新创Poised|拟试穿公司ZeDecode the Week...
  4. 面试官:谈谈数据库连接池的原理
  5. python预测数据怎么写_Python代写时间序列选择波动率预测指数收益算法分析案例...
  6. vuex实现及简略解析
  7. Git-第一篇认识git,核心对象,常用命令
  8. USB VIDPID 表
  9. Spring的 Junit 单元测试
  10. 酷柚易汛进销存开源版对外接口
  11. html5断点续传播放视频,HTML5 大文件断点续传完整思路整理
  12. oracle 分组 最新,Oracle分组查询
  13. MapReduce中名字的通俗解释--故事会
  14. 有用的“歪门邪道”-设计模式
  15. 听说C语言很难?怎么不来看看我这篇(六)结构
  16. 知识产权贯标认证的好处,如何申请?
  17. 超好用一键卸载软件和软件注册码
  18. 深夜,我常逛的几个网站。
  19. 免费是王道!盘点国外十款免费好用的反病毒软件产品
  20. 亚马逊运营思考:关于亚马逊CPC广告类型及权重问题值得一看!

热门文章

  1. 渗透测试服务 网站渗透真的难吗?
  2. 中国AI专利申请数超美国近2.5倍
  3. 自学c语言买谭浩强,C语言自学最强版本(谭浩强).pdf
  4. vue 倒计时插件_Vue的高性能和高精度倒计时插件
  5. linux安装btsync
  6. 用计算机算出增长比例公式,复合增长率excel公式(年均复合增长率计算器)
  7. dtft频移性质_08 DTFT变换的性质
  8. 050、动手实验:使用 jstat 摸清线上系统的JVM运行状况
  9. html中怎么让图片做背景透明背景图片,透明背景图片怎么做?
  10. 计算机网络网线颜色,网络线接法-各种网线的分类和区别-电气资讯 - 电工屋