作者:❄️固态二氧化碳❄️ (主页)
链接:(原创)[短小精悍系列]RGB(RGI/RGV)颜色明度(亮度)计算公式 (又称灰度公式,彩色照片转黑白照片时能派上用场) - 固态二氧化碳的博客 - CSDN博客
来源:CSDN博客
发表时间:2019年09月25日 10:37:23
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

先上公式:
L=k(R255)2.2+(1.5G255)2.2+(0.6B255)2.22.2L=k\sqrt[2.2]{(\frac{R}{255})^{2.2}+(1.5\frac{G}{255})^{2.2}+(0.6\frac{B}{255})^{2.2}}L=k2.2(255R​)2.2+(1.5255G​)2.2+(0.6255B​)2.2​
其中k=11+1.52.2+0.62.22.2≈0.547373k=\sqrt[2.2]{\frac{1}{1+1.5^{2.2}+0.6^{2.2}}}≈0.547373k=2.21+1.52.2+0.62.21​​≈0.547373
L取值范围为0∼10\sim10∼1,黑色L=0L=0L=0,白色L=1L=1L=1

友情提示:现在网上大多数计算公式(诸如0.30R+0.59G+0.11B之类的)都是错的,因为它们连最基本的gamma校正都没考虑进去,结果自然会错得十分离谱。看到这类形式十分简单,只有加法和乘法,连根号都不带的公式,一律都是错的!

  目前绝大多数电脑,手机,平板,电视等电子设备使用sRGB色彩空间。观测表明,在大部分使用sRGB色彩空间的显示器上,红(R),绿(G),蓝(B)三原色的亮度(心理亮度)比为1:1.5:0.6\color{#0080FF}1:1.5:0.61:1.5:0.6,也就是说,RGB三分量数值为1:23:531:\frac{2}{3}:\frac{5}{3}1:32​:35​,即3:2:53:2:53:2:5时,亮度相等,对应的十六进制值分别为#990000,#006600,#0000FF(不同显示器显示效果可能会有偏差,也可能同一台显示器因为调整过色温而导致误差,但大概八九不离十,这里的比值是根据大量显示器显示效果统计得来的平均值)。换句话说,三原色在计算机中的值相等时(如均为255),其实际强度大小并非严格相等,而是存在一定的比例关系
  至于原因嘛,那就是三原色配比成白色的问题了,又叫白平衡。如果三原色亮度严格按照1:1:1配比,那么颜色就会明显偏冷,就像这样一个颜色:#DDCCFF,一种偏蓝紫色的颜色,这是因为我们对冷色光(高频光,蓝紫色光)太过于敏感,而对暖色光(低频光)敏感性则略逊一筹,这里所说的敏感指的是光对色度的影响,即混入一种光后对色度图上颜色坐标的影响程度。打个很简单的比方,红色和蓝色叠加得到的紫色更偏向于冷色(蓝色),而不是暖色(红色)。再比如,白色中缺少一点点红色的冰蓝色(#CCFFFF)和白色中缺少一点点蓝紫色的淡黄色(#FFFFCC),明显前者更接近白,后者则太黄,如果放在手机上面,两者就是所谓的"冷屏"和"暖屏",说得不好听一点,后者就是传说中的"shi黄屏"。
  所以为了避免这个问题,三原色的配比不能严格按照1:1:1,而是红绿色要比蓝紫色多,才能保证生成完美的白色,也就是不冷不暖的白色,因为人眼对于冷色太过于敏感。这也就导致了RGB(RGI/RGV)中三原色的亮度不一致,绿色亮度比较大,红色适中,而蓝紫色(靛色)则明显偏小。为了合成出真正的蓝色,我们需要在蓝色分量(B)中加入适量的绿色分量(G),这样既把原来偏紫的蓝变正宗了,而且亮度也变大了。所以在RGB(RGI/RGV),正宗的蓝色对应的色相为210°,而不是240°,这一点我在之前的文章已经说过了。
  最后一点,刚才我所说的"亮度"指的都是心理亮度,但是还有一种亮度,称为"物理亮度",这是怎么回事呢?原来,物理亮度由功率决定,与功率成正比,而人眼对亮度的感知与功率并不成正比,而是幂函数的关系,这个函数的指数我们通常称作伽马(gamma)值,符号为γ。如果我们把物理亮度记为LpL_pLp​,心理亮度记为LLL,则有Lp=LγL_p=L^γLp​=Lγ,而大量研究表明,这个伽马值通常在1.8~2.6之间,在绝大多数发光设备上,这个值取的是2.2,所以我们有Lp=L2.2L_p=L^{2.2}Lp​=L2.2。而我们常说的RGI三分量的大小对应的是心理亮度,虽然有极少数用物理亮度表示,通常把前者称为Gamma(非线性)空间,后者称为线性空间。关于线性和非线性空间的知识,我会在以后的博文重点讲解的。
  而色光亮度的合成是遵循物理亮度(线性空间)的,并非心理亮度,而最后合成得到的亮度又要换算成心理亮度。而之前我们有,RGB三原色心理亮度比为1:1.5:0.61:1.5:0.61:1.5:0.6,故物理亮度比为1:1.52.2:0.62.21:1.5^{2.2}:0.6^{2.2}1:1.52.2:0.62.2。因此对于某种颜色的亮度(心理亮度),我们有
L2.2=k2.2[(R255)2.2+(1.5G255)2.2+(0.6B255)2.2]L^{2.2}=k^{2.2}[(\frac{R}{255})^{2.2}+(1.5\frac{G}{255})^{2.2}+(0.6\frac{B}{255})^{2.2}] L2.2=k2.2[(255R​)2.2+(1.5255G​)2.2+(0.6255B​)2.2]  规定白色的亮度为1,则1=k2.2(1+1.52.2+0.62.2)1=k^{2.2}(1+1.5^{2.2}+0.6^{2.2})1=k2.2(1+1.52.2+0.62.2)
  解得k=11+1.52.2+0.62.22.2≈0.547373k=\sqrt[2.2]{\frac{1}{1+1.5^{2.2}+0.6^{2.2}}}≈0.547373k=2.21+1.52.2+0.62.21​​≈0.547373
  将前面的长式子两边开2.2次方,得
L=k(R255)2.2+(1.5G255)2.2+(0.6B255)2.22.2L=k\sqrt[2.2]{(\frac{R}{255})^{2.2}+(1.5\frac{G}{255})^{2.2}+(0.6\frac{B}{255})^{2.2}} L=k2.2(255R​)2.2+(1.5255G​)2.2+(0.6255B​)2.2​  噫,大家发现了什么吗?如果把R255\frac{R}{255}255R​,1.5G2551.5\frac{G}{255}1.5255G​,0.6B2550.6\frac{B}{255}0.6255B​看成一个整体,这公式和勾股定理长得贼像!只不过指数由2变成2.2(伽马值),外面还有个系数k没乘进去。而这三个整体,把根号外面的k乘进去后,反映的正是三个分量对应的亮度!看来,光的(心理)亮度的合成是遵循"勾股定理"的,只不过指数变成了2.2,我们姑且把它称之为"类勾股定理"吧!(其实,在数学上,这个玩意叫范数,通俗地说,指数为p的"勾股定理"对应的就是p-范数。比如说欧氏几何的勾股定理就是2-范数,而刚才所说的亮度的合成,就是2.2-范数)。利用这个定理,我们就可以解释为什么红色(L=kL=kL=k)和绿色(L=1.5kL=1.5kL=1.5k)合成的黄色的亮度并不是2.5k2.5k2.5k,显著高于绿色,而是1.75345k1.75345k1.75345k,与绿色亮度相差无几,类比勾股定理,你就可以很直观地去理解它了。
  在以后的文章中,我还会继续利用"勾股定理"这个思想去解决关于亮度的问题的。

  最后,附上算法代码(C语言)。共两个函数,lightness函数返回亮度值(0~1),rgb2gray函数返回灰度值(0~255)

#include <math.h>
typedef unsigned char uint8;const float k=0.547373141f;float lightness(uint8 R,uint8 G,uint8 B)
{return pow(pow(R/255.0f,2.2f)+pow(G/170.0f,2.2f)+pow(B/425.0f,2.2f),1/2.2f)*k;
}uint8 rgb2gray(uint8 R,uint8 G,uint8 B)
{return (uint8)(pow(pow(R,2.2f)+pow(G*1.5f,2.2f)+pow(B*0.6f,2.2f),1/2.2f)*k);
}

  将彩色照片转换成黑白照片时,只需将每一个像素点的亮度值乘上255即可得到其等价灰度值,即黑白照片中RGB三个分量共同的值

(原创)[短小精悍系列]RGB(RGI/RGV)颜色明度(亮度)计算公式 (又称灰度公式,彩色照片转黑白照片时能派上用场)相关推荐

  1. (原创)[短小精悍系列]为什么生活中黄色物品给人感觉较亮,而蓝色物品给人感觉较深?其实你只看到了表象

    原文地址:https://blog.csdn.net/weixin_44938037/article/details/105901878 转载请注明出处.   这篇文章中,我来谈谈日常生活中的&quo ...

  2. 基于明度(亮度)和RGB通道方差的异常图片检测:筛除病理切片的组织液、肌肉和纯色区域(深色、亮色图片检测)

    基于明度和RGB通道方差的异常图片检测:筛除病理切片中的组织液.肌肉和纯色区域(深色.亮色图片检测) 问题描述 在全视野病理切片(WSI)的预处理中,将WSI切割成patch是其中非常重要的环节.最近 ...

  3. canvas系列教程之填充颜色

    艺术离不开色彩,今天咱们来介绍一下填充颜色,体会一下色彩的魅力. 填充颜色主要分为两种: 基本颜色 渐变颜色(又分为线性渐变与径向渐变) 我们一个个来看. 填充基本颜色 Canvas fillStyl ...

  4. Photoshop插件-色调-颜色/明度-脚本开发-PS插件

    文章目录 1.插件界面 2.关键代码 2.1 色调 2.2 颜色/明度 3.代码转执行 4.作者答疑   PS是一款栅格图像编辑软件,模块众多.提供了脚本,动态连接库等多种扩展机制,本文演示如何通过脚 ...

  5. python使用matplotlib可视化、使用英文单次或者缩写指定使用的颜色、使用16进制的RGB字符串指定颜色、使用RGB或者RGBA数字元组指定颜色

    python使用matplotlib可视化.使用英文单次或者缩写指定使用的颜色.使用16进制的RGB字符串指定颜色.使用RGB或者RGBA数字元组指定颜色 目录

  6. rgb颜色分量的旋转_RGB分量之偏色与彩色图片转黑白

    颜色对于制作脚本来说是至关重要的,找图找字找色都需要使用到颜色.所以,对颜色的认识是也是非常重要的. 颜色知识大解剖 [ 颜色是由三原色混合形成的] * 即红.绿.蓝.三原色可以混合出所有的颜色. * ...

  7. 树莓派c语言led,用树莓派实现RGB LED的颜色控制——C语言版本号

    用树莓派实现RGB LED的颜色控制 RGB色彩模式是工业界的一种颜色标准.是通过对红(R).绿(G).蓝(B)三个颜色通道的变化以及它们相互之间的叠加来得到各式各样的颜色的,RGB即是代 表红.绿. ...

  8. python rgb led控件_Raspberry Pi-用树莓派实现RGB LED的颜色控制——Python版本-电路城论坛 - 电子工程师学习交流园地...

    用树莓派实现RGB LED的颜色控制 RGB色彩模式是工业界的一种颜色标准,是通过对红(R).绿(G).蓝(B)三个颜色通道的变化以及它们相互之间的叠加来得到各式各样的颜色的,RGB即是代 表红.绿. ...

  9. 基于Android的rgb七彩环颜色采集器

    代码地址如下: http://www.demodashi.com/demo/11892.html 一.前言. 在大学期间,看到这个rgb灯,蛮好奇的,这么漂亮的颜色采集,并且可以同步到设备rbg灯颜色 ...

最新文章

  1. ListView和GridView的一些杂七八杂的内容
  2. 电梯调度算法 软工 Pair Project
  3. 第四课:PHP 变量
  4. LwIP 之五 详解动态内存管理 内存堆(mem.c/h)
  5. postman cookie设置_是时候抛弃Postman了,因为REST Client更香
  6. 接口管理平台YApi
  7. 成功跳槽百度工资从15K涨到28K,已整理成文档
  8. 【生活科普】这7个影视剧的经典桥段,骗了我们很多年……
  9. K线理论--单根K线形态
  10. STA 137 Topics covered this week
  11. Netsharp快速入门(之2) 基础档案(之A 创建插件和资源)
  12. java并行计算Fork和Join的使用
  13. SCOM2012功能测试(18)—对象发现(替代)
  14. linux 下strstr函数,Linux中strchr与strstr函数实现。
  15. Flutter之Redux框架入门
  16. wget php mirror 地址,wget命令镜像网站
  17. 各主板黑苹果dsdt补丁_苹果系统发展简史
  18. 如果有人问你 SQL 注入的资料,请叫他看这份速查表
  19. filp/whoops初体验
  20. case/casez/casex 的区分与使用

热门文章

  1. 让女朋友说Yes I Do的方法,数据分析助力客户管理的秘籍
  2. python are you ready_如果要检查recv_ready(),是否必须检查exit_status_ready?
  3. HTML制作简单的页面
  4. JavaScript高级04 正则表达式
  5. 肿瘤特异性抗原行业调研报告 - 市场现状分析与发展前景预测(2021-2027年)
  6. firefoxos gaia 开发环境
  7. DNS解析与CDN加速
  8. python 绘制椭圆
  9. CCF-CSP 201612-1 中间数
  10. 手把手教您用虹科MatrikonOPC UA数据平台掌握您所有的UA服务器