Я бы перевернул проблему и сказал, что мы ищем фары ВЫШЕ определенной линии, а не говорил, что фары находятся ниже определенной линии, т.е. горизонта,
Ваши изображения имеют очень сильное отражение на асфальте, и мы можем использовать это в наших интересах. Мы знаем, что максимальное количество света на изображении находится где-то вокруг отражения и фар. Поэтому мы ищем ряд с максимальным освещением и используем его в качестве пола. Затем ищите фары выше этого этажа.
Идея здесь в том, что мы смотрим на профиль интенсивности построчно и находим строку с максимальным значением.
Это будет работать только с темными изображениями (например, ночью) и там, где отражение фар на асфальте велико.
Он НЕ будет работать с изображениями, сделанными при дневном свете.
Я написал это на Python и OpenCV, но я уверен, что вы можете перевести его на язык по вашему выбору.
import matplotlib.pylab as pl
import cv2
# Load the image
im = cv2.imread('headlights_at_night2.jpg')
# Convert to grey.
grey_image = cv2.cvtColor(im, cv2.COLOR_BGR2GRAY)
Сильно сгладьте изображение, чтобы замаскировать любые локальные пики или впадины. Мы пытаемся сгладить фары и отражение, чтобы получился хороший пик. В идеале фары и отражение сливались бы в одну область
grey_image = cv2.blur(grey_image, (15,15))
Суммируйте интенсивности построчно
intensity_profile = []
for r in range(0, grey_image.shape[0]):
intensity_profile.append(pl.sum(grey_image[r,:]))
Сгладьте профиль и преобразуйте его в массив numpy для удобной обработки данных.
window = 10
weights = pl.repeat(1.0, window)/window
profile = pl.convolve(pl.asarray(intensity_profile), weights, 'same')
Найдите максимальное значение профиля. Это представляет координату y фар и площадь отражения. Тепловая карта слева показывает распределение. На правом графике показано общее значение интенсивности для каждой строки.
Мы можем ясно видеть, что сумма интенсивностей имеет пик. Координата y равна 371 и обозначена красной точкой на тепловой карте и красной пунктирной линией на графике.
max_value = profile.max()
max_value_location = pl.where(profile==max_value)[0]
horizon = max_value_location
Синяя кривая на крайнем правом рисунке представляет переменную profile
.
Строка, в которой мы находим максимальное значение, является нашим полом. Затем мы знаем, что фары находятся выше этой линии. Мы также знаем, что большая часть верхней части изображения будет занята небом и, следовательно, будет темной.
Я показываю результат ниже. Я знаю, что линии на обоих изображениях имеют почти одинаковые координаты, но я думаю, что это просто совпадение.
person
kkuilla
schedule
12.04.2014