Подходит ли библиотека c++ OpenCV vision для этого случая сегментации изображений?


Я пытаюсь найти простую в использовании библиотеку vision для C++. Вот моя ситуация: у меня есть камера, подключенная к компьютеру (для простоты, однако, мы можем просто предположить, что файлы изображений существуют на компьютере), и вот как в идеале будут выглядеть изображения:

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

Идея состоит в том, что три объекта, расположенные вертикально, будут иметь очень контрастные цвета. Мне нужно определить местоположение объектов, поэтому библиотека vision либо должна будет найти края объекты или определить их центр масс.

Я никогда раньше не пользовался системой зрения, поэтому я провел некоторые исследования, и мне кажется, что OpenCV довольно популярен. Будет ли это легко использовать для моего приложения, или есть другая библиотека, которая может быть использована для определения положения объектов легко?

Спасибо за совет!

2 5

2 ответа:

Для этого конкретного изображения вам не нужно работать в полном цветовом пространстве, но вместо этого вы можете работать только с интенсивностью ("V" часть HSV - "значение", то есть интенсивность).

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

Используете ли вы пространство значений или пространство оттенков, как упомянула Пенелопа, будет зависеть от естественных образов, которые вы создаете для ваших реальных объектов. В общем случае для правильного сегментирования изображений может потребоваться сочетание оттенка и значения (интенсивности). Вместо того, чтобы работать в векторном пространстве значений оттенков, это больше просто работать в H и V плоскостях изображения отдельно, а затем объединять результаты. (Сегментация в трехмерных векторных пространствах, безусловно, возможна, но, вероятно, будет излишне сложной для этого проекта.)

Алгоритм водораздела в OpenCV может быть хорошим выбором для ваших нужд. http://www.seas.upenn.edu/~bensapp/opencvdocs/ref/opencvref_cv.htm

Одно слово предостережения о методе Оцу: он отлично подходит для разделения двух режимов, когда гистограмма значений интенсивности (или значения оттенков) - это бимодальное распределение, но для естественных изображений не принято иметь истинные бимодальные распределения. Если фон и/или объекты переднего плана изменяются по интенсивности и / или оттенку от одной стороны объекта к другой, то Otsu может работать плохо.

Otsu, безусловно, может быть расширен для нескольких режимов, как это объясняется вцифровой обработке изображений Гонсалесом и Вудсом и другими вводными учебниками по этому предмету. Тем не менее, фоновый градиент приведет проблемы, даже если вы используете Otsu для разделения одной пары режимов одновременно.

Вы также хотите убедиться, что при увеличении или уменьшении объектива камеры вы все равно найдете те же пороги бинаризации. Основная техника Otsu использует все пиксели в гистограмме изображения. Это означает, что вы можете скремблировать все пиксели в изображении, чтобы получить чистый шум с той же гистограммой изображения, что и исходное изображение, и метод Otsu будет генерировать тот же порог.

Один общий трюк заключается в том, чтобы полагайтесь на пиксели вблизи краев. В вашем примере мы можем рассматривать изображение как область с острыми краями, острыми углами и (надеюсь) однородными значениями HSV. Выборку пикселей вблизи краев можно выполнить несколькими способами, включая следующие:

  1. найдите сильные точки ребер (используя Хитрый или более простой метод). Вдоль направления градиента края и на расстояниях +/- D от точки края выполните выборку уровней серого (относительного) переднего плана и (относительного) заднего фона. Расстояние D должно быть намного меньше, чем размер рассматриваемых объектов.
  2. найти сильные точки ребер. Используйте уровни серого цвета в самих краевых точках в качестве оценок вероятного желаемого порога. В вашем примере вы будете иметь два сильных пика: один на границе между object1 и object2, а другой на границе между object2 и object3.

Поскольку ваши объекты имеют углы, вы можете использовать их для идентификации границ объектов и / или пикселов ребер, подходящих для отбор проб.

Если у вас есть номинально прямоугольные объекты, вы также можете использовать алгоритм Hough edge или RANSAC edge для идентификации линий на изображении, поиска пересечений в углах и т. д.

Тем не менее, для почти любого естественного изображения, включающего объекты, сложенные друг на друге, вы столкнетесь с несколькими сложностями:
  • тени
  • градиенты цвета и интенсивности на объекте номинально согласованного цвета
  • края различной резкости, если объекты находятся на различных расстояниях от оптической системы

Если вы точно знаете, сколько объектов присутствует, вы можете попробовать метод k Means. http://aishack.in/tutorials/knearest-neighbors-in-opencv/

Для более сложных задач сегментации, например, когда количество объектов неизвестно, Вы можете использовать метод Mean Shift, хотя я бы рекомендовал сначала попробовать более простые методы.

Первый шаг и самое простое исправление заключается в использовании правильное освещение. Чтобы уменьшить отражения и тени, используйте рассеянное освещение. Для многих применений наиболее близким к идеальному рассеянному освещению является освещение" облачного дня".: http://www.microscan.com/en-us/products/nerlite-machine-vision-lighting/cdi-illuminators.aspx

Проще говоря, вы можете попробовать один или несколько "прыгающих" огней, таких как те, которые используются в студийной фотографии. http://www.photography.com/articles/taking-photos/bounce-lighting/

OpenCV определенно является простой в использовании библиотекой vision. Я использовал его в нескольких проектах по компьютерному зрению, и для меня он довольно интуитивно понятен.

Я предполагаю, что цвета объектов неизвестны (если нет, Вот довольно хороший учебник о том, как найти определенный цвет в OpenCV).

Вот примерная идея для решения вашей проблемы (я думаю о том, какие операции легко реализовать в OpenCV):

  • Преобразование изображения в HSV цветовое пространство-цвета должны иметь очень разные значения оттенка в этом пространстве, если они имеют высокую контрастность, поэтому используйте только изображение оттенка

  • Порог картинка по методу Оцу (порог будет определен автоматически)

  • Если он выбирает средний объект (например, есть 2 Соединенных компонента на заднем плане), сегментация выполняется. Вы можете использовать findContours или даже преобразование Хафа для линий, если объекты имеют квадратную форму.

  • Если он выберет только внешний объект, вы можете снова найти его контуры таким же образом, установить область интереса (часть изображения, над которым вы работаете) так, чтобы она была только внутри контуров, и снова порог внутренней части изображения, чтобы найти границу между двумя другими объектами. В конце концов, просто наложите найденные Контуры на отдельное изображение.

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