黄色车道线的 HSL 范围

Posted

技术标签:

【中文标题】黄色车道线的 HSL 范围【英文标题】:HSL range for yellow lane lines 【发布时间】:2019-09-13 07:11:34 【问题描述】:

我目前正在研究简单的车道检测,但在查找黄色车道线的范围/输入值时遇到了一些麻烦。

def color_filter(image):
    #convert to HLS to mask based on HLS
    hls = cv2.cvtColor(image, cv2.COLOR_BGR2HLS)
    lower = np.array([0,190,0])
    upper = np.array([255,255,255])

    yellower = np.array([40,70,60]) #NOT SURE WHAT TO PUT
    yelupper = np.array([50,90,65]) #NOT SURE WHAT TO PUT

    yellowmask = cv2.inRange(hls, yellower, yelupper)    
    whitemask = cv2.inRange(hls, lower, upper)

    mask = cv2.bitwise_or(yellowmask, whitemask)  
    masked = cv2.bitwise_and(image, image, mask = mask)    

    return masked

这是我过滤后的图像(仅显示白色车道):

http://prntscr.com/ng2cgp

这是原图:

http://prntscr.com/ng2cx6

【问题讨论】:

***.com/questions/10948589/… 【参考方案1】:

我建议,您可以进一步阅读有关 HSL/HSV 颜色空间如何工作的内容,可能从 Wikipedia article 开始?此外,为了轻松获得一些初始值,您可以使用 HSL 计算器,例如this一个。

为了检测图像中的白色部分,色调 (H) 值可能是任意的,只要亮度 (L) 值足够高(我们想要明亮的颜色),饱和度 (S) 值是足够低(我们想要低饱和度的颜色)。

一般来说,H 值在[0 ... 360] 之内,而 S 和 L 值在[0.0 ... 1.0] 之内。 color conversions 上的 OpenCV 文档告诉您,这些值映射到 [0 ... 180] 内的 H,以及 [0 ... 255] 内的 S 和 L(对于 8 位图像)。

现在,为了检测图像中的黄色部分,可以通过“玩弄”从上述 HSL 计算器中获取适当的 H、S 和 L 值,这可能适合在图像中找到的颜色图片。

我准备了以下示例代码,请看:

import cv2
import numpy as np

# Load input image
input = cv2.imread('images/input.png', cv2.IMREAD_COLOR)

# Convert to HLS color space
hls = cv2.cvtColor(input, cv2.COLOR_BGR2HLS)

# White-ish areas in image
# H value can be arbitrary, thus within [0 ... 360] (OpenCV: [0 ... 180])
# L value must be relatively high (we want high brightness), e.g. within [0.7 ... 1.0] (OpenCV: [0 ... 255])
# S value must be relatively low (we want low saturation), e.g. within [0.0 ... 0.3] (OpenCV: [0 ... 255])
white_lower = np.array([np.round(  0 / 2), np.round(0.75 * 255), np.round(0.00 * 255)])
white_upper = np.array([np.round(360 / 2), np.round(1.00 * 255), np.round(0.30 * 255)])
white_mask = cv2.inRange(hls, white_lower, white_upper)

# Yellow-ish areas in image
# H value must be appropriate (see HSL color space), e.g. within [40 ... 60]
# L value can be arbitrary (we want everything between bright and dark yellow), e.g. within [0.0 ... 1.0]
# S value must be above some threshold (we want at least some saturation), e.g. within [0.35 ... 1.0]
yellow_lower = np.array([np.round( 40 / 2), np.round(0.00 * 255), np.round(0.35 * 255)])
yellow_upper = np.array([np.round( 60 / 2), np.round(1.00 * 255), np.round(1.00 * 255)])
yellow_mask = cv2.inRange(hls, yellow_lower, yellow_upper)

# Calculate combined mask, and masked image
mask = cv2.bitwise_or(yellow_mask, white_mask)
masked = cv2.bitwise_and(input, input, mask = mask)

# Write output images
cv2.imwrite('images/white_mask.png', white_mask)
cv2.imwrite('images/yellow_mask.png', yellow_mask)
cv2.imwrite('images/masked.png', masked)

白色面具看起来像这样:

黄色面具看起来像这样:

您的代码中的蒙版图像如下所示:

如您所见,必须对参数进行微调。但我希望,你现在已经大致了解了,并且可以自己继续。

【讨论】:

以上是关于黄色车道线的 HSL 范围的主要内容,如果未能解决你的问题,请参考以下文章

使用范围滑块通过 javascript 更改 HSL 背景颜色

OpenCV 4.0 车道检测

[搬运]自动驾驶中的单目 3D 车道线检测——综述

HSL色彩模式

基于先验时间一致性车道线的IPM相机外参标定

将 Hsl 转换为 rgb 和 hex