黄色车道线的 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 范围的主要内容,如果未能解决你的问题,请参考以下文章