Удаление теней на полосах движения
Я работаю над обнаружением линий полосы движения. Моя текущая рабочая стратегия:
определение области интереса, где могут быть линии
Деформация изображения, чтобы получить вид с высоты птичьего полета
Преобразование изображения в цветовое пространство YUV
Нормализация Y канала
Подгонка полинома второго порядка и подход скользящего окна
все работает нормально, но там, где есть тени, алгоритм не работает. Я пробовал адаптивный порог, но не удалось.
Исходное изображение без тени:
Обработанное исходное изображение без тени:
Исходное изображение с тенью:
Обработанное исходное изображение с тенью:
На втором изображении видно, что затененная область не обнаружена. На самом деле тени сбрасывают значения изображения вниз, поэтому я попытался портировать изображение с новыми значениями ниже, чем предыдущее новое изображение можно найти здесь:
Эта техника не работает, так как она имеет много шума
В настоящее время я пробую фоновые методы вычитания и удаления теней, но они не работают. Я поражен в этой проблеме с прошлых 2 3 недель. Любая помощь будет по достоинству оценена...
import cv2
import matplotlib.pyplot as plt
import numpy as np
from helper_functions import undistort, threshholding, unwarp,sliding_window_polyfit
from helper_functions import polyfit_using_prev_fit,calc_curv_rad_and_center_dist
from Lane_Lines_Finding import RoI
img = cv2.imread('./test_images/new_test.jpg')
new =undistort(img)
new = cv2.cvtColor(new, cv2.COLOR_RGB2BGR)
#new = threshholding(new)
h,w = new.shape[:2]
# define source and destination points for transform
imshape = img.shape
vertices = np.array([[
(257,670),
(590, 446),
(722, 440),
(1150,650)
]],
dtype=np.int32)
p1 = (170,670)
p2 = (472, 475)
p3 = (745, 466)
p4 = (1050,650)
vertices = np.array([[p1,
p2,
p3,
p4
]],
dtype=np.int32)
masked_edges = RoI(new, vertices)
#masked_edges = cv2.cvtColor(masked_edges, cv2.COLOR_RGB2BGR)
src = np.float32([(575,464),
(707,464),
(258,682),
(1049,682)])
dst = np.float32([(450,0),
(w-450,0),
(450,h),
(w-450,h)])
warp_img, M, Minv = unwarp(masked_edges, src, dst)
warp_img = increase_brightness_img(warp_img)
warp_img = contrast_img(warp_img)
YUV = cv2.cvtColor(warp_img, cv2.COLOR_RGB2YUV)
Y,U,V = cv2.split(YUV)
Y_equalized= cv2.equalizeHist(Y)
YUV = cv2.merge((Y,U,V))
thresh_min = 253
thresh_max = 255
binary = np.zeros_like(Y)
binary[(Y_equalized>= thresh_min) & (Y_equalized <= thresh_max)] = 1
kernel_opening= np.ones((3,3),np.uint8)
opening = cv2.morphologyEx(binary, cv2.MORPH_OPEN, kernel_opening)
kernel= np.ones((7,7),np.uint8)
dilation = cv2.dilate(opening,kernel,iterations = 3)
1 ответ
Удаление теней - непростая задача при обработке изображений. Есть много способов, которые вы можете попробовать. Но проверьте раздел 3 этой статьи, http://lxu.me/mypapers/XuL_ShadowRemoval.pdf. Кажется, у них есть достойный алгоритм, и он хорошо написан и лаконичен.