OpenCV中HSV颜色范围设置咨询:过滤蓝色及保留指定颜色
如何设置HSV颜色范围保留白色、红色和黄色像素?
这问题我之前做交通标志检测时也碰到过,OpenCV的HSV范围确实容易搞混,尤其是不同工具的HSV刻度和常规设计不一样——OpenCV里H(色调)的范围是0-179,S(饱和度)和V(亮度)是0-255,这点要先明确,不然很容易和PS等工具的数值对不上。
下面给你针对白色、红色、黄色的具体范围设置,以及合并掩码的实现方法:
1. 白色的HSV范围
白色的核心特点是低饱和度+高亮度,几乎没有色彩倾向,所以H可以覆盖全范围:
- 下限:
(0, 0, 200) - 上限:
(179, 25, 255)
微调建议:如果场景中有偏灰的浅白色,可把V的下限调低到180左右;如果想过滤掉接近白色的浅灰,可提高S的上限到30。
2. 黄色的HSV范围
黄色的色调集中在20-30区间,需要一定的饱和度和亮度来区分于白色:
- 下限:
(20, 100, 100) - 上限:
(30, 255, 255)
微调建议:如果是偏暗的黄色交通标志,可把V的下限调低到80;如果是亮黄色,可适当提高S的下限到120。
3. 红色的HSV范围
红色比较特殊,因为它在HSV色轮的首尾两端,所以需要两个区间来覆盖完整的红色范围:
- 第一区间(偏橙红):
(0, 100, 100)到(10, 255, 255) - 第二区间(偏紫红):
(160, 100, 100)到(179, 255, 255)
微调建议:如果是淡红色(比如褪色的标志),可把S的下限调低到80;如果是深红色,可提高V的下限到120。
合并掩码的代码实现
在OpenCV中,你需要分别创建每个颜色的掩码,再通过cv2.bitwise_or合并,最终过滤出目标颜色:
import cv2 import numpy as np # 读取图像并转换为HSV格式(OpenCV默认是BGR,所以要转) img = cv2.imread("your_image.jpg") hsv_img = cv2.cvtColor(img, cv2.COLOR_BGR2HSV) # 定义各颜色的HSV上下限 # 白色 lower_white = np.array([0, 0, 200]) upper_white = np.array([179, 25, 255]) # 黄色 lower_yellow = np.array([20, 100, 100]) upper_yellow = np.array([30, 255, 255]) # 红色(两个区间) lower_red1 = np.array([0, 100, 100]) upper_red1 = np.array([10, 255, 255]) lower_red2 = np.array([160, 100, 100]) upper_red2 = np.array([179, 255, 255]) # 创建单个颜色的掩码 mask_white = cv2.inRange(hsv_img, lower_white, upper_white) mask_yellow = cv2.inRange(hsv_img, lower_yellow, upper_yellow) mask_red = cv2.bitwise_or(cv2.inRange(hsv_img, lower_red1, upper_red1), cv2.inRange(hsv_img, lower_red2, upper_red2)) # 合并所有颜色的掩码 total_mask = cv2.bitwise_or(mask_white, cv2.bitwise_or(mask_yellow, mask_red)) # 应用掩码到原图像,得到保留目标颜色的结果 filtered_img = cv2.bitwise_and(img, img, mask=total_mask) # 展示结果 cv2.imshow("Filtered Result", filtered_img) cv2.waitKey(0) cv2.destroyAllWindows()
实用调试技巧
- 用滑动条实时调整:写个小脚本创建HSV滑动条,动态查看掩码效果,能快速找到适配你场景的精确数值,比硬调参数高效得多。
- 处理光照干扰:如果图像有强光或阴影,可调整V的上下限——强光下提高V上限,阴影下降低V下限;同时可先对图像做高斯模糊(
cv2.GaussianBlur),减少噪声对颜色检测的影响。 - 测试不同场景:同一颜色在不同光照、天气下的HSV表现差异很大,建议多拿几张实际场景的图片测试调整。
内容的提问来源于stack exchange,提问作者Ahmet Tıkna




