色彩空间中的HSL,HSV,HSB有啥区别

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了色彩空间中的HSL,HSV,HSB有啥区别相关的知识,希望对你有一定的参考价值。

RGB 是对机器很友好的色彩模式,但并不够人性化,因为我们对色彩的认识往往是”什么颜色?鲜艳不鲜艳?亮还是暗?”。HSL 模式和 HSV(HSB) 都是基于 RGB 的,是作为一个更方便友好的方法创建出来的。

HSB 为 色相,饱和度,明度,

HSL 为 色相,饱和度,亮度,

HSV 为色相,饱和度,明度。

HSB 和 HSV 是是一样的,只是叫法不同,HSL 则还有一些细微的区别:

在所有的情况下,H(Hue) 代表色相,S(Saturation) 代表饱和度。Hue(色相)是指取值范围在0-360°的圆心角,每个角度可以代表一种颜色。B 在 HSB 模式中是 Brightness 的意思, V 在 HSV 中是值,但是所表述的是一个东西:对光的量或光源的功率的感知。色相和明度(值)可以在0 - 1或者0% - 100%间取值。

HSL 稍微有一些不同,Hue(色相)和 HSB/HSV 模式中一样用数值表示,但是, S,同样代表“饱和度”,定义不一样,且需要转换。 L 代表亮度,和 Brightness/Value 不一样。Brightness(明度)是被认为是”光的量“,可以是任何颜色。

而 Lightness(亮度)是作为”白的量“来理解的。Saturation(饱和度)不一样,因为在两个模型中,饱和度都按比例缩放以适应明度或亮度的定义。

两者的区别,和他们之间对于饱和度的定义的不同。咱们拿案例看吧,先选同一个色 #f200ff

放入 HSL Color Picker,显示 HSL 数值为:H(297), S(100), L(50)
<img src="http://pic3.zhimg.com/4af6abf0370ee6b6dc0f03716cba7f26_b.jpg" data-rawwidth="771" data-rawheight="361" class="origin_image zh-lightbox-thumb" width="771" data-original="http://pic3.zhimg.com/4af6abf0370ee6b6dc0f03716cba7f26_r.jpg">
但是我们放在 Sketch 里面看一下,显示的 HSB 数值为,H(297), S(100), B(100) :
<img src="http://pic4.zhimg.com/9f02c36cc4b4e55db2bf6a5238e2fc6b_b.jpg" data-rawwidth="214" data-rawheight="423" class="content_image" width="214">
同样,需要提醒一下的是,CSS 里头支持的是 HSL,而不是 HSB,不要把 HSB 的数值直接套用了,不然的话你看到的可能会是不一样的颜色。

HSL 和 HSB 哪一个更适合人机界面,是有争议的,实际运用的区别会和我上面的例子一样,具体的区别和优劣势,可移步到这看:
参考技术A

下面为hsl的三张图:

下面为hsb(hsv)的三张图:

图片的色彩空间转换简单色彩跟踪与通道分离合并

一 图片的色彩空间转换

  • 灰度色彩空间

  单通道,取值范围[0,255] 0黑255白

  • RGB色彩空间(opencv中习惯用BGR)

  opencv中R,G,B三通道取值范围均为[0,255]。

 技术图片

  • HSV/HSL色彩空间

     H:0-180  S: 0-255 V: 0-255

  HSV是一种将RGB色彩空间中的点在倒圆锥体中的表示方法。HSV即色相(Hue)、饱和度(Saturation)、明度(Value),又称HSB(B即Brightness)。色相是色彩的基本属性,就是平常说的颜色的名称,如红色、黄色等。饱和度(S)是指色彩的纯度,越高色彩越纯,低则逐渐变灰,取0-100%的数值。明度(V),取0-max(计算机中HSV取值范围和存储的长度有关)。HSV颜色空间可以用一个圆锥空间模型来描述。圆锥的顶点处,V=0,H和S无定义,代表黑色。圆锥的顶面中心处V=max,S=0,H无定义,代表白色。
技术图片

 

1 代码

import cv2 as cv

#色彩空间的转换
def color_space_demo(image):
    gray=cv.cvtColor(image,cv.COLOR_BGR2GRAY)
    cv.imshow(gray,gray)
    hsv=cv.cvtColor(image,cv.COLOR_BGR2HSV)
    cv.imshow(hsv,hsv)
    yuv=cv.cvtColor(image,cv.COLOR_BGR2YUV)
    cv.imshow(hsv,yuv)

src=cv.imread(./yiner.jpg)
cv.namedWindow(before,cv.WINDOW_NORMAL)
cv.imshow(before,src)

color_space_demo(src)
cv.waitKey(0)
cv.destroyAllWindows()

 

 

技术图片

 

二:色彩空间转换,利用inrange函数过滤视频中的颜色,实现跟踪某一颜色

代码

#色彩空间转换,利用inrange函数过滤视频中的颜色,实现跟踪颜色
import cv2 as cv
import numpy as np

def catch_pen():
    capture=cv.VideoCapture(./1.mp4)#导入文件

    while True:
        ret,frame=capture.read()
        if ret==False:
            break
        #色彩空间转换到HSV
        hsv=cv.cvtColor(frame,cv.COLOR_BGR2HSV)
        # 设置黑色的范围,跟踪视频中的黑色
        lower_hsv=np.array([0,0,0]) #设置过滤的颜色的低值
        upper_hsv=np.array([180,255,46])#设置过滤的颜色的高值
        # 调节图像颜色信息(H)、饱和度(S)、亮度(V)区间,选择黑色区域
        mask=cv.inRange(hsv,lower_hsv,upper_hsv)
        cv.imshow(video,frame)
        cv.imshow(mask,mask)
        if cv.waitKey(50)&0xFF==ord(q):
            break

catch_pen()
cv.waitKey()
cv.destroyAllWindows()

 

HSV  lower_hsv和uppe_hsv查询表

技术图片

 

三 通道分离、合并,修改某一通道

通道分离:split() 将彩色图像分割为3个通道

合并:merge()

import cv2 as cv
import numpy as np

src=cv.imread(hua.jpg)
cv.namedWindow(before,cv.WINDOW_NORMAL)
cv.imshow(before,src)

#通道分离
b,g,r=cv.split(src)
cv.imshow(blue,b)
cv.imshow(green,g)
cv.imshow(red,r)

#通道合并
src=cv.merge([b,g,r])
cv.imshow(merge,src)

# 修改某个通道
src[:,:,2]=100
cv.imshow(single,src)

cv.waitKey(0)
cv.destroyAllWindows()

 

效果展示

技术图片

以上是关于色彩空间中的HSL,HSV,HSB有啥区别的主要内容,如果未能解决你的问题,请参考以下文章

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

HSV和HSI区别

求:HSV与HSI空间的差别

树莓派视觉小车 -- OpenCV巡线(HSL色彩空间PID)

图片的色彩空间转换简单色彩跟踪与通道分离合并

RGBYUVHSV和HSL区别和关联