sRGB色彩空间

维基百科,自由的百科全书

跳到导航跳到搜索

Tango-nosources.svg

本条目需要补充更多来源(2018年9月8日)
请协助添加多方面可靠来源改善这篇条目无法查证的内容可能会因为异议提出而移除。

 

CIE 1931 xy色彩图表示的sRGB色彩空间的色域以及原色的位置。白点D65显示在中间

红色曲线是相对横轴sRGB压缩值的sRGB强度的函数,蓝色曲线是这个函数在对数-对数空间中斜率,它是每个点上的有效gamma。在压缩值0.04045或线性强度0.00313之下,曲线是线性的所以gamma为1。在红色曲线之后的黑色虚线曲线展示了完全gamma = 2.2幂次定律时的曲线。

sRGB色彩空间(标准红绿蓝色彩空间)是惠普微软于1996年一起开发的用于显示器打印机以及因特网的一种标准RGB色彩空间。这种标准得到了W3CExif英特尔PantoneCorel以及其它许多业界厂商的支持,在GIMP这样的开放源代码软件也支持这种标准,另外一些专有的或者象SVG这样的开放图形文件格式中也有应用。

sRGB最初设计的目的是作为生成在因特网以及万维网上浏览的图像的通用色彩空间,最后选择的是使用Gamma校准系数为2.2的色彩空间,即CRT显示器在这种情况下的平均线性电压响应。

这里值得重视的是sRGB的设计与当时(1996年)不算理想色彩空间的CRT显示器相匹配。当时大量的专业或者个人计算机软件,使用8位深度的图像文件,并且不经转换就在8位/通道的显示器上显示。许多时髦的非CRT硬件,如LCD、数字相机以及打印机,尽管本身并不生成sRGB曲线,但是都带有补偿电路或者软件以遵循这个标准。在一些高端的专业设备上可能并不遵循这个标准。因此,我们可以假定任何不带颜色配置表或者其它信息的8位图像文件、8位图像API或者设备接口,都处于sRGB色彩空间。

 

目录

综述[编辑]

sRGB定义了红色、绿色与蓝色三原色的颜色,即在其它两种颜色值都为零时该颜色的最大值。在CIE xy颜色坐标系中红色位于[0.6400, 0.3300]、绿色位于[0.3000, 0.6000]、蓝色位于[0.1500, 0.0600]、白色是位于[0.3127,0.3290]的D65。对于任何的RGB色彩空间来说,非负的R、G、B都不可能表示超出原色定义的三角形即色域范围,它刚好在人眼的色彩感知范围之内。

sRGB还定义了原色强度与实际保存的数值之间的非线性变换。这个曲线类似于CRT显示器的gamma响应。重现这条曲线要比sRGB图像在显示器上正确显示更加重要。这个非线性变换意味着sRGB非常高效地使图像文件中的整数值表示了人眼可以分辨的颜色。

sRGB由于它的色域不够大,尤其是蓝-绿颜色色域无法表示CMYK印刷中的所有颜色,所以通常印刷行业的专业人员不用这种模型。而Adobe RGB是印刷行业经常使用的色彩空间。

变换的规范[编辑]

从CIE xyY或者CIE XYZ到sRGB的前向变换[编辑]

[1]从CIE xyY坐标系计算sRGB中的三原色首先需要将它变换到CIE XYZ三值模式。

 X=Yx/y,\,

Z=Y(1-x-y)/y\,

这样XYZ值就可以用矩阵转换到线性的RGB值,这些线性值并不是最终的结果。

{\begin{bmatrix}R_{​{linear}}\\G_{​{linear}}\\B_{​{linear}}\end{bmatrix}}={\begin{bmatrix}3.2410&-1.5374&-0.4986\\-0.9692&1.8760&0.0416\\0.0556&-0.2040&1.0570\end{bmatrix}}{\begin{bmatrix}X\\Y\\Z\end{bmatrix}}

R l i n e a r {\displaystyle R_{linear}} R_{​{linear}}、G l i n e a r {\displaystyle G_{linear}} G_{​{linear}}与B l i n e a r {\displaystyle B_{linear}} B_{​{linear}}的取值范围为[0,1]。sRGB是反映真实世界gamma为2.2的典型显示器的效果,因此使用下面的变换公式将线性值转换到sRGB。设C l i n e a r {\displaystyle C_{linear}} C_{​{linear}}为R l i n e a r {\displaystyle R_{linear}} R_{​{linear}}、G l i n e a r {\displaystyle G_{linear}} G_{​{linear}}或者B l i n e a r {\displaystyle B_{linear}} B_{​{linear}},C s r g b {\displaystyle C_{srgb}} C_{​{srgb}}为R s r g b {\displaystyle R_{srgb}} R_{​{srgb}}、G s r g b {\displaystyle G_{srgb}} G_{​{srgb}}或者B s r g b {\displaystyle B_{srgb}} B_{​{srgb}}

  • 如果C_{​{linear}}<=0.00304\,C_{​{srgb}}=12.92C_{​{linear}}\,
  • 如果 C_{​{linear}}>0.00304\,C_{​{srgb}}=(1+a)C_{​{linear}}^{​{1/2.4}}-a\,
  •  a=0.055\,

这些经过gamma校正的值范围为0到1。如果需要0到255的取值范围,如用于视频显示或者8位图形,通常将它乘以255然后取整。

逆向变换[编辑]

假设sRGB分量的值R s r g b {\displaystyle R_{srgb}} R_{​{srgb}}、G s r g b {\displaystyle G_{srgb}} G_{​{srgb}}、B s r g b {\displaystyle B_{srgb}} B_{​{srgb}}的取值范围为0到1。

{\begin{bmatrix}X\\Y\\Z\end{bmatrix}}={\begin{bmatrix}0.4124&0.3576&0.1805\\0.2126&0.7152&0.0722\\0.0193&0.1192&0.9505\end{bmatrix}}{\begin{bmatrix}g(R_{​{srgb}})\\g(G_{​{srgb}})\\g(B_{​{srgb}})\end{bmatrix}}

其中

对于K > 0.04045  有g(K)=\left({\frac  {K+a}{1+a}}\right)^{\gamma }

否则 g(K)={\frac  {K}{12.92}}\,

变换的理论基础[编辑]

变换的非线性部分是为了逼近2.2的gamma校正而设计的,但是在K=0斜率不为0,这样可能会产生数值计算的问题。对于sRGB变换来说这大致正确。在K 0 {\displaystyle K_{0}} K_0处的g(K)为:

\left({\frac  {K_{0}+a}{1+a}}\right)^{\gamma }={\frac  {K_{0}}{\phi }}

使用上面的标准值 \phi =12.92,得到K K_0=0.04045...这就是常用的变换。如果我们要求斜率也要匹配,那么需要:

\gamma \left({\frac  {K_{0}+a}{1+a}}\right)^{​{\gamma -1}}\left({\frac  {1}{1+a}}\right)={\frac  {1}{\phi }}

这样就得到两个方程。假设未知变量为 K_0\phi,这样就得到K_0=0.03928...与\phi=12.9232.... sRGB规范中有时也使用这些值进行计算,但是它们并不属于标准的一部分。

应用[编辑]

作为因特网上推荐使用的色彩空间,在编辑、保存用于WWW的图像的时候要sRGB标准,但是由于与其它色彩空间相比它的色域较小,因此用于专业印刷的图像如印前输出则可以使用Adobe RGB那样有较大色域的色彩空间。在一些先进的硬件上的另外一种替代方法是仍然使用sRGB原色模式但是使用负值或者超过1的亮度,这样就可以无限扩大色域。

用其它色彩空间生成的用于因特网的图像在使用合适的图像编辑软件进行编辑的时候可以将它们转换成sRGB,这些软件有Corel Paint Shop Pro以及Adobe Photoshop等等。尽管最初的非sRGB文件可以保存并转换为sRGB,但是由于这个转换过程可能会丢失图像信息,所以建议保存为另外的文件以保存原始的非sRGB图像文件。

由于在因特网上的广泛应用,以及许多中低端的消费型数字相机扫描仪都使用sRGB模型作为缺省模式或者是仅有的色彩空间,同时由于喷墨打印机的应用,因此许多人认为sRGB色彩空间对于家庭应用来说已经足够了。

两种占据主导位置的三维图形编程接口OpenGLDirect3D都集成有sRGB。OpenGL 2.1中包含有首次在EXT_texture_sRGB扩展中引入的sRGB纹理。OpenGL的EXT_texture_sRGB扩展支持线性或者sRGB色彩空间的渲染缓冲。DirectX 9支持sRGB纹理以及用Direct3D渲染成sRGB表面。

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
提供的源码资源涵盖了Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!
### 回答1: 在 MATLAB 中,可以使用 `spectrumRGB` 函数将可见光光谱中的波长转换为其在 sRGB空间中的 RGB 值。以下是一个简单的示例: ```matlab % 定义波长范围和间隔 lambda_min = 380; % nm lambda_max = 780; % nm delta_lambda = 5; % nm % 计算波长数组和对应的 RGB 值 lambda = lambda_min:delta_lambda:lambda_max; rgb = spectrumRGB(lambda); % 绘制 RGB 值对应的色彩 figure; plot(lambda, rgb(:,1), 'r', lambda, rgb(:,2), 'g', lambda, rgb(:,3), 'b'); xlabel('波长 (nm)'); ylabel('RGB 值'); legend('R', 'G', 'B'); ``` 运行上述代码后,将得到一个可见光光谱的 RGB 值变化曲线,如下图所示: ![可见光光谱的 RGB 值变化曲线](https://img-blog.csdnimg.cn/20211019145719122.png) 可以看到,红、绿和蓝分量的数值在不同波长下有不同的变化趋势。根据实际需要,可以使用 `spectrumRGB` 函数计算出每个波长对应的 RGB 值,并将其用于可视化、图像处理等应用中。 ### 回答2: 在MATLAB中将可见光光谱中波长λ的光谱颜转换为其在sRGB空间中的RGB值,可以使用MATLAB的色彩映射函数或内置函数来完成。 在MATLAB中,可以使用色彩映射函数`interp1`来实现波长到RGB值的转换。首先,需要确定可见光光谱中各个波长的RGB值。这可以通过查找已有的光谱-色彩关联表或者使用物理模型进行计算得到。 假设我们已经得到了一个光谱-色彩关联表,其中包含了波长和对应的RGB值。接下来,使用`interp1`函数来将波长λ映射到RGB值的范围之间,具体步骤如下: 1. 将波长λ的范围映射到0到1之间,使用线性插值计算对应的RGB值。 2. 根据sRGB空间的要求,对RGB值进行Gamma校正,这可以使用内置函数`rgb2lin`实现。 3. 将Gamma校正后的RGB值乘以255,以得到0到255之间的整数值。 4. 最后,将RGB值作为数据显示在图像上。 以下是MATLAB代码的示例: ```matlab % 定义波长和对应的RGB值 wavelengths = [400, 500, 600, 700]; rgbValues = [0.0, 0.0, 1.0; % 波长400nm对应的RGB值 0.0, 1.0, 0.0; % 波长500nm对应的RGB值 1.0, 0.0, 0.0; % 波长600nm对应的RGB值 1.0, 1.0, 0.0]; % 波长700nm对应的RGB值 % 定义要转换的波长 lambda = 450; % 假设波长为450nm % 将波长映射到RGB值的范围之间 rgb = interp1(wavelengths, rgbValues, lambda, 'linear'); % Gamma校正 linRGB = rgb2lin(rgb); % 将RGB值转换为0到255的整数值 uint8RGB = linRGB * 255; % 创建一个1x1的图像,并显示RGB值 image(uint8RGB); axis off; ``` 通过以上步骤,我们可以将可见光光谱中波长λ的光谱颜转换为其在sRGB空间中的RGB值,并在MATLAB中进行显示。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值