前言

最近因为涉及到一个算色规则,其中需要把RGB转HSB的要求,所以自己研究了下,故此记录下。

什么是RGB?

RGB表示红色(R)、绿色(G)、蓝色(B),又称为三原色光。它是通过对三个颜色通道的变化以及它们相互之间的叠加来得到各式各样的颜色的,RGB即是代表红、绿、蓝三个通道的颜色,这个标准几乎包括了人类视力所能感知的所有颜色,是目前运用最广的颜色系统之一。

什么是HSB?

在HSB模式中,H(hues)表示色相、S(saturation)表示饱和度、B(brightness)表示亮度。 HSB模式对应的媒介是人眼。

既然有了RGB,为何还需要HSB?

我们知道人眼所能看见的颜色都可以通过三原色RGB混合获得,其每个颜色分量分别为红(R)、绿(G)、蓝(B)。然而这只是颜色一种表示方法,这种表示方法非常适合机器却非常的反人性。人们在拾取颜色的时候通常其脑海中的思考过程是:

什么颜色?鲜艳不鲜艳?亮还是暗?

因此为了在拾取颜色过程中更加符合人的思考过程,HSB诞生了。HSB只是RGB颜色空间的另一种表示方法,因此两者所表示的颜色空间大小是一致的。

此外HSB也称之为HSV,两者均指同一个东西,之所以有两种称呼,其原因可能是为了避免在某些上下文中认为HSB中的B字母和RGB中的B字母是同一个含义吧!

RGB转换HSB公式

注:其中max是RGB三个颜色分量中最大的那一个,同理min的含义是RGB三个颜色分量中最小的那一个,因为HSB等价于HSV,因此为了和RGB中的B进行区别,在公式里面,字母V等价于HSB中的B。

根据上述公式得出:

DEMO(PHP)

<?php/*** RGB转换HSB(HSV)* RGB input  values: 0-255, 0-255, 0-255* HSB output values: 0-360, 0-100, 0-100* * @param  int $red   * @param  int $green * @param  int $blue* @return array*/
function rgbToHsb($red, $green, $blue) { $rgb = array($red, $green, $blue);$max = max($rgb);$min = min($rgb);$diff = $max - $min;/* 计算色相 */$hue = 0;if ($max == $min) {$hue = 0;} else if ($max == $red && $green >= $blue) {$hue = 60 * (($green - $blue) / $diff);} else if ($max == $red && $green < $blue) {$hue = 60 * (($green - $blue) / $diff) + 360;} else if ($max == $green) {$hue = 60 * (($blue - $red) / $diff) + 120;} else if ($max == $blue) {$hue = 60 * (($red - $green) / $diff) + 240;}/* 计算饱和度 */if ($max == 0) {$saturation = 0;} else {$saturation = (1 - $min / $max) * 100;}/* 计算色调 */$value = $max / 255 * 100; return [$hue, $saturation, $value];
}

DEMO(JAVA)

 public static float[] rgbToHsb(int rgbR, int rgbG, int rgbB) {assert 0 <= rgbR && rgbR <= 255;assert 0 <= rgbG && rgbG <= 255;assert 0 <= rgbB && rgbB <= 255;int[] rgb = new int[] { rgbR, rgbG, rgbB };Arrays.sort(rgb);int max = rgb[2];int min = rgb[0];float hsbB = max / 255.0f * 100f;float hsbS = max == 0 ? 0 : (max - min) / (float) max * 100f;float hsbH = 0;if (max == rgbR && rgbG >= rgbB) {hsbH = (rgbG - rgbB) * 60f / (max - min);} else if (max == rgbR && rgbG < rgbB) {hsbH = (rgbG - rgbB) * 60f / (max - min) + 360;} else if (max == rgbG) {hsbH = (rgbB - rgbR) * 60f / (max - min) + 120;} else if (max == rgbB) {hsbH = (rgbR - rgbG) * 60f / (max - min) + 240;}return new float[] { hsbH, hsbS, hsbB };}

php: RGB 转 HSB(HSV)相关推荐

  1. JS实现RGB,HSL,HSB相互转换

    前言 最近呢,在写色彩选择器小插件的时候需要用到RGB,HSL,HSB相互转换的一些东西,就想着好好整理一下这方面的内容,顺便用js实现一下三者之间的转换,通过对色彩转换的学习,对平时整整ps,摄影也 ...

  2. HSB/HSV/HSL区别

    三种颜色模式的H都是指色彩(Hue),S指饱和度(Saturation): HSB/HSV/HSL中的B/V/L都指亮度,分别为英文单词Brightness/Value/Lightness; 三种颜色 ...

  3. RGB与HSB之间转换

    先来了解一些概念: 1.RGB是一种加色模型,就是将不同比例的Red/Green/Blue混合在一起得到新颜色.通常RGB颜色模型表示为: 2.HSB(HSV) 通过色相/饱和度/亮度三要素来表达颜色 ...

  4. RGB转换HSL,HSV及切割车牌

    目录 HSL和HSV 简介 对比 RGB与HSL HSV相互转换 RGB->HSL HSV HSL->RGB HSV->RGB 一.图片颜色转换 1.转换为灰度图 2.转化为HSV ...

  5. RGB色彩空间和HSV色彩空间的理解

    RGB色彩空间和HSV色彩空间的理解 本文的结构如下: 1.RGB色彩空间 2.HSV色彩空间(附HSV颜色分量范围表) 3.RGB到HSV的转换的Demo   使用OpenCV实现RGB转HSV,并 ...

  6. RGB值转换HSV的值

    背景:大量的实验已经证明,在HSV色彩空间比RGB色彩空间更容易找到自己想要的颜色,所以在做目标跟踪的时候,往往会把色彩空间从RGB空间转换为HSV空间,然后设定好自己的颜色范围值去寻找即可.但是,有 ...

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

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

  8. RGB,CMYK,HSB各种颜色表示的转换

    一.表示颜色的方式有很多种,如RGB,CMYK,HSB,Hex等等 1.RGB:这种表示颜色由三原色构成,通过红,绿,蓝三种颜色分量的不同,组合成不同的颜色,例如,100%红+100%绿混合可以得到黄 ...

  9. HSI, HSV,RGB,HSL,HSB,CMYK ,Ycc,XYZ,Lab,YUV空间的区别

    HSV颜色空间   HSV(hue,saturation,value)颜色空间的模型对应于圆柱坐标系中的一个圆锥形子集,圆锥的顶面对应于V=1. 它包含RGB模型中的R=1,G=1,B=1 三个面,所 ...

最新文章

  1. 2021年大数据Spark(十二):Spark Core的RDD详解
  2. Utils.toDip()的用法
  3. redis 上亿数据_票房上亿,稳居第一?肖战《诛仙》日本上映,真实数据到底怎样...
  4. (WPF) DataGrid之绑定
  5. AjaxPro使用说明
  6. 感叹号挖孔屏稳了!iPhone 14 Pro高清概念图曝光:屏占比创5年最高
  7. Linux学习总结(2)——linux常用命令大全
  8. MFC工作笔记0009---VC++中 PostMessage和SendMessage的区别
  9. 昇腾 AI 成就了一群玩船模的大学生——创新,有“模”有 Young
  10. mac搜索不到wifi wtg_如何设置隐藏wifi 防止蹭网隐藏wifi方法【详解】
  11. 即时与及时有什么区别_即时与及时有什么区别?
  12. php 鼠标 移动 手型,css各种手型集合(css禁止手型)
  13. redis基数树rax源码分析(1)
  14. 微信小程序真机调试手机端在无法连接电脑localhost:3000时如何调试解决办法
  15. 如何将树莓派网关连接到TTN——手把手教你如何将树莓派网关连接到服务器之第四篇
  16. MySQL数据库基本管理
  17. java面试题怎么背?java面试题有哪些?
  18. Linux-centos-7安装
  19. 转贴:谁说我会画板?
  20. 太极英语笔记-前传语法-代词

热门文章

  1. 用JS写一个《俄罗斯方块》小游戏
  2. 我真的不懂路由器和交换机的区别
  3. 通过Excel VBA对序列实现自动分级
  4. 企业微信如何设置通讯录权限?
  5. OI模板 卢卡斯定理
  6. 声学的一些基本知识(1)
  7. win32 opengl画线
  8. 导入下载excel(还有excel多个sheet)和txt文本的方法
  9. 如何查看计算机是否新装了硬盘,如何查看笔记本电脑换固态硬盘 判断笔记本电脑是否可换固态硬盘的技巧...
  10. 复利单利计算的源代码