# 定义红色的HSV范围 lower_red_1 = np.array([0, 43, 46]) upper_red_1 = np.array([10, 255, 255]) lower_red_2 = np.array([156, 43, 46]) upper_red_2 = np.array([180, 255, 255]) # 根据阈值创建掩码 mask1 = cv2.inRange(hsv, lower_red_1, upper_red_1) mask2 = cv2.inRange(hsv, lower_red_2, upper_red_2) # 对原图像和掩码进行位运算 img1 = cv2.bitwise_and(img, img, mask=mask1) img2 = cv2.bitwise_and(img, img, mask=mask2) red_only = cv2.bitwise_or(img1, img2)
有线博主的代码运行正常,但是红色筛选不全,是忽略了HSV色彩空间红色范围的问题
HSV色彩空间里面红色是处于0度附近,然而在opencv里面,红色H通道的范围因其在0度正负方向均有存在,导致实际的np.array的取值范围变成了两个
(百度AI给的样例就是这个问题,其他博主的示例代码基本也包含了HSV色彩空间中0度正方向lower_red_1和upper_red_1这一部分,造成了只识别更鲜艳、更明亮的这一部分红色,而忽略了0度负方向lower_red_2和upper_red_2这些更浓厚、更暗的红色,可参考下表)
色彩空间锥形图来源:
RGB颜色空间、HSV颜色空间的理解 - warmbeast - 博客园
HSV取值范围来源: