HSV (Hue, Saturation, Value) 是一种常用的颜色空间,在计算机视觉和图像处理中广泛用于颜色分割和目标检测。OpenCV 提供了对 HSV 颜色空间的完整支持。
HSV 颜色空间由三个分量组成:
OpenCV 提供了 cv2.cvtColor()
函数进行颜色空间转换:
import cv2
import numpy as np
# 读取图像
image = cv2.imread('image.jpg')
# BGR转HSV (OpenCV默认使用BGR格式)
hsv_image = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
# 显示结果
cv2.imshow('HSV Image', hsv_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
HSV 颜色空间非常适合基于颜色的分割:
# 定义蓝色的HSV范围
lower_blue = np.array([100, 50, 50]) # H:100-140通常为蓝色
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('Blue Mask', mask)
cv2.imshow('Result', result)
cv2.waitKey(0)
cv2.destroyAllWindows()
颜色 | H范围 | S范围 | V范围 |
---|---|---|---|
红色 | 0-10 或 160-179 | 100-255 | 100-255 |
橙色 | 10-25 | 100-255 | 100-255 |
黄色 | 25-35 | 100-255 | 100-255 |
绿色 | 35-85 | 100-255 | 100-255 |
青色 | 85-100 | 100-255 | 100-255 |
蓝色 | 100-140 | 100-255 | 100-255 |
紫色 | 140-160 | 100-255 | 100-255 |
注意:红色在HSV环中是跨界的,需要检测两个范围。
可以使用滑块实时调整HSV范围:
def nothing(x):
pass
cv2.namedWindow('HSV Tracker')
# 创建滑块
cv2.createTrackbar('H_min', 'HSV Tracker', 0, 179, nothing)
cv2.createTrackbar('H_max', 'HSV Tracker', 179, 179, nothing)
cv2.createTrackbar('S_min', 'HSV Tracker', 0, 255, nothing)
cv2.createTrackbar('S_max', 'HSV Tracker', 255, 255, nothing)
cv2.createTrackbar('V_min', 'HSV Tracker', 0, 255, nothing)
cv2.createTrackbar('V_max', 'HSV Tracker', 255, 255, nothing)
while True:
# 获取滑块值
h_min = cv2.getTrackbarPos('H_min', 'HSV Tracker')
h_max = cv2.getTrackbarPos('H_max', 'HSV Tracker')
s_min = cv2.getTrackbarPos('S_min', 'HSV Tracker')
s_max = cv2.getTrackbarPos('S_max', 'HSV Tracker')
v_min = cv2.getTrackbarPos('V_min', 'HSV Tracker')
v_max = cv2.getTrackbarPos('V_max', 'HSV Tracker')
# 定义范围
lower = np.array([h_min, s_min, v_min])
upper = np.array([h_max, s_max, v_max])
# 创建掩膜
mask = cv2.inRange(hsv_image, lower, upper)
# 显示结果
cv2.imshow('Mask', mask)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
cv2.destroyAllWindows()
# BGR转HSV
hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
# HSV转BGR
bgr = cv2.cvtColor(hsv, cv2.COLOR_HSV2BGR)
# HSV转RGB (需要先转BGR)
rgb = cv2.cvtColor(cv2.cvtColor(hsv, cv2.COLOR_HSV2BGR), cv2.COLOR_BGR2RGB)
import cv2
import numpy as np
image = cv2.imread('red_object.jpg')
hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
# 红色有两个范围
lower_red1 = np.array([0, 120, 70])
upper_red1 = np.array([10, 255, 255])
lower_red2 = np.array([170, 120, 70])
upper_red2 = np.array([180, 255, 255])
mask1 = cv2.inRange(hsv, lower_red1, upper_red1)
mask2 = cv2.inRange(hsv, lower_red2, upper_red2)
mask = cv2.bitwise_or(mask1, mask2)
result = cv2.bitwise_and(image, image, mask=mask)
cv2.imshow('Original', image)
cv2.imshow('Mask', mask)
cv2.imshow('Result', result)
cv2.waitKey(0)
cv2.destroyAllWindows()
领取专属 10元无门槛券
手把手带您无忧上云