OpenCV Python下HSV无法消除黄色,求助保留红色图形的方案
解决HSV颜色空间过滤红色、去除黄色的问题
首先,你遇到的核心问题是红色在HSV颜色空间里是一个跨区间的颜色——它的色相(H)值分布在0°附近和180°(对应HSV里的179)附近,而黄色的H值大概在20-30左右。如果只用单一的H阈值范围,要么会漏掉部分红色,要么会把黄色也包含进来。
下面是修改后的代码,我帮你调整了逻辑,加入了双区间的mask合并,同时完善了trackbar的回调和阈值读取逻辑:
import cv2 import numpy as np def callback(x): pass cap = cv2.VideoCapture(0) cv2.namedWindow('image') # 初始化红色的两个HSV区间参数 ilowH1 = 0 ihighH1 = 10 ilowH2 = 170 ihighH2 = 179 ilowS = 50 # 提高最低饱和度,过滤低饱和的黄色/浅色 ihighS = 255 ilowV = 50 # 提高最低明度,过滤过暗的区域 ihighV = 255 # 创建所有需要的trackbar cv2.createTrackbar('lowH1', 'image', ilowH1, 179, callback) cv2.createTrackbar('highH1', 'image', ihighH1, 179, callback) cv2.createTrackbar('lowH2', 'image', ilowH2, 179, callback) cv2.createTrackbar('highH2', 'image', ihighH2, 179, callback) cv2.createTrackbar('lowS', 'image', ilowS, 255, callback) cv2.createTrackbar('highS', 'image', ihighS, 255, callback) cv2.createTrackbar('lowV', 'image', ilowV, 255, callback) cv2.createTrackbar('highV', 'image', ihighV, 255, callback) while True: ret, frame = cap.read() if not ret: break # 转换为HSV颜色空间 hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV) # 获取当前trackbar的阈值 lowH1 = cv2.getTrackbarPos('lowH1', 'image') highH1 = cv2.getTrackbarPos('highH1', 'image') lowH2 = cv2.getTrackbarPos('lowH2', 'image') highH2 = cv2.getTrackbarPos('highH2', 'image') lowS = cv2.getTrackbarPos('lowS', 'image') highS = cv2.getTrackbarPos('highS', 'image') lowV = cv2.getTrackbarPos('lowV', 'image') highV = cv2.getTrackbarPos('highV', 'image') # 定义两个红色区间的lower和upper数组 lower_red1 = np.array([lowH1, lowS, lowV]) upper_red1 = np.array([highH1, highS, highV]) lower_red2 = np.array([lowH2, lowS, lowV]) upper_red2 = np.array([highH2, highS, highV]) # 生成两个mask并合并 mask1 = cv2.inRange(hsv, lower_red1, upper_red1) mask2 = cv2.inRange(hsv, lower_red2, upper_red2) mask = cv2.bitwise_or(mask1, mask2) # 将mask应用到原图像,只保留红色区域 result = cv2.bitwise_and(frame, frame, mask=mask) # 显示原图和结果 cv2.imshow('original', frame) cv2.imshow('image', result) # 按q退出 if cv2.waitKey(1) & 0xFF == ord('q'): break cap.release() cv2.destroyAllWindows()
调整技巧:
- 先固定
lowH1在0-10,lowH2在170-179,这两个区间基本覆盖了所有纯正的红色,同时避开了黄色的H范围(20-30)。 - 慢慢提高
lowS和lowV的值:黄色有时候饱和度或明度较低,提高这两个阈值可以过滤掉那些偏浅的黄色区域,同时不会影响饱和度高的红色。 - 如果还有少量黄色残留,可以微调
highH1(比如降到8)和lowH2(比如升到172),进一步缩小红色的H范围,完全避开黄色的区间。
内容的提问来源于stack exchange,提问作者lucians
相关产品推荐
相关产品推荐

