我想检测黄色和白色的车道。
如果我使用RGB颜色空间,
def select_rgb_white_yellow(image): # 白色颜色掩码 lower = np.uint8([123, 116, 116]) upper = np.uint8([186, 172, 160]) white_mask = cv2.inRange(image, lower, upper) # 黄色颜色掩码 lower = np.uint8([134, 121, 100]) upper = np.uint8([206, 155, 87]) yellow_mask = cv2.inRange(image, lower, upper) # 合并掩码 mask = cv2.bitwise_or(white_mask, yellow_mask) masked = cv2.bitwise_and(image, image, mask = mask) return masked
我只能检测到白色的车道。
所以我稍微调整了一下,使用HLS颜色空间,通过以下代码。
def convert_hls(image): return cv2.cvtColor(image, cv2.COLOR_RGB2HLS)
然后,再次提取黄色和白色的车道,
def select_white_yellow(image): converted = convert_hls(image) # 白色颜色掩码 lower = np.uint8([0, 0, 0]) upper = np.uint8([0, 0, 255]) white_mask = cv2.inRange(converted, lower, upper) # 黄色颜色掩码 lower = np.uint8([ 10, 0, 100]) upper = np.uint8([ 40, 255, 255]) yellow_mask = cv2.inRange(converted, lower, upper) # 合并掩码 mask = cv2.bitwise_or(white_mask, yellow_mask) return cv2.bitwise_and(image, image, mask = mask)
然后它就无法再检测到白色的车道了。有什么好的方法可以同时检测黄色和白色的车道吗?
这里是我找到的所有RGB颜色代码
Yellowc2974A (194, 149, 74)a07444 (160, 116, 68)b38e55 (179, 142, 85)867964 (134, 121, 100)ce9b57 (206, 155, 87)ce9853 (206, 152, 83)whiteb4a59d (180, 165, 157)b9a99a (185, 169, 154)baaca0 (186, 172, 160)867e79 (134, 126, 121)7b7474 (123, 116, 116)827d7c (130, 125, 124)
回答:
为了扩展评论:这是一个两阶段方法的实现。花一些时间查看中间图像/掩码,以完全理解发生的一切。
裁剪到感兴趣区域
你可以自动化这个过程,但我作弊了一点,进行了手动裁剪。裁剪掉的天空区域很少会有路面,这是目前我认为足够简单的一个解决方案。同样,我还裁剪了右侧的HUD框,因为它们与道路有相似的灰色,会干扰检测。更整洁的做法是在它们上面画黑框,这样它们就可以从处理中排除。
隔离道路
将裁剪后的图像转换为HSV格式,并选择仅灰色值。在进行了一些噪声去除后,我通过findContours改进了掩码,绘制了convexhull。如果性能是一个问题,你可以通过调整close mask
步骤来跳过它。
选择线条
使用掩码,你可以创建一个仅包含道路表面的图像。你可以使用这个进行颜色分离,而不必担心也选择周围环境。我的结果不是完美的,但我假设你有更大版本的图像,这将给出更好的结果。
代码:
import cv2import numpy as np # 加载图像image = cv2.imread('pw12b.jpg')# 裁剪图像h,w = image.shape[:2]image = image[200:h-20,20:550]# 创建HSVhsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)# 设置颜色下限和上限low_val = (0,0,0)high_val = (179,45,96)# 阈值化HSV图像 mask = cv2.inRange(hsv, low_val,high_val)# 去除噪声mask = cv2.morphologyEx(mask, cv2.MORPH_OPEN, kernel=np.ones((8,8),dtype=np.uint8))# 闭合掩码mask = cv2.morphologyEx(mask, cv2.MORPH_CLOSE, kernel=np.ones((20,20),dtype=np.uint8))# 通过绘制convexhull改进掩码 ret, contours, hierarchy = cv2.findContours(mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)for cnt in contours: hull = cv2.convexHull(cnt) cv2.drawContours(mask,[hull],0,(255), -1)# 稍微侵蚀掩码以减轻convexhull的掩码溢出mask = cv2.morphologyEx(mask, cv2.MORPH_ERODE, kernel=np.ones((5,5),dtype=np.uint8))# 删除此行,用于显示道路掩码的中间结果road = cv2.bitwise_and(image, image,mask=mask)# 将掩码应用于HSV图像road_hsv = cv2.bitwise_and(hsv, hsv,mask=mask)# 设置颜色下限和上限low_val = (0,0,102)high_val = (179,255,255)# 阈值化HSV图像 mask2 = cv2.inRange(road_hsv, low_val,high_val)# 将掩码应用于原始图像result = cv2.bitwise_and(image, image,mask=mask2)#显示图像cv2.imshow("Result", result)cv2.imshow("Road", road)cv2.imshow("Mask", mask)cv2.imshow("Image", image)cv2.waitKey(0)cv2.destroyAllWindows()