📄
fe-share
  • fe-share
  • JavaScript
    • Canvas 图片处理
    • Javascript 性能
    • JavaScript 原型(2) - 原型与原型链
    • JavaScript 原型(1) - 构造函数
    • JavaScript - Promise
    • Canvas 灰度
    • ES6 解构赋值
    • Proxy
    • Object.defineProperty()简介
  • Engineering
    • 登录鉴权
    • 缓存
    • Chrome-devtools
    • Docker
    • 技术架构演化
    • Git
    • webpack
    • BS 架构与 CS 架构
    • SVN(Subversion)
    • gulp
    • 前端架构
  • MachineLearning
    • GAN生成对抗网络
    • 虚拟对抗训练
    • 深度度量学习
    • 原型网络
    • 联邦学习
    • 机器学习常见评价指标
    • Transformer算法
    • Self-attention 推荐算法
    • CNN 卷积神经网络
    • 集成学习算法
    • RNN循环神经网络
    • PyTorch安装和基本操作
  • CSS
    • 什么是BFC
  • React
    • React 生命周期
    • Hooks
    • SWR
    • React 数据流
  • 跨端
    • Flutter 介绍
  • Golang
    • Golang 基础
  • Vue
    • nextTick()的使用
    • vue-cli2.x 的使用与项目结构分析
    • Vue响应式原理及总结
    • VueX的使用
    • 记录一个问题的探索过程
  • Node
    • Node 优势
    • Node Stream
    • Node 模块系统
  • AR
    • SceneKit
由 GitBook 提供支持
在本页
  • 平均值
  • 基于人眼感知
  • 去饱和
  • 分解

这有帮助吗?

  1. JavaScript

Canvas 灰度

上一页JavaScript - Promise下一页ES6 解构赋值

最后更新于5年前

这有帮助吗?

原色是指不能透过其他颜色的混合调配而得出的“基本色”。一般来说叠加型的三原色是红色、绿色、蓝色,以不同比例将原色混合,可以产生出其他的新颜色。这套原色系统常被称为“RGB 色彩空间”,亦即由红(R)绿(G)蓝(B)所组合出的色彩系统。

当这三种原色以等比例叠加在一起时,会变成灰色;若将此三原色的强度均调至最大并且等量重叠时,则会呈现白色。灰度就是没有色彩,RGB 色彩分量全部相等。

平均值

Gray = (Red + Green + Blue) / 3

简单快速,从人眼的感知角度看,图片的灰度阴影和亮度方面做的还不够好

基于人眼感知

人的眼睛内有几种辨别颜色的锥形感光细胞,分别对黄绿色、绿色和蓝紫色的光最敏感。虽然眼球中的椎状细胞并非对红、绿、蓝三色的感受度最强,但是由肉眼的椎状细胞所能感受的光的带宽很大,红、绿、蓝也能够独立刺激这三种颜色的受光体。

人类对红绿蓝三色的感知程度依次是: 绿>红>蓝,所以平均算法从这个角度看是不科学的。应该按照人类对光的感知程度为每个颜色设定一个权重,它们的之间的地位不应该是平等的。

一个常用的计算方法是使用

Gray = (Red * 0.3 + Green * 0.59 + Blue * 0.11)

去饱和

为了更通俗易懂,有时我们选择 HLS 模型描述颜色,这三个字母分别表示 Hue(色调)、Saturation(饱和度)、Lightness(亮度)。色调,取值为:0 - 360,0(或 360)表示红色,120 表示绿色,240 表示蓝色,也可取其他数值来指定颜色。饱和度,取值为:0.0% - 100.0%,它通常指颜色的鲜艳程度。亮度,取值为:0.0% - 100.0%,黑色的亮度为 0。

去饱和的过程就是把 RGB 转换为 HLS,然后将饱和度设为 0。因此,我们需要取一种颜色,转换它为最不饱和的值。这个数学公式比本文介绍的更复杂,这里提供一个简单的公式,一个像素可以被去饱和通过计算 RGB 中的最大值和最小值的中间值:

Gray = ( Math.max(Red, Green, Blue) + Math.min(Red, Green, Blue) ) / 2

去饱和后,图片立体感减弱,但是更柔和

分解

分解算法可以认为是去饱和更简单一种的方式。分解是基于每一个像素的,只取 RGB 的最大值或者最小值

最大值分解:

Gray = Math.max(Red, Green, Blue)

最小值分解:

Gray = Math.min(Red, Green, Blue)
YUV 颜色空间理论