OpenCV颜色范围过滤提取围棋棋盘失败,求正确颜色范围设置
问题描述
我正在测试多种从图像中提取围棋棋盘的方法(示例图如下):
我有几个思路,其中之一是让用户选择棋盘颜色后进行一定范围的颜色过滤。我尝试用OpenCV实现该思路,但可能对颜色空间理解有误,导致输出图像全黑。以下是我使用的代码:
import cv2 import numpy as np img = cv2.imread(cv2.samples.findFile('data/go_board2.jpeg')) # 将图像从BGR颜色空间转换为HSV颜色空间 hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV) lower_brown = np.array([34, 10, 95]) upper_brown = np.array([25, 49, 49]) # 生成颜色掩码 mask = cv2.inRange(hsv, lower_brown, upper_brown) # 保留掩码内的图像区域 result = cv2.bitwise_and(img, img, mask = mask) cv2.imwrite("res/color/img.jpg", img) cv2.imwrite("res/color/mask.jpg", mask) cv2.imwrite("res/color/result.jpg", result)
我设定[34, 10, 95]为浅棕色,[25, 49, 49]为深棕色,格式是[色调(Hue), 饱和度(Saturation), 明度(Value)],但显然该颜色范围为空。请问如何正确设置我需要的范围(棋盘深浅棕色之间的颜色)?
解决方案
核心问题是HSV范围的上下限逻辑错误,同时对棕色的HSV取值区间理解有误,修正方法如下:
修正上下限顺序
OpenCV的cv2.inRange()要求lower数组的每个分量必须小于等于upper数组的对应分量。你当前的Hue分量下限34大于上限25,直接导致颜色范围为空,所以掩码全黑,最终输出也全黑。设置正确的棕色HSV范围
棕色在HSV空间的典型取值区间为:
- 色调(Hue):10~30(属于红黄色系偏向棕色的区间)
- 饱和度(Saturation):40~100(保证棕色的色彩浓度,避免和灰色混淆)
- 明度(Value):60~180(覆盖深浅棕色的明度范围)
调整后的代码:
import cv2 import numpy as np img = cv2.imread(cv2.samples.findFile('data/go_board2.jpeg')) hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV) # 深棕色为下限,浅棕色为上限 lower_brown = np.array([10, 40, 60]) upper_brown = np.array([30, 100, 180]) mask = cv2.inRange(hsv, lower_brown, upper_brown) result = cv2.bitwise_and(img, img, mask = mask) cv2.imwrite("res/color/img.jpg", img) cv2.imwrite("res/color/mask.jpg", mask) cv2.imwrite("res/color/result.jpg", result)
- 精准获取颜色范围的技巧
如果需要针对特定棋盘的棕色做更精准过滤,可以:
- 提取棋盘上的棕色像素点,转换为HSV值
- 围绕该值设置±10左右的Hue范围,±20左右的饱和度和明度范围
- 用OpenCV滑动条工具实时调整HSV上下限,找到最匹配的区间
内容的提问来源于stack exchange,提问作者M Millo
相关产品推荐
相关产品推荐

