OpenCV---HSV颜色空间介绍

前言

在OpenCV中我们有时候提取样本的时候可能会通过颜色来进行提取,那HSV颜色空间在这个时候就可以加以利用上了,本章主要是解决HSV颜色空间(摘自网上文章,在此留用),用于对HSV一个基本的认识了解。

HSV颜色系统简介

HSV是一种在人们生活中甚至更常用的颜色系统,在电视遥控器上、在画画的调色板中、在你用爱某艺视频调整亮度时都很常见,因为它更符合人们描述颜色的方式——是什么颜色、颜色有多深、颜色有多亮。

H——Hue即色相,就是我们平时所说的红、绿,如果你分的更细的话可能还会有洋红、草绿等等;在HSV模型中,用度数来描述色相,其中红色对应0度,绿色对应120度,蓝色对应240度。

S——Saturation即饱和度,色彩的深浅度(0-100%) ,对于一种颜色比如红色,我们可以用浅红——大红——深红——红得发紫等等语言来描述它(请原谅一个纯理科生的匮乏的颜色系统),对应在画水彩的时候即一种颜料加上不同分量的水形成不同的饱和度。

V——Value即色调,纯度,色彩的亮度(0-100%) ,这个在调整屏幕亮度的时候比较常见。

注:在模型2中:

H是色彩点在对应圆形切面上与红色半径(对于H=0度)所形成的圆心角。

V是色彩点所在圆形切面到圆锥顶点的距离。在顶面上V=1 顶点V=0

S是色彩点到所在圆形切面圆心的距离与该圆半径的比例值,在圆锥表面上S=1,在圆心处S=0


HSV值对颜色的影响

如上图是H=120时的S—V平面,S和V值分别从左至右、从下至上由0增大至1。我们可以发现其规律:

  • 在图片的左侧S值为0,呈现不同程度的灰色,由V值决定。

  • 在图片的下侧V值为0,呈现出黑色。

  • 在图片的右上角S和V值都为1,呈现出纯色,其RGB值为(0, 255, 0)。

因此对HSV我们的结论如下:


当S=1 V=1时,H所代表的任何颜色被称为纯色;


当S=0时,即饱和度为0,颜色最浅,最浅被描述为灰色(灰色也有亮度,黑色和白色也属于灰色),灰色的亮度由V决定,此时H无意义;


当V=0时,颜色最暗,最暗被描述为黑色,因此此时H(无论什么颜色最暗都为黑色)和S(无论什么深浅的颜色最暗都为黑色)均无意义。


HSV和RGB的互相转化

RGB➡HSV
1. V = max(R, G, B)/255.0f——亮度V就是RGB值中最大的那个值进行归一化。

推论:

     纯色的RGB中肯定有一个是255。同时RGB值也不可能有3个255,因为3个255为白色,白色为对于任何色彩H,V=1而S=0时的产物。而V=1 S=0并不是纯色。同时如果V=0,那么RGB三者中的最大值是0,即GRB都为0,也就是说该像素是黑色。

2. S = (max(R, G, B) - min(R, G, B))/(float)max(R, G, B)——饱和度S是RGB中最大值和最小值的差值与最大值的比值。

推论:
    纯色(S=1 V=1)的RGB值中必定有一个0,因为当S=1,max(R, G, B) - min(R, G, B) == max(R, G, B),即RGBMin=0。这也说明了白色(RGB(255,255,255)并不是纯色)。
    当S=0时,RGBMax-RGBMin==0,即R==G==B,此时颜色呈不同程度的灰色(由白到黑,亮度由V而定,因为V=RGBMax*100/255,V越高,RGBMax==R==G==B就越高,灰色越亮))。这也可以从上面给出的矩形图看出。

因此对于纯色来说,RGB中必有一个255和一个0
公式换算:


HSV➡RGB


OpenCV中的HSV颜色体系

与上述HSV颜色系统不同的是,如果直接使用OpenCV中cvtColor函数,并设置参数为CV_BGR2HSV,那么所得的H、S、V值范围分别是[0,180),[0,255),[0,255),而非[0,360],[0,1],[0,1];这时我们可以查下面的表格来确定颜色的大致区间

从输出的结果来看,和我们上边所说的是相符的。

另一种hsv方法——当我们想恢复到我们一开始介绍的体系时,我们只需要加一步——对像素的bgr进行归一化,再转到hsv时得到的结果就和我们介绍的就相同了。代码和输出结果如下

此时输出结果范围和一开始所述就符合了。


-END-

长按下方二维码关注微卡智享

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
您好!对于使用OpenCV进行颜色检测,您可以使用以下步骤: 1. 导入必要的库:首先,您需要导入OpenCV和NumPy库。 ```python import cv2 import numpy as np ``` 2. 读取图像:使用`cv2.imread()`函数读取要进行颜色检测的图像。 ```python image = cv2.imread("image.jpg") ``` 3. 转换颜色空间:将图像从BGR颜色空间转换为HSV颜色空间,因为HSV对颜色更加敏感。 ```python hsv_image = cv2.cvtColor(image, cv2.COLOR_BGR2HSV) ``` 4. 设定颜色范围:确定您要检测的颜色范围。可以使用HSV颜色空间中的最低和最高阈值来实现。可以使用工具(如GIMP)或在线资源来确定所需颜色的HSV值。 ```python # 设定蓝色颜色范围 lower_blue = np.array([90, 50, 50]) # 最低阈值 upper_blue = np.array([130, 255, 255]) # 最高阈值 ``` 5. 创建掩膜:使用`cv2.inRange()`函数创建一个二进制掩膜,用于标识在颜色范围内的像素。 ```python mask = cv2.inRange(hsv_image, lower_blue, upper_blue) ``` 6. 应用掩膜:使用`cv2.bitwise_and()`函数将掩膜应用于原始图像,以获取只包含特定颜色的部分。 ```python color_detected_image = cv2.bitwise_and(image, image, mask=mask) ``` 7. 显示结果:显示原始图像和检测到的颜色图像。 ```python cv2.imshow("Original Image", image) cv2.imshow("Color Detected Image", color_detected_image) cv2.waitKey(0) cv2.destroyAllWindows() ``` 这是一个基本的颜色检测示例。您可以根据需要调整颜色范围和其他参数来适应您的应用程序。希望对您有所帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Vaccae

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值