You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

火山引擎 最新活动