HSV 空间
最直观了解一个彩色空间的方法就是了解其通道数,以及每个通道代表什么,还有每个通道的取值为多少,了解之后对于不同空间的转换就能理解并且自己实现一些功能。
HSV通道及其含义
HSV是由三通道组成,
分别是:H代表色调,表示颜色类型种类,取值范围0~179,有时候用一个扇形图表示色彩取值,即0到179映射到0到360度中,如下图
S代表饱和度,也即颜色由深到浅,取值0到255
V代表亮度:表示颜色明暗程度,取值0到255
图解
在模型2中:
H是色彩点在对应圆形切面上与红色半径(对于H=0度)所形成的圆心角。
V是色彩点所在圆形切面到圆锥顶点的距离。在顶面上V=1 顶点V=0
S是色彩点到所在圆形切面圆心的距离与该圆半径的比例值,在圆锥表面上S=1,在圆心处S=0
个人理解之RGB与HSV区别
RGB更像是颜色之间的混合得到的东西,其比较难区分同种颜色但是不同亮度及深浅的图像,而HSV只要色调一样,深浅与亮度都是忽略的误差(只需要把深度与亮度的范围调大就行),在opencv中这种颜色空间非常常用
练习,利用HSV空间指定色彩区间抠图
import cv2
import numpy as np
# 在HSV空间对绿屏色彩区域进行阈值处理,生成遮罩进行抠图
img = cv2.imread("hsv.png", flags=1) # 读取彩色图像
'''
# 颜色空间转化函数,用于将从一个色彩空间转换到另一个色彩空间
'''
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV) # 将图片转换到 HSV 色彩空间
# 使用 cv.inrange 函数在 HSV 空间检查设定的颜色区域范围,转换为二值图像,生成遮罩
lowerColor = np.array([35, 43, 46]) # (下限: 绿色33/43/46)
upperColor = np.array([77, 255, 255]) # (上限: 绿色77/255/255)
'''
inRange函数,设定两个阈值,在这个阈值区间的像素点设置为255,否则为0
'''
binary = cv2.inRange(hsv, lowerColor, upperColor) # 生成二值遮罩,指定背景颜色区域白色
binaryInv = cv2.bitwise_not(binary) # 生成逆遮罩,前景区域白色开窗,背景区域黑色
# 对像素点按位与运算,像素点上的值计算时化成二进制数,与自身进行位操作
# 传入两个img就是对两张相同图片位操作,mask是限定位操作的位置,对应非零位置进行位操作
matting = cv2.bitwise_and(img, img, mask=binaryInv) # 生成抠图图像 (前景保留,背景黑色)
cv2.imshow('over',matting)
cv2.waitKey(0)
cv2.destroyAllWindows()
# 将背景颜色更换为红色: 修改逆遮罩 (抠图以外区域黑色)
imgReplace = img.copy()
imgReplace[binaryInv == 0] = [0, 0, 255] # 黑色背景区域(0/0/0) 修改为红色 (BGR:0/0/255)