将RGB值转换为灰度值的简单算法


Posted in Javascript onOctober 09, 2019

RGB是如何转换为灰度的?这是让人困惑已久的一道难题。  

1、RGB复合通道转灰度:转换后的色阶值只与RGB空间有关,而与作为目的地的灰度空间无关。也就是说,只要当前的RGB空间不变,不管将灰度空间设置为哪种,转换后的色阶值都是一样的。

2、RGB中的单通道转灰度:转换后的色阶值不仅于RGB空间有关,而且还与作为目的地的灰度空间有关。但是,其灰度值K只于RGB色阶有关,而与RGB空间及灰度空间无关。其值与RGB色阶X的关系为:K=1-X/255

3、在RGB模式中,修改颜色设置中的RGB工作空间,将影响复合通道的外观和灰度K值,以及单通道的灰度值。但是,不会影响到单通道的外观。

4、在RGB模式中,如果修改颜色设置中的灰度空间,将影响到单色通道的外观以及单色通道、复合通道的灰度K值,但是,不会影响到复合通道的外观。

以上见解供大家讨论!

一、RGB向灰度转换的原理

RGB向灰度转换时,是以LAB模式为中介的(这和PS中关于LAB模式的一贯解释是完全吻合的)。其基本的流程是:首先将RGB转换为LAB,然后在LAB中去色,使A、B均为零,并依此生成一个RGB等值的灰阶,最后再根据该灰阶向灰度空间转换。

由此可见,转换为灰度的等值RGB只与原来的RGB空间有关,而与作为目标空间的灰度空间无关。

二、灰阶的计算

不同的RGB空间,灰阶的计算公式有所不同,常见的几种RGB空间的计算灰阶的公式如下:

1、简化 sRGB IEC61966-2.1 [gamma=2.20]

Gray = (R^2.2 * 0.2126  + G^2.2  * 0.7152  + B^2.2  * 0.0722)^(1/2.2)

2、 Adobe RGB (1998) [gamma=2.20]

Gray = (R^2.2 * 0.2973  + G^2.2  * 0.6274  + B^2.2  * 0.0753)^(1/2.2)

3、Apple RGB [gamma=1.80]

Gray = (R^1.8 * 0.2446  + G^1.8  * 0.6720  + B^1.8  * 0.0833)^(1/1.8)

4、ColorMatch RGB [gamma=1.8]

Gray = (R^1.8 * 0.2750  + G^1.8  * 0.6581  + B^1.8  * 0.0670)^(1/1.8)

5、简化 KODAK DC Series Digital Camera [gamma=2.2]

Gray = (R^2.2 * 0.2229  + G^2.2  * 0.7175  + B^2.2  * 0.0595)^(1/2.2)

三、灰度K的计算

由于RGB空间与灰度空间都有其相互独立的灰度系数(即GAMMA,设RGB空间的GAMMA为GAMMA1,灰度空间的GAMMA为GAMMA2),因此,就有了两种意义上的灰度K,一种是在RGB空间中相对于GAMMA1的灰度K1,另一种是转换到灰度空间后,相对于灰度空间GAMMA2的灰度K2(K2实际上就是经过GAMMA转换后的灰度)。灰度K与灰阶L的关系为:

K1=1-L/255

K2=K1^(GAMMA1/GAMMA2)=1-(L/255)^(GAMMA1/GAMMA2)

两点说明:

1、只要RGB空间与灰度空间的GAMMA值相等,即GAMMA1=GAMMA2,那么,K1=K2=1-L/255。

2、如何才能得知某一色彩空间的GAMMA值?先在“颜色设置”的工作空间中选定相应的工作空间,然后,再选择“自定义(RGB空间或灰度系数)”,在弹出的对话框中,其中的“灰度系数”就是刚才设定的工作空间的相应GAMMA值。

四、RGB中不同颜色通道转灰度的方式不同

1、复合通道转灰度

复合通道转灰度实际上就是整个图象转灰度。这种情况下,采用的是转换配置文件的方式:即在转换的过程中,保持颜色外观不变,而改变颜色数据。这里的颜色数据就是灰度K,颜色外观就是图象的外观显示以及与之相应的RGB值。

因此,复合通道转换为灰度后,其灰度值并不是K1,而是K2,这就是改变颜色数据的结果。对于一幅RGB等值的图象,在转换为灰度后,尽管灰度值发生了改变,但图象的外观显示及相应的RGB值却没有改变,这正是在转换过程中保留了颜色外观的结果。

2、单色通道转灰度

不仅可以将复合通道(即整幅图象)转换为灰度模式,也可以将某个单色通道转换为灰度模式。其实,当复制单色通道时,就是单色通道由RGB转为灰度的过程。与复合通道的转换不同的是,单色通道的转换是采用指定配置文件的方式:即在转换的过程中保持颜色的数据不变,颜色外观相应改变。

因此,当把单色通道复制为ALPHA通道时,通道的灰度值K1得以保留,但通道的颜色外观(包括外观显示及相应的灰阶值)却发生了变化。

3、单色通道的特殊显示

单色通道本身是一幅灰度图,按道理来讲,用灰度K来标识最为恰当不过,然而,单色通道又属于RGB模式的颜色通道,从这个方面来讲,用RGB值来表示单色通道最恰当不过了。面对这样一种两难的情形,PS采用了一种折中的显示方案,即颜色数据采用RGB空间中的RGB值,而外观则采用了转换为灰度后的相应外观。

4、识别信息调板中RGB颜色通道的灰度显示值

在信息调板中显示的各颜色通道的灰度值应该认真识别:

对于复合通道而言,显示的灰度值就是转换为灰度模式后的灰度K2;

对于单色通道而言,本来应该显示不经过伽玛转换的灰度值K1。但是,但面对一幅RGB等值的RGB图象时,却出现了复合通道与单色通道不等的情形,这种情形很容易给大家造成困惑。为了不至于让大家产生困惑,于是,PS使用了障眼术,偷偷地将本来的K1换成了经过伽玛转换后的K2。由此可见,信息调板中单色通道的灰度显示值是PS自欺欺人的一个把戏,大家千万不要被其蒙骗。

总之,对于大多数人而言,把RGB工作空间的GAMMA与灰度工作空间的GAMMA设置为等值是必要的。如果您这样做了,那么PS中好多看起来很让人困惑的事情根本就不会发生;否则,麻烦的事情很可能就会接踵而至,以至于让您一头雾水,不辩东西。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
使用jQuery的ajax功能实现的RSS Reader 代码
Sep 03 Javascript
自制的文件上传JS控件可支持IE、chrome、firefox etc
Apr 18 Javascript
jQuery读取XML文件内容的方法
Mar 09 Javascript
javascript实现继承的简单实例
Jul 26 Javascript
很全面的JavaScript常用功能汇总集合
Jan 22 Javascript
jQuery模拟360浏览器切屏效果幻灯片(附demo源码下载)
Jan 29 Javascript
JS实现设置ff与ie元素绝对位置的方法
Mar 08 Javascript
JQuery异步提交表单与文件上传功能示例
Jan 12 Javascript
基于$.ajax()方法从服务器获取json数据的几种方式总结
Jan 31 Javascript
jQuery实现文字超过1行、2行或规定的行数时自动加省略号的方法
Mar 28 jQuery
springMvc 前端用json的方式向后台传递对象数组方法
Aug 07 Javascript
vue iview实现动态新增和删除
Jun 17 Javascript
基于Vue 撸一个指令实现拖拽功能
Oct 09 #Javascript
解决Vue动态加载本地图片问题
Oct 09 #Javascript
Vue3 中的数据侦测的实现
Oct 09 #Javascript
vue3实现v-model原理详解
Oct 09 #Javascript
bootstrap+spring boot实现面包屑导航功能(前端代码)
Oct 09 #Javascript
使用Webpack提升Vue.js应用程序的4种方法(翻译)
Oct 09 #Javascript
微信小程序本地存储实现每日签到、连续签到功能
Oct 09 #Javascript
You might like
PHP中使用crypt()实现用户身份验证的代码
2012/09/05 PHP
php找出指定范围内回文数且平方根也是回文数的方法
2015/03/23 PHP
Laravel框架使用monolog_mysql实现将系统日志信息保存到mysql数据库的方法
2018/08/16 PHP
优化网页之快速的呈现我们的网页
2007/06/29 Javascript
jQuery 表格工具集
2010/04/25 Javascript
Javascript 面向对象 对象(Object)
2010/05/13 Javascript
对xmlHttp对象方法和属性的理解
2011/01/17 Javascript
asp.net刷新本页面的六种方法总结
2014/01/07 Javascript
jQuery实现列表自动滚动循环滚动展示新闻
2014/08/22 Javascript
JS动态修改表格cellPadding和cellSpacing的方法
2015/03/31 Javascript
javascript事件绑定学习要点
2016/03/09 Javascript
深入理解setTimeout函数和setInterval函数
2016/05/20 Javascript
实现点击下箭头变上箭头来回切换的两种方法【推荐】
2016/12/14 Javascript
详解Vue2+Echarts实现多种图表数据可视化Dashboard(附源码)
2017/03/21 Javascript
详解vue项目优化之按需加载组件-使用webpack require.ensure
2017/06/13 Javascript
jQuery除指定区域外点击任何地方隐藏DIV功能
2017/11/13 jQuery
JS阻止事件冒泡的方法详解
2019/08/26 Javascript
Python列表(list)、字典(dict)、字符串(string)基本操作小结
2014/11/28 Python
Python基于二分查找实现求整数平方根的方法
2016/05/12 Python
python bmp转换为jpg 并删除原图的方法
2018/10/25 Python
python实现的分层随机抽样案例
2020/02/25 Python
基于python检查SSL证书到期情况代码实例
2020/04/04 Python
Python logging日志模块 配置文件方式
2020/07/12 Python
Python Selenium自动化获取页面信息的方法
2020/08/31 Python
Python用摘要算法生成token及检验token的示例代码
2020/12/01 Python
python中K-means算法基础知识点
2021/01/25 Python
HTML5不支持标签和新增标签详解
2016/06/27 HTML / CSS
中药专业毕业自荐书范文
2014/02/08 职场文书
家长会主持词开场白
2014/03/18 职场文书
大学生社会实践评语
2014/04/25 职场文书
法制宣传标语集锦
2014/06/25 职场文书
宾馆仓管员岗位职责
2014/07/27 职场文书
2015年世界急救日宣传活动方案
2015/05/06 职场文书
教育教学读书笔记
2015/07/02 职场文书
golang interface判断为空nil的实现代码
2021/04/24 Golang
为自由献出你的心脏!「进击的巨人展 FINAL」2022年6月在台开展
2022/04/13 日漫