HSV模型解释
HSV(Hue, Saturation, Value)是根据颜色的直观特性由A. R. Smith在1978年创建的一种颜色空间, 也称六角锥体模型(Hexcone Model)。
这个模型中颜色的参数分别是:
- 色调(H)
- 饱和度(S)
- 明度(V)
色调H
用角度度量,取值范围为0°~360°,从红色开始按逆时针方向计算,红色为0°,绿色为120°,蓝色为240°。它们的补色是:黄色为60°,青色为180°,品红为300°;
饱和度S
饱和度S表示颜色接近光谱色的程度。一种颜色,可以看成是某种光谱色与白色混合的结果。其中光谱色所占的比例愈大,颜色接近光谱色的程度就愈高,颜色的饱和度也就愈高。饱和度高,颜色则深而艳。光谱色的白光成分为0,饱和度达到最高。通常取值范围为0%~100%,值越大,颜色越饱和。
明度V
明度表示颜色明亮的程度,对于光源色,明度值与发光体的光亮度有关;对于物体色,此值和物体的透射比或反射比有关。通常取值范围为0%(黑)到100%(白)。
结论
- 当S=1 V=1时,H所代表的任何颜色被称为纯色;
- 当S=0时,即饱和度为0,颜色最浅,最浅被描述为灰色(灰色也有亮度,黑色和白色也属于灰色),灰色的亮度由V决定,此时H无意义;
- 当V=0时,颜色最暗,最暗被描述为黑色,因此此时H(无论什么颜色最暗都为黑色)和S(无论什么深浅的颜色最暗都为黑色)均无意义。
注意:
- 在opencv中,H、S、V值范围分别是[0,180],[0,255],[0,255],而非[0,360],[0,1],[0,1];
这里我们列出部分hsv空间的颜色值, 表中将部分紫色归为红色。
判断白天还是夜晚案例
实现步骤
- 将图片从BGR颜色空间,转变成HSV颜色空间
- 获取图片的宽高信息
- 统计每个颜色点的亮度
- 计算整张图片的亮度平均值
注意:这仅仅只能做一个比较粗糙的判定,按照我们人的正常思维,在傍晚临界点我们也无法判定当前是属于晚上还是白天!
代码实现
import cv2
import numpy as np
# 计算明暗程度平均值函数
def col_v(img):
img = cv2.imread(img) # 读取传进来的图片
img = cv2.cvtColor(img,cv2.COLOR_BGR2HSV) # 转换图片为HSV颜色模式
h,s,v = cv2.split(img) # 分割后会得到HSV3个通道的值
v = np.average(v) # 对V(明暗度)求平均值,也可以用np.sum/图片像素点总数来求平均值
return v
img_1 = '/Users/guojun/Desktop/img1.jpg'
img_2 = '/Users/guojun/Desktop/img2.jpg'
v_1 = col_v(img_1)
v_2 = col_v(img_2)
# 我们假设根据经验,平均值大于100的是白天
if v_2>100:
print('day')
else:
print('night')
颜色过滤案例
在一张图片中,如果某个物体的颜色为纯色,那么我们就可以使用颜色过滤inRange的方式很方便的来提取这个物体.
下面我们有一张网球的图片,并且网球的颜色为一定范围内的绿色,在这张图片中我们找不到其它颜色也为绿色的图片,所以我们可以考虑使用绿色来提取它!
图片的颜色空间默认为BGR颜色空间,如果我们想找到提取纯绿色的话,我们可能需要写(0,255,0)这样的内容,假设我们想表示一定范围的绿色就会很麻烦!
所以我们考虑将它转成HSV颜色空间,绿色的色调H的范围我们很容易知道,剩下的就是框定颜色的饱和度H和亮度V就可以啦!
实现步骤
- 读取一张彩色图片
- 将RGB转成HSV图片
- 定义颜色的范围,下限位(30,120,130),上限为(60,255,255)
- 根据颜色的范围创建一个mask
代码实现
替换背景图案例
实现步骤
- 从绿幕图片中过滤出绿幕
- 将狮子从绿幕中抠出来
- 在背景图片上抠出狮子的位置
- 将狮子和背景图片进行相加得到最终的图片