Вступление
Я работаю над проектом в OpenCV на C ++ и пытаюсь классифицировать небольшое изображение (кадр из видео), содержащее множество ребер, на две группы. Я также хотел бы сохранить информацию о том, насколько близко изображение находится к классу A или классу B, потому что эта классификация не кажется просто бинарной проблемой — иногда изображения представляют собой смесь классов A и B.
Класс A можно приблизительно определить по наличию изогнутых / гладких краев, похожих на арки или части эллиптических структур, которые часто ориентированы в некоторый центр (как в туннеле).
Другой класс, класс B, обычно очень хаотичен, и края на таком изображении определенно менее извилистые, они часто извилистые и обычно не имеют какого-либо «центра внимания».
Классы:
Изображения из обоих классов находятся в следующих ссылках:
Группа А
Группа Б
Предыдущие подходы и идеи
Я пытался отделить каждый достаточно длинный контур и затем вычислить какой-то коэффициент кривизны / кривизны — в основном я уменьшил частоту контура (на 10), затем я прошел по новому контуру и рассчитал среднее значение абсолютного угла между двумя сегментами, созданными 3 последовательных очка. Затем на основе этого значения я определил, является ли текущий контур «извилистым» или нет. В соответствии с этим я рассчитал несколько функций:
Однако вычисление самой кривизны, по-видимому, работает не очень надежно (в одном кадре контур считается изогнутым, во втором — тот же контур с слегка измененной формой, и т. Д.), А также задает порог для определения того, какой контур является изогнутым. а что нет (основываясь на «средних кривых одного контура»), трудно установить правильно. Кроме того, такой подход никоим образом не учитывает специфическую «форму» класса А, и поэтому результаты классификации очень плохие.
Я думал о некоторой подгонке эллипса, но, как вы можете видеть, класс A больше похож на группу арок, чем на настоящий эллипс или круг.
Я читал о некоторых способах сравнения карт границ, таких как сопоставление Хаусдорфа, но в моем случае это не очень помогает. Кроме того, важно, чтобы я хотел сохранить алгоритм простым, потому что он должен уметь работать в режиме реального времени, а также является лишь частью более крупного программного обеспечения.
Наконец, мой вопрос:
Есть ли у вас какие-либо идеи относительно каких-либо других улучшенных функций и расчетов, которые я могу использовать для описания, а затем для классификации таких ребер / изображений? Есть ли надежное решение для описания моих классов?
Задача ещё не решена.
Других решений пока нет …