OpenCV - обнаружение дорожек, желтая и белая дорожки - PullRequest
1 голос
/ 28 апреля 2019

У меня есть дорожные фотографии из гоночной игры.enter image description here

Я хочу обнаружить желтые и белые полосы.Если я использую пространство RGB,

def select_rgb_white_yellow(image): 
    # white color mask
    lower = np.uint8([123, 116, 116])
    upper = np.uint8([186, 172, 160])
    white_mask = cv2.inRange(image, lower, upper)
    # yellow color mask
    lower = np.uint8([134, 121, 100])
    upper = np.uint8([206, 155, 87])
    yellow_mask = cv2.inRange(image, lower, upper)
    # combine the mask
    mask = cv2.bitwise_or(white_mask, yellow_mask)
    masked = cv2.bitwise_and(image, image, mask = mask)
    return masked

enter image description here

, я получаю только белые полосы.Так немного подправил, используя пространство HLS, используя этот код.

def convert_hls(image):
    return cv2.cvtColor(image, cv2.COLOR_RGB2HLS)

enter image description here

Затем, снова извлекая желтую и белую полосы,

def select_white_yellow(image):
    converted = convert_hls(image)
    # white color mask
    lower = np.uint8([0, 0, 0])
    upper = np.uint8([0, 0, 255])
    white_mask = cv2.inRange(converted, lower, upper)
    # yellow color mask
    lower = np.uint8([ 10,   0, 100])
    upper = np.uint8([ 40, 255, 255])
    yellow_mask = cv2.inRange(converted, lower, upper)
    # combine the mask
    mask = cv2.bitwise_or(white_mask, yellow_mask)
    return cv2.bitwise_and(image, image, mask = mask)

enter image description here

Тогда он больше не сможет обнаружить белую полосу движения.Есть ли хороший способ обнаружить как белую, так и желтую полосу?

Вот весь код цвета RGB, который я нашел

Yellow
c2974A (194, 149, 74)
a07444 (160, 116, 68)
b38e55 (179, 142, 85)
867964 (134, 121, 100)
ce9b57 (206, 155, 87)
ce9853 (206, 152, 83)

white
b4a59d (180, 165, 157)
b9a99a (185, 169, 154)
baaca0 (186, 172, 160)
867e79 (134, 126, 121)
7b7474 (123, 116, 116)
827d7c (130, 125, 124)

1 Ответ

1 голос
/ 28 апреля 2019

Чтобы расширить комментарий: это реализация двухэтапного подхода. Потратьте некоторое время на просмотр промежуточных изображений / масок, чтобы полностью понять все, что происходит.

Обрезка в интересующей области
Вы можете автоматизировать это, но я немного обманул и сделал это вручную. Обрезанная область неба редко когда-либо будет иметь дорожное покрытие, это простое решение, которого, на мой взгляд, достаточно (на данный момент). Точно так же я также вырезал поля HUD с правой стороны, так как они имели серый цвет, похожий на дорогу и мешали. Более аккуратно рисовать над ними чёрные ящики, чтобы они исключались из обработки.

Изолирующая дорога
Преобразуйте обрезанное изображение в HSV и выберите только значения серого. После некоторого удаления шума я улучшил маску, используя findContours для рисования выпуклой оболочки. Если производительность является проблемой, вы можете пропустить ее, настроив шаг close mask.

Выбор линий
С помощью маски вы можете создать изображение только дорожного покрытия. Вы можете использовать это для цветоделения, не беспокоясь о выборе окружения. Мой результат не идеален, но я предполагаю, что у вас есть увеличенные версии изображений, которые дадут лучшие результаты.

Результат: enter image description here

Код:

import cv2
import numpy as np 

# load image
image = cv2.imread('pw12b.jpg')
# crop image
h,w = image.shape[:2]
image = image[200:h-20,20:550]
# create hsv
hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
# set lower and upper color limits
low_val = (0,0,0)
high_val = (179,45,96)
# Threshold the HSV image 
mask = cv2.inRange(hsv, low_val,high_val)
# remove noise
mask = cv2.morphologyEx(mask, cv2.MORPH_OPEN, kernel=np.ones((8,8),dtype=np.uint8))
# close mask
mask = cv2.morphologyEx(mask, cv2.MORPH_CLOSE, kernel=np.ones((20,20),dtype=np.uint8))

# improve mask by drawing the 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)
# erode mask a bit to migitate mask bleed of convexhull
mask = cv2.morphologyEx(mask, cv2.MORPH_ERODE, kernel=np.ones((5,5),dtype=np.uint8))

# remove this line, used to show intermediate result of masked road
road = cv2.bitwise_and(image, image,mask=mask)

# apply mask to hsv image
road_hsv = cv2.bitwise_and(hsv, hsv,mask=mask)
# set lower and upper color limits
low_val = (0,0,102)
high_val = (179,255,255)
# Threshold the HSV image 
mask2 = cv2.inRange(road_hsv, low_val,high_val)
# apply mask to original image
result = cv2.bitwise_and(image, image,mask=mask2)

#show image
cv2.imshow("Result", result)
cv2.imshow("Road", road)
cv2.imshow("Mask", mask)
cv2.imshow("Image", image)

cv2.waitKey(0)
cv2.destroyAllWindows()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...