Область интереса для обнаружения транспортных средств в ночное время

Я разрабатываю проект обнаружения фар транспортных средств в ночной сцене. Я работаю над демо на MATLAB. Моя проблема в том, что мне нужно найти область интереса (ROI), чтобы получить низкие вычислительные требования. Я исследовал многие статьи, и они просто используют фиксированную область интереса, подобную этой, верхняя часть игнорируется, а нижняя используется для последующего анализа.

введите здесь описание изображения

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

введите здесь описание изображениявведите здесь описание изображения

Если у кого-то есть какие-либо идеи, пожалуйста, дайте мне несколько предложений.


person user3049831    schedule 08.04.2014    source источник
comment
Что если вы посмотрите на компонент V пространства HSV? Я предполагаю, что это даст вам отправную точку.   -  person kkuilla    schedule 08.04.2014
comment
Вы имеете в виду, что я должен основываться на яркости? Я пробовал, но не знаю, как различить 2 региона.   -  person user3049831    schedule 10.04.2014
comment
Было бы полезно, если бы вы обновили свой вопрос изображением, на котором вы выделяете регионы, которые хотите сегментировать, например, красным цветом вручную.   -  person kkuilla    schedule 10.04.2014
comment
в основном я хочу отбросить верхнюю более темную часть и обработать только нижнюю более яркую часть изображения.   -  person user3049831    schedule 11.04.2014
comment
Вы не указали, какие регионы вам интересны. Добавьте два дополнительных изображения и покажите области, которые вы хотите идентифицировать. Не совсем понятно, какие регионы вам нужны, а значит, у вас будет меньше шансов получить полезный ответ.   -  person kkuilla    schedule 11.04.2014


Ответы (2)


Я бы перевернул проблему и сказал, что мы ищем фары ВЫШЕ определенной линии, а не говорил, что фары находятся ниже определенной линии, т.е. горизонта,

Ваши изображения имеют очень сильное отражение на асфальте, и мы можем использовать это в наших интересах. Мы знаем, что максимальное количество света на изображении находится где-то вокруг отражения и фар. Поэтому мы ищем ряд с максимальным освещением и используем его в качестве пола. Затем ищите фары выше этого этажа.

Идея здесь в том, что мы смотрим на профиль интенсивности построчно и находим строку с максимальным значением.

Это будет работать только с темными изображениями (например, ночью) и там, где отражение фар на асфальте велико.

Он НЕ будет работать с изображениями, сделанными при дневном свете.

Я написал это на 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

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

grey_image = cv2.blur(grey_image, (15,15))

grey_blurred

Суммируйте интенсивности построчно

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.

Строка, в которой мы находим максимальное значение, является нашим полом. Затем мы знаем, что фары находятся выше этой линии. Мы также знаем, что большая часть верхней части изображения будет занята небом и, следовательно, будет темной.

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

final1финал2

person kkuilla    schedule 12.04.2014
comment
спасибо за ваш исчерпывающий ответ. Это мне очень помогает. У меня еще 1 вопрос: Как вы рассчитываете интенсивность каждого ряда? Вы только что добавили все значения пикселей строки? - person user3049831; 13.04.2014
comment
да. Вы берете каждую строку и суммируете интенсивность для каждой строки. вы получите вектор с элементами 1x640 (если у вас 640 строк). Одно значение для каждой строки. - person kkuilla; 13.04.2014
comment
@ Бенуа_11 Спасибо. Я использовал эту технику на микроскопических изображениях, чтобы найти поверхность чашки, на которой находились клетки. Приятно получить признание от кого-то со схожим опытом и интересами (включая хоккей :-)). - person kkuilla; 26.05.2015
comment
@kkuilla, не могли бы вы объяснить, как вы рассчитали тепловую карту? Переменные профиля и интенсивности_профиля являются векторами, но тепловая карта должна исходить из 2D-матрицы. Как значения max_value и Horizon были использованы для получения результирующего изображения? - person Vendetta; 01.04.2020
comment
@Vendetta Тепловая карта - это просто grey_image, отображаемый с другой цветовой картой. Кажется, я использовал цветовую карту струи. Я не могу точно найти, как я это сделал, но это очень похоже на это.. - person kkuilla; 01.04.2020
comment
@kkuilla, Спасибо, понял. Не могли бы вы также предложить, как мне обнаружить фары на изображении выше после установки горизонтальной линии в качестве ROI? - person Vendetta; 02.04.2020
comment
@Vendetta Вы можете начать с поиска строки с наибольшей интенсивностью. Как только вы это узнаете, вы узнаете, в какой области изображения находятся огни, и это даст вам отправную точку. Таким образом, вы можете просмотреть каждую строку изображения сверху до горизонтальной линии и взять, например. среднее значение каждой строки. Наибольшее среднее значение подскажет, в каком ряду могут быть фары. Вам придется поэкспериментировать с максимальным значением, средним значением, медианой и т. д., чтобы увидеть, будет ли оно работать. - person kkuilla; 03.04.2020
comment
@kkuilla, спасибо, это полезно. Но мне интересно, нужно ли мне проходить каждую строку каждого изображения? есть ли способ использовать вышеуказанную технику, где вы рассчитали макс. интенсивность вдоль строки, чтобы я мог установить порог для строк, которые будут проверены на максимальную интенсивность? - person Vendetta; 03.04.2020
comment
@Vendetta Извините, но я не уверен, что понимаю. Я не понимаю `каждая строка каждого изображения?` - person kkuilla; 03.04.2020
comment
Думаю, поиск горизонтальной линии — это всего лишь этап предварительной обработки. Другой подход заключается в вычислении градиента изображения. Чем выше интенсивность, тем выше градиент. Затем вы можете использовать второй, чтобы получить местоположение этих максимальных интенсивностей. - person kkuilla; 03.04.2020
comment
@kkuilla, это опечатка, я имел в виду изображение, а не каждое изображение. Спасибо за полезные предложения. Кстати, вы сказали Тогда вы можете использовать второй, чтобы получить то, что здесь второе? - person Vendetta; 03.04.2020
comment
@Vendetta Second имеет в виду вторую производную изображения. Первая производная (градиент первого порядка) даст вам пики. Второй (градиент второго порядка) даст вам их расположение. Это тот же принцип, что и производные, изучаемые в школе, если вы изучали математику. - person kkuilla; 06.04.2020

Вы можете попробовать уменьшить разрешение изображения.

person dhanushka    schedule 10.04.2014
comment
что ты имеешь в виду? Я не понимаю. - person user3049831; 10.04.2014
comment
из вашего вопроса я понимаю, что вы уже знаете, как определить, что вы хотите, и ваша главная забота - скорость. если кадры изображения слишком велики, вы можете уменьшить их масштаб и обработать уменьшенную версию. тем не менее, вы должны выбрать масштаб таким образом, чтобы он не повлиял отрицательно на точность. - person dhanushka; 10.04.2014
comment
а понижение частоты дискретизации — это не то же самое, что изменение размера. хотя я не могу сказать наверняка, это может быть быстрее, чем интерполяция (изменение размера Matlab использует интерполяцию) - person dhanushka; 10.04.2014
comment
Да, ты прав. Я концентрируюсь на скорости, но моя цель - обработать изображение в формате HD, поэтому мне нужно сохранить тот же размер изображения. - person user3049831; 11.04.2014
comment
вы можете использовать кадры изображения с пониженной частотой дискретизации для обнаружения областей интереса (ROI). Как только вы узнаете области интереса в уменьшенной версии, вы можете легко проецировать их на изображение HD, извлекать эти области и обрабатывать их. - person dhanushka; 11.04.2014
comment
надеюсь, что следующий пример поможет, если то, что я предлагаю, вам непонятно. когда-то мне пришлось локализовать чек на изображении размером ~ 3MP. Я понизил разрешение изображения и запустил на нем свой алгоритм локализации, извлек ROI, спроецировал его на исходное изображение ~ 3MP и извлек чек. затем я выполнил необходимую обработку (например, бинаризацию) в области, которую я извлек из изображения ~ 3MP. - person dhanushka; 11.04.2014