目录:

  • RGB 的局限性
  • HSV 颜色空间
  • HSL 颜色空间
  • HSV 应用例子
  • 使用 HSV 图像分割

RGB 的局限性

RGB 是我们接触最多的颜色空间,由三个通道表示一幅图像,分别为红色(R),绿色(G)和蓝色(B)。这三种颜色的不同组合可以形成几乎所有的其他颜色。

RGB 颜色空间是图像处理中最基本、最常用、面向硬件的颜色空间,比较容易理解。

RGB 颜色空间利用三个颜色分量的线性组合来表示颜色,任何颜色都与这三个分量有关,而且这三个分量是高度相关的,所以连续变换颜色时并不直观,想对图像的颜色进行调整需要更改这三个分量才行。

自然环境下获取的图像容易受自然光照、遮挡和阴影等情况的影响,即对亮度比较敏感。而 RGB 颜色空间的三个分量都与亮度密切相关,即只要亮度改变,三个分量都会随之相应地改变,而没有一种更直观的方式来表达。

但是人眼对于这三种颜色分量的敏感程度是不一样的,在单色中,人眼对红色最不敏感,蓝色最敏感,所以 RGB 颜色空间是一种均匀性较差的颜色空间。如果颜色的相似性直接用欧氏距离来度量,其结果与人眼视觉会有较大的偏差。对于某一种颜色,我们很难推测出较为精确的三个分量数值来表示。

所以,RGB 颜色空间适合于显示系统,却并不适合于图像处理。

HSV 颜色空间

基于上述理由,在图像处理中使用较多的是 HSV 颜色空间,它比 RGB 更接近人们对彩色的感知经验。非常直观地表达颜色的色调、鲜艳程度和明暗程度,方便进行颜色的对比。

在 HSV 颜色空间下,比 BGR 更容易跟踪某种颜色的物体,常用于分割指定颜色的物体。

HSV 表达彩色图像的方式由三个部分组成:

  • Hue(色调、色相)
  • Saturation(饱和度、色彩纯净度)
  • Value(明度)

用下面这个圆柱体来表示 HSV 颜色空间,圆柱体的横截面可以看做是一个极坐标系 ,H 用极坐标的极角表示,S 用极坐标的极轴长度表示,V 用圆柱中轴的高度表示。

Hue 用角度度量,取值范围为0~360°,表示色彩信息,即所处的光谱颜色的位置。,表示如下:

颜色圆环上所有的颜色都是光谱上的颜色,从红色开始按逆时针方向旋转,Hue=0 表示红色,Hue=120 表示绿色,Hue=240 表示蓝色等等。

在 GRB中 颜色由三个值共同决定,比如黄色为即 (255,255,0);在HSV中,黄色只由一个值决定,Hue=60即可。

HSV 圆柱体的半边横截面(Hue=60):

其中水平方向表示饱和度,饱和度表示颜色接近光谱色的程度。饱和度越高,说明颜色越深,越接近光谱色饱和度越低,说明颜色越浅,越接近白色。饱和度为0表示纯白色。取值范围为0~100%,值越大,颜色越饱和。

竖直方向表示明度,决定颜色空间中颜色的明暗程度,明度越高,表示颜色越明亮,范围是 0-100%。明度为0表示纯黑色(此时颜色最暗)。

可以通俗理解为:

在Hue一定的情况下,饱和度减小,就是往光谱色中添加白色,光谱色所占的比例也在减小,饱和度减为0,表示光谱色所占的比例为零,导致整个颜色呈现白色。

明度减小,就是往光谱色中添加黑色,光谱色所占的比例也在减小,明度减为0,表示光谱色所占的比例为零,导致整个颜色呈现黑色。

HSV 对用户来说是一种比较直观的颜色模型。我们可以很轻松地得到单一颜色,即指定颜色角H,并让V=S=1,然后通过向其中加入黑色和白色来得到我们需要的颜色。增加黑色可以减小V而S不变,同样增加白色可以减小S而V不变。例如,要得到深蓝色,V=0.4 S=1 H=240度。要得到浅蓝色,V=1 S=0.4 H=240度。

HSV 的拉伸对比度增强就是对 S 和 V 两个分量进行归一化(min-max normalize)即可,H 保持不变。

RGB颜色空间更加面向于工业,而HSV更加面向于用户,大多数做图像识别这一块的都会运用HSV颜色空间,因为HSV颜色空间表达起来更加直观!

HLS 颜色空间

HLS 和 HSV 比较类似,这里一起介绍。HLS 也有三个分量,hue(色相)、saturation(饱和度)、lightness(亮度)。

HLS 和 HSV 的区别就是最后一个分量不同,HLS 的是 light(亮度),HSV 的是 value(明度)。可以到这个 网页 尝试一下。

HLS 中的 L 分量为亮度,亮度为100,表示白色,亮度为0,表示黑色;HSV 中的 V 分量为明度,明度为100,表示光谱色,明度为0,表示黑色。

下面是 HLS 颜色空间圆柱体:

提取白色物体时,使用 HLS 更方便,因为 HSV 中的Hue里没有白色,白色需要由S和V共同决定(S=0, V=100)。而在 HLS 中,白色仅由亮度L一个分量决定。所以检测白色时使用 HSL 颜色空间更准确。

将上面这个 HLS 颜色空间图用来测试:

img = cv2.imread("hls.jpg")# Convert BGR to HLS
imgHLS = cv2.cvtColor(img, cv2.COLOR_BGR2HLS)# range of white color in L channel
# mask = cv2.inRange(imgHLS[:,:,1], lowerb=250, upperb=255)
mask = cv2.inRange(imgHLS, np.array([0,250,0]), np.array([255,255,255]))# Apply Mask to original image
white_mask = cv2.bitwise_and(img, img, mask=mask)

注意:在 OpenCV 中 HLS 三个分量的范围为:

  • H = [0,179]
  • L = [0,255]
  • S = [0,255]

HSV 应用例子

注意:在 OpenCV 中 HSV 三个分量的范围为:

  • H = [0,179]
  • S = [0,255]
  • V = [0,255]

获取要跟踪物体颜色的HSV值:

对一个BGR值进行颜色空间转换,得到HSV值。

>>> blue = np.uint8([[[255,0,0]]])
>>> hsv_blue = cv2.cvtColor(blue, cv2.COLOR_BGR2HSV)
>>> print(hsv_blue)
[[[120 255 255]]]

为了识别特定颜色的物体,获取到颜色所对应的HSV值很重要,这里说一下获取步骤:

1、在线取色器 或 传图识色,可以在这里上传特定颜色的图片,获取这些颜色对应的RGB值。

2、假设获取到的是这样的数据:#869C90,#899F92,#8A9E92,#8A9F8E,下面将其进行转换得到HSV各通道的数值范围:

rgb = '#869C90,#899F92,#8A9E92,#8A9F8E'rgb = rgb.split(',')# 转换为BGR格式,并将16进制转换为10进制
bgr = [[int(r[5:7], 16), int(r[3:5], 16), int(r[1:3], 16)] for r in rgb]# 转换为HSV格式
hsv = [list(cv2.cvtColor(np.uint8([[b]]), cv2.COLOR_BGR2HSV)[0][0]) for b in bgr]hsv = np.array(hsv)
print('H:', min(hsv[:, 0]), max(hsv[:, 0]))
print('S:', min(hsv[:, 1]), max(hsv[:, 1]))
print('V:', min(hsv[:, 2]), max(hsv[:, 2]))

然后对其中的Hue值进行加10和减10(这里的10也可以为其他值,视具体情况而定),得到Hue的范围,还要指定S和V的范围:

最后整个HSV值的上限和下限为 [hue+10,100,100]和 [hue-10,255,255],S和V的下限值可以根据实际情况设置。

因为H=0和H=180都对应红色,所以对于红色的话,需要定义两个范围,并进行取或操作。

sensitivity = 10
lower_red_0 = np.array([0,100,100])
upper_red_0 = np.array([sensitivity,255,255])
lower_red_1 = np.array([180-sensitivity,100,100])
upper_red_1 = np.array([180,255,255])mask_0 = cv2.inRange(hsv, lower_red_0, upper_red_0)
mask_1 = cv2.inRange(hsv, lower_red_1, upper_red_1)mask = cv2.bitwise_or(mask_0, mask_1)

使用 cv2:inRange() 作为基于颜色的阈值。

然后就可以使用该 HSV 值范围进行目标物体的提取。

import cv2
import numpy as nppath = "compass.jpg"
img = cv2.imread(path)# Convert BGR to HSV
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)sensitivity = 15# define range of blue color in HSV
lower_blue = np.array([120-sensitivity,100,100])
upper_blue = np.array([120+sensitivity,255,255])
# Threshold the HSV image to get a range of blue color
mask_blue = cv2.inRange(hsv, lower_blue, upper_blue)kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (5,5))
mask_blue = cv2.morphologyEx(mask_blue, cv2.MORPH_CLOSE, kernel)  # 闭运算
mask_blue = cv2.morphologyEx(mask_blue, cv2.MORPH_OPEN, kernel)   # 开运算# define range of red color in HSV
lower_red_0, upper_red_0 = np.array([0,100,100]), np.array([sensitivity,255,255])
lower_red_1, upper_red_1 = np.array([180-sensitivity,100,100]), np.array([180,255,255])
# Threshold the HSV image to get a range of red color
mask_0 = cv2.inRange(hsv, lower_red_0, upper_red_0)
mask_1 = cv2.inRange(hsv, lower_red_1, upper_red_1)
mask_red = cv2.bitwise_or(mask_0, mask_1)mask_red = cv2.morphologyEx(mask_red, cv2.MORPH_CLOSE, kernel)
mask_red = cv2.morphologyEx(mask_red, cv2.MORPH_OPEN, kernel)# 合并蓝色mask和红色mask
mask = cv2.bitwise_or(mask_blue, mask_red)
# Bitwise-AND mask
res = cv2.bitwise_and(img, img, mask=mask)cv2.imshow('image',img)
cv2.imshow('mask_blue',mask_blue)
cv2.imshow('mask_red',mask_red)
cv2.imshow('res',res)if cv2.waitKey(0)==ord('q'):cv2.destroyAllWindows()

下面分别原图,蓝色掩码,红色掩码,以及蓝色和红色区域。

使用 HSV 图像分割

有时候也可以利用颜色空间进行图像分割,如果图像的颜色特征比强度特征更好,则可以尝试将其转换为HSV,然后在H通道上进行自适应二值化处理。

原图如下:

下面是相关源码:

image = cv2.imread(img_path)
cv2.imshow('img', image)
hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
cv2.imshow('hsv', hsv[:,:,0])
(thresh, im_bw) = cv2.threshold(hsv[:,:,0], 0, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU)
cv2.imshow('otsu', im_bw)

对该风景图进行阈值切割后的结果:

左图为H通道的图,右图为我们进行二值化后的图。可以发现我们通过这种方法将图像中的主要三个颜色部分很好地分割开来。

而我们采用对灰度图进行阈值切割的结果如下:

左图为灰度图,右图为我们进行二值化后的图。

因为图像中的天空是渐变的,所以不管用什么阈值,都会把天空给分成两部分,显然没有转换颜色通道的效果好。

RGB、HSV和HSL颜色空间相关推荐

  1. RGB、CMY、HSV、HSL颜色空间

    1.颜色空间(又称彩色模型.色彩空间. 彩色系统等)是对色彩的一种描述方式,定义有很多种,区别在于面向不同的应用背景. 颜色空间的应用背景: 显示器中采用的RGB颜色空间是基于物体发光定义的(RGB对 ...

  2. RGB、HSV、HSL和YUV颜色空间

    1. RGB 适合于显示系统,却并不适合于图像处理 (1) RGB是什么? RGB 是最常用于显示器的色彩空间,R(red)是红色通道,G(green)是绿色,B(blue)是蓝色通道.这三种颜色以不 ...

  3. HSV(HSL)颜色空间及其应用

    from:http://nkwavelet.blog.163.com/blog/static/22775603820147851726816/ [摘要] 本文首先阐述HSV 和 HSL颜色模式的基本特 ...

  4. 颜色空间探究:RGB、HSV和HSL

    从RGB空间说起 所谓RGB空间就是red,green和blue颜色3个向量张成的空间,正好类似于3维欧氏空间. 如图所示,3个向量均归一化了,其中(0,0,0)处为黑色,(1,1,1)处为白色.这种 ...

  5. [Python模块学习]用colorsys模块转换颜色模型,常见颜色模型简介(RGB/HSV/HSL/YIQ)

    colorsys模块 博主最近又进入了无聊模式,没事就翻Python标准库读源码读着玩.但是里面有几个模块确实规模比较大,所以坑挖了一半就停了-现在电脑桌面上一堆没填完的坑.总之慢慢填吧- 今天发现了 ...

  6. RGB、YUV、HSV和HSL区别和关联

    RGB.YUV.HSV和HSL区别和关联 近期在做的一个需求和颜色转换有关系,所以本篇将开发过程中比较常见的 四种颜色 进行一番梳理. 一.RGB颜色空间 从我们最常见的RGB颜色出发,RGB分别对应 ...

  7. [cv] 颜色空间模型 RGB, HSV,HLS,YCbCr,LUV

    RGB RGB色彩就是常说的光学三原色,R代表Red(红色),G代表Green(绿色),B代表Blue(蓝色).自然界中肉眼所能看到的任何色彩都可以由这三种色彩混合叠加而成,因此也称为加色模式. HS ...

  8. RGB、HSV和Lab颜色空间

    https://blog.csdn.net/fred_yang2013/article/details/11083691 http://blog.csdn.net/carson2005/article ...

  9. 【C# / Algorithm】RGB、HSV、HSL颜色模型的互相转换

    RGB.HSV.HSL颜色模型的含义本文就不赘述了,大家可以直接百度到. 在此提供一个封装好的可以对三种颜色模型进行互相转换的辅助类. 以上是使用该类写出的程序示例. 以下是颜色模型类的描述 #reg ...

最新文章

  1. python 猜数字大小
  2. Qt学习(八):QT中TCP传输文件
  3. 苹果cms v8模板 高仿爱奇艺带PC+手机模板
  4. java 手机信息管理系统照相功能_Android实现手机拍照功能
  5. mqtt 多个订阅者 只允许一个接收_一文读懂物联网的灵魂MQTT
  6. C++程序调用python3
  7. Linux 如何重启网络
  8. 通过5个概念 一文弄明白DAO
  9. 注塑成型工艺流程四大知识点总结
  10. 论简历解析及其步骤(一)步骤及理论
  11. 手机评测 三星V-208
  12. 华为ensp联动Wmware虚拟机Openstack平台实现Vlan网络模式
  13. 猕猴桃酵素的功效_过路老熊_新浪博客
  14. mysql查询字段大于小于_sql查询大于字段的所有数据,或小于字段的所有数据
  15. 惊天大突破!「我国数学家证明 NP=P」!道翰天琼认知智能机器人平台API接口大脑为您揭秘。
  16. java中的double 类型数据相加问题
  17. 前端加密方法sha256.js源码+用法(亲测可用)
  18. matlab插值龙格实验,实验二 拉格朗日插值龙格现象.doc
  19. 鸿蒙时期有厉害的人吗,急求:中国神话中有几位圣人.都是谁。鸿钧.鸿蒙.陆压.东皇太一的来历。天界掌控者一共更换了几代都是谁...
  20. SCRM和CRM有什么区别

热门文章

  1. UPC(混合1)问题 D: 迷宫
  2. S - 简单密码破解
  3. ETL自动化运维调度管理工具 TASKCTL 流程文件系统
  4. 淘宝发布“避冬”锦囊,9成剁手党必备秋裤,搓澡巾成山东人最爱?
  5. c++中的异步和同步机制
  6. Jsp,Servlet连接数据库
  7. 首届中小企业国际合作论坛——日本价值工程协会
  8. zscore 是如何标准化矩阵的?
  9. NYOJ 91 阶乘之和
  10. 移动App,AJAX异步请求,实现简单的增、删、改、查