RGB HSI HSV HSB HSL

HSI:色相(hue),饱和度(saturation),亮度(Intensity),这种模型完全对应于RGB模型转化而来,转化也有严格的公式推导得到,网上提供了几种转化公式的表示方法:

HSV:色相(hue),饱和度(saturation),明度(value),也称HSB(brightness)。

HSL:色相(hue),饱和度(saturation),亮度(luminance)。

上面这两种模型各个意义也不完全一样,它们的意义对应于它们各自的建模方式。其中HSV/HSB来自于Lab建模方式并考虑了人眼的影响之后得到的。

通用的RGB转HSV/HSB公式如下:详细的原理还未弄清楚

  R,G,B的取值范围是[0, Cmax],未作归一化的Cmax的值为255。Chigh = max(R,G,B),Clow = min(R,G,B),Crng = Chigh - Clow

饱和度:

  if(Chigh > 0) S = Crng / Chigh else S = 0

明度:

  V = Chigh / Cmax

色调:

  if(Crng == 0)此时饱和度S == 0,为灰度图,色调因此无定义。

  else

  先将各分量归一化:R = (Chigh - R) / Crng   G = (Chigh - G) / Crng   B‘ = (Chigh - B) / Crng

  基于原始颜色分量中的最大值,计算出一个初步的色调H‘:

    if(R = Chigh) H‘ = B‘ - G‘ ; else if(G = Chigh) H‘ = R‘ - B‘ + 2; else if(B = Chigh) H‘ = G‘ - R‘ + 4;

  由上式可知H‘的取值区间为[-1, 5],通过将其归一化到区间[0, 1]得到最终的色调值:

  if(H‘ < 0) H = 1/6 * (H‘ + 6) else H = 1/6 * H‘

三个分量值都位于区间[0, 1]。

代码如下:来自于JDK java.awt.Color类

public static float[] RGBtoHSB(int r, int g, int b, float[] hsbvals) {
        float hue, saturation, brightness;
        if (hsbvals == null) {
            hsbvals = new float[3];
        }
        int cmax = (r > g) ? r : g;
        if (b > cmax) cmax = b;
        int cmin = (r < g) ? r : g;
        if (b < cmin) cmin = b;

brightness = ((float) cmax) / 255.0f;
        if (cmax != 0)
            saturation = ((float) (cmax - cmin)) / ((float) cmax);
        else
            saturation = 0;
        if (saturation == 0)
            hue = 0;
        else {
            float redc = ((float) (cmax - r)) / ((float) (cmax - cmin));
            float greenc = ((float) (cmax - g)) / ((float) (cmax - cmin));
            float bluec = ((float) (cmax - b)) / ((float) (cmax - cmin));
            if (r == cmax)
                hue = bluec - greenc;
            else if (g == cmax)
                hue = 2.0f + redc - bluec;
            else
                hue = 4.0f + greenc - redc;
            hue = hue / 6.0f;
            if (hue < 0)
                hue = hue + 1.0f;
        }
        hsbvals[0] = hue;
        hsbvals[1] = saturation;
        hsbvals[2] = brightness;
        return hsbvals;
    }

HSB/HSV转RGB的介绍不给出,直接给出java.awt.Color类中的转换代码

  public static int HSBtoRGB(float hue, float saturation, float brightness) {
        int r = 0, g = 0, b = 0;
        if (saturation == 0) {
            r = g = b = (int) (brightness * 255.0f + 0.5f);
        } else {
            float h = (hue - (float)Math.floor(hue)) * 6.0f;
            float f = h - (float)java.lang.Math.floor(h);
            float p = brightness * (1.0f - saturation);
            float q = brightness * (1.0f - saturation * f);
            float t = brightness * (1.0f - (saturation * (1.0f - f)));
            switch ((int) h) {
            case 0:
                r = (int) (brightness * 255.0f + 0.5f);
                g = (int) (t * 255.0f + 0.5f);
                b = (int) (p * 255.0f + 0.5f);
                break;
            case 1:
                r = (int) (q * 255.0f + 0.5f);
                g = (int) (brightness * 255.0f + 0.5f);
                b = (int) (p * 255.0f + 0.5f);
                break;
            case 2:
                r = (int) (p * 255.0f + 0.5f);
                g = (int) (brightness * 255.0f + 0.5f);
                b = (int) (t * 255.0f + 0.5f);
                break;
            case 3:
                r = (int) (p * 255.0f + 0.5f);
                g = (int) (q * 255.0f + 0.5f);
                b = (int) (brightness * 255.0f + 0.5f);
                break;
            case 4:
                r = (int) (t * 255.0f + 0.5f);
                g = (int) (p * 255.0f + 0.5f);
                b = (int) (brightness * 255.0f + 0.5f);
                break;
            case 5:
                r = (int) (brightness * 255.0f + 0.5f);
                g = (int) (p * 255.0f + 0.5f);
                b = (int) (q * 255.0f + 0.5f);
                break;
            }
        }
        return 0xff000000 | (r << 16) | (g << 8) | (b << 0);
    }

RGB转HSL

色调:

  同HSV

亮度:

  L = (Chigh + Clow) / 2

饱和度:

  if(L == 0) S = 0; else if( 0<L<=0.5 ) S = 0.5 * Crng / L; else if(0.5 < L < 1) S = 0.5 * Crng / (1 - L); else if(L == 1) S = 0;

	static float[] RGBtoHLS(float R, float G, float B){
		float cHi = Math.max(R, Math.max(G, B));
		float cLo = Math.min(R, Math.min(G, B));
		float cRng = cHi - cLo;
		//计算亮度L
		float L = (cHi + cLo) / 2;
		//计算饱和度S
		float S = 0;
		if(0 < L && L < 1){
			float d = (L <= 0.5f) ? L : (1 - L);
			S = 0.5f * cRng / d;
		}

		//计算色调H
		float H = 0;
		if(cRng > 0){
			float rr = (float)((cHi - R) / cRng);
			float gg = (float)((cHi - G) / cRng);
			float bb = (float)((cHi - B) / cRng);

			float hh = 0;
			if(R == cHi)hh = bb - gg;
			else if(G == cHi)hh = rr - bb + 2;
			else if(B == cHi)hh = gg - rr + 4;
			if(hh < 0)hh = hh + 6;
			H = hh / 6;
		}
		return new float[]{H, L, S};
	}

HSL转RGB代码如下:

	static float[] HLStoRGB(float H, float S, float L){
		//假设HSL在[0, 1]区间
		float R = 0;
		float G = 0;
		float B = 0;

		if(L <= 0)R = G = B = 0;
		else if(L >= 1) R = G = B = 1;
		else{
			float hh = (6 * H) % 6;
			int c1 = (int)hh;
			float c2 = hh - c1;
			float d = (L <= 0.5f) ? (S * L) : (S * (1 - L));
			float w = L + d;
			float x = L - d;
			float y = w - (w - x) * c2;
			float z = w + (w - x) * c2;
			switch(c1){
			case 0: R = w; G = z; B = x; break;
			case 1: R = y; G = w; B = x; break;
			case 2: R = x; G = w; B = z; break;
			case 3: R = x; G = y; B = w; break;
			case 4:	R = z; G = x; B = w; break;
			case 5: R = w; G = x; B = y; break;
			}
		}
		return new float[]{R, G, B};
	}
时间: 2024-10-08 05:16:39

RGB HSI HSV HSB HSL的相关文章

RGB、HSV、HSI颜色空间

概述 这篇博客主要介绍RGB.HSV和HSI颜色空间以及转换公式. RGB颜色空间 定义 RGB颜色空间通常用于显示器系统,例如:电脑.电视机的显示器使用的都是RGB颜色空间.利用物理学中的三原色叠加原理,可以产生各种颜色.在RGB颜色空间中,R.G.B各颜色分量彼此独立. RGB颜色空间的缺点在于不符合人眼的视觉特性,直接处理多有不便,因此通常需要转换到其他颜色空间进行处理,最后再转换到RGB颜色空间,用于显示器显示. 数学模型 RGB颜色空间中,R.G.B三个分量彼此独立,所能表示的范围也相

Atitit &#160;rgb yuv &#160;hsv HSL 模式和 HSV(HSB) 图像色彩空间的区别

Atitit  rgb yuv  hsv HSL 模式和 HSV(HSB) 图像色彩空间的区别 1.1. 色彩的三要素 -- 色相.明度.纯度1 1.2. YUV三个字母中,其中"Y"表示明亮度(Lumina nce或Luma),也就是灰阶值:而"U"和"V"表示的则是色度(Chrominance或Chroma)2 1.3. HSB 和 HSV 是是一样的,只是叫法不同,HSL 则还有一些细微的区别:2 2. RGB 是对机器很友好的色彩模式,但

opencv_图像的色彩空間cvtColor(HSV、HSL、HSB )及相关色彩学

一.色彩空间理论 几种色彩空间: 1.RGB Red 红色,0-255 Green 绿色,0-255 Blue 蓝色,0-255  2.HSI HSI色彩空间可以用一个圆锥空间模型来描述.用这种 描述HIS色彩空间的圆锥模型相当复杂,但确能把色调.亮度和色饱和度的变化情形表现得很清楚. 通常把色调和饱和度通称为色度,用来表示颜色的类别与深浅程度.由于人的视觉对亮度的敏感 程度远强于对颜色浓淡的敏感程度,为了便于色彩处理和识别,人的视觉系统经常采用HSI色彩空间, 它比RGB色彩空间更符合人的视觉

颜色空间RGB与HSV(HSL)的转换

转自:http://blog.csdn.net/jiangxinyu/article/details/8000999 一般的3D编程只需要使用RGB颜色空间就好了,但其实美术人员更多的是使用HSV(HSL),因为可以方便的调整饱和度和亮度. 有时候美术需要程序帮助调整饱和度来达到特定风格的渲染效果,这时候就需要转换颜色空间了. 出处:http://zh.wikipedia.org/wiki/HSL%E5%92%8CHSV%E8%89%B2%E5%BD%A9%E7%A9%BA%E9%97%B4 H

RGB、CMY、HSV、HSL颜色空间

1.颜色空间(又称彩色模型.色彩空间. 彩色系统等)是对色彩的一种描述方式,定义有很多种,区别在于面向不同的应用背景. 颜色空间的应用背景: 显示器中采用的RGB颜色空间是基于物体发光定义的(RGB对应光的三原色:Red,Green,Blue): 工业印刷中常用的CMY颜色空间是基于光反射定义的(CMY对应了绘画中的三原色:Cyan,Magenta,Yellow): HSV.HSL两个颜色空间都是从人视觉的直观反映而提出来的(H是色调,S是饱和度,I是强度). 2.RGB颜色空间 基于颜色的加法

RGB与HSV之间的转换公式及颜色表

RGB & HSV 英文全称 RGB - Red, Green, Blue HSV - Hue, Saturation, Value HSV --> RGB 转换公式 HSV --> RGB 颜色表 RGB --> HSV 转换公式 RGB --> HSV 颜色表 参考资料 1.RGB to HSV conversion | color conversion http://www.rapidtables.com/convert/color/rgb-to-hsv.htm 2.

RGB 转化 HSV代码

public void toHSV3( int red , int green , int blue ){ double maxRGB = FqMath.max( red , green , blue );// double minRGB = FqMath.min( red , green , blue ); double itemp = maxRGB; //v'=itemp double temp = maxRGB - minRGB;// if( maxRGB == minRGB ){ thi

由RGB到HSV颜色空间的理解

1. RGB模型 2. HSV模型 3. 如何理解RGB与HSV的联系 4. HSV在图像处理中的应用 5. opencv中RGB-->HSV实现 在图像处理中,最常用的颜色空间是RGB模型,常用于颜色显示和图像处理,三维坐标的模型形式,非常容易被理解. 而HSV模型,是针对用户观感的一种颜色模型,侧重于色彩表示,什么颜色.深浅如何.明暗如何.第一次接触HSV,书本里首先抛出的是一个圆锥模型,由于很少使用HSV,所以印象不深刻,但看一些资料时,HSV的概念时不时出来骚扰一些人的神经,所以,弄清楚

彩色图像--色彩空间 HSI(HSL)、HSV(HSB)

学习DIP第66天 转载请标明本文出处:http://blog.csdn.net/tonyshengtan ,出于尊重文章作者的劳动,转载请标明出处!文章代码已托管,欢迎共同开发:https://github.com/Tony-Tan/DIPpro 开篇废话 色彩空间介绍最后两种与人类感知相对较接近的两种空间,彩色图像处理后面的内容大部分用在图像的基础处理,而如果想学习图像分析,应该开始学习一些模式识别和机器学习的算法,打算最近开始学习一些,并且开一个新的博客主题,欢迎讨论... 今天介绍下两种