HSV颜色空间介绍
一、HSV颜色空间的概念
HSV(Hue - Saturation - Value)是一种颜色模型,它将颜色描述为三个分量:
- 色调(Hue):用于区分不同的颜色类别,取值范围通常为0 - 360°(在OpenCV中为0 - 179)。例如,红色大约在0°或180°,绿色在120°左右,蓝色在240°左右。它就像是颜色的“身份标识”,决定了我们看到的是红色、绿色还是其他颜色。
- 饱和度(Saturation):表示颜色的纯度,取值范围是0 - 100%(在OpenCV等计算机视觉库中为0 - 255)。饱和度越高,颜色越鲜艳;当饱和度为0时,颜色变为灰度,即没有颜色成分,只有亮度信息。
- 明度(Value):描述颜色的明亮程度,取值范围也是0 - 100%(在计算机视觉库中为0 - 255)。明度为0时表示黑色,明度越高,颜色越亮。
二、RGB转HSV公式
设RGB颜色空间中的颜色值为 ( R , G , B ) (R, G, B) (R,G,B),其中 R , G , B R, G, B R,G,B的取值范围是0 - 255。转换后的HSV值为 ( H , S , V ) (H, S, V) (H,S,V),其转换公式如下:
-
计算 V V V(明度)
- V = m a x ( R , G , B ) V = max(R, G, B) V=max(R,G,B)
-
计算 S S S(饱和度)
- 首先计算 d e l t a = m a x ( R , G , B ) − m i n ( R , G , B ) delta = max(R, G, B)-min(R, G, B) delta=max(R,G,B)−min(R,G,B)
- 如果 V = 0 V = 0 V=0,则 S = 0 S = 0 S=0;否则, S = d e l t a V S=\frac{delta}{V} S=Vdelta
-
计算 H H H(色调)
- 如果 S = 0 S = 0 S=0,则 H H H未定义(通常设为0)。
- 当 R = m a x ( R , G , B ) R = max(R, G, B) R=max(R,G,B)时, H = 60 × ( G − B d e l t a + ( G < B ? 6 : 0 ) ) H = 60\times(\frac{G - B}{delta}+(G < B? 6 : 0)) H=60×(deltaG−B+(G<B?6:0))
- 当 G = m a x ( R , G , B ) G = max(R, G, B) G=max(R,G,B)时, H = 60 × ( B − R d e l t a + 2 ) H = 60\times(\frac{B - R}{delta}+2) H=60×(deltaB−R+2)
- 当 B = m a x ( R , G , B ) B = max(R, G, B) B=max(R,G,B)时, H = 60 × ( R − G d e l t a + 4 ) H = 60\times(\frac{R - G}{delta}+4) H=60×(deltaR−G+4)
OpenCV中cv2.inRange()函数的应用示例
一、cv2.inRange()函数功能
cv2.inRange()
函数用于在图像中提取指定范围内的像素。它根据给定的下限和上限阈值创建一个掩码(mask),掩码中像素值在指定范围内的位置为255(白色,表示满足条件),其他位置为0(黑色,表示不满足条件)。
二、示例代码
import cv2
import numpy as np
# 读取图像
image = cv2.imread('your_image.jpg')
# 将图像从BGR转换为HSV
hsv_image = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
# 定义要提取颜色的HSV范围(以提取蓝色为例)
lower_blue = np.array([100, 50, 50])
upper_blue = np.array([140, 255, 255])
# 创建掩码
mask = cv2.inRange(hsv_image, lower_blue, upper_blue)
# 对原图像和掩码进行位运算,提取蓝色物体
result = cv2.bitwise_and(image, image, mask = mask)
# 显示结果
cv2.imshow('Original Image', image)
cv2.imshow('Mask', mask)
cv2.imshow('Result', result)
cv2.waitKey(0)
cv2.destroyAllWindows()
在上述示例中:
- 首先通过
cv2.imread()
函数读取一张图像,然后使用cv2.cvtColor()
函数将其从BGR颜色空间转换为HSV颜色空间。这是因为cv2.inRange()
函数在HSV空间中进行颜色范围提取更加方便直观。 - 接着定义了要提取的蓝色在HSV空间中的范围。
lower_blue
和upper_blue
分别是下限和上限阈值数组,这里的数值是根据蓝色在HSV空间中的大致范围确定的。 - 使用
cv2.inRange()
函数创建了一个掩码。这个掩码中只有蓝色物体对应的像素位置为255,其他位置为0。 - 最后,通过
cv2.bitwise_and()
函数将原图像和掩码进行位运算,得到只包含蓝色物体的图像。并通过cv2.imshow()
函数显示了原始图像、掩码和最终结果,cv2.waitKey(0)
等待用户按键,cv2.destroyAllWindows()
关闭所有打开的窗口。
请注意,在实际应用中,你需要将your_image.jpg
替换为你自己的图像路径。同时,颜色范围的设定可能需要根据具体的图像和提取目标进行调整。