对于掩膜操作原理,参考:opencv-python掩膜操作
对于HSV颜色空间,参考:opencv-python(六):颜色空间及转换
1. 提取特定颜色区域
在上一篇,我们讲了掩膜的基本操作原理,现在我们如何使用掩膜+颜色来对图像中特定的颜色进行操作?比如何如得到下图的蓝色区域?
首先如何定义HSV的蓝色范围?
- 对于HSV分量用归一化表示的话,H色相分量使用红色开始(红-黄-绿方向)到红色结束,那么归一化H=0.67大概表示蓝色色色相,实际H=0.6*180=120
- S分量表示饱和度,当S=0时表示白色,当S=255,表示饱和度很高
- V分量表示亮度,当V=0时表示黑色,当V=255,表示亮度很高
- 所以我们表示蓝色范围可以定义(110,50,50)-(130,255,255)
这里给出代码:
import cv2
import numpy as np
img=cv2.imread("color.jpg")
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV) # 转换为HSV颜色空间
# 设定蓝色阈值
lower_blue = np.array([110, 50, 50])
upper_blue = np.array([130, 255, 255])
# 根据阈值构建掩膜
mask = cv2.inRange(hsv, lower_blue, upper_blue) # inrange将在两个阈值内的像素值设置为白色(255),而不在阈值区间内的像素值设置为黑色(0)
# 位运算
res = cv2.bitwise_and(img, img, mask=mask)
cv2.imshow("img", img)
cv2.imshow("mask", mask)
cv2.imshow("res", res)
cv2.waitKey(0)
效果图:
2. 提取摄像头帧图像中特定颜色区域
我们现在要实现追踪摄像头捕获图像中的蓝色物体:
- 捕获帧图像
- 将颜色空间转换到HSV
- 设定蓝色阈值,制作掩膜
- 对帧图像进行掩膜操作,留下含蓝色部分的区域
实现代码:
import cv2
import numpy as np
cap = cv2.VideoCapture(0)
while True:
ret, frame = cap.read() # 捕获帧图像
hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV) # 转换为HSV颜色空间
# 设定蓝色阈值
lower_blue = np.array([110, 50, 50])
upper_blue = np.array([130, 255, 255])
# 根据阈值构建掩膜
mask = cv2.inRange(hsv, lower_blue, upper_blue)
# inrange将在两个阈值内的像素值设置为白色(255),而不在阈值区间内的像素值设置为黑色(0),即形成了一个掩膜
# 位运算
res = cv2.bitwise_and(frame, frame, mask=mask)
cv2.imshow("frame", frame)
cv2.imshow("mask", mask)
cv2.imshow("res", res)
cv2.waitKey(1)