Подходит ли библиотека видений C ++ OpenCV для этого случая сегментации изображения? - PullRequest
5 голосов
/ 30 декабря 2011

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

enter image description here

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

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

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

Ответы [ 2 ]

7 голосов
/ 30 декабря 2011

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

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

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

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

  • пороговое изображение с помощью метода Оцу (пороговое значение будет определено автоматически)

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

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

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

4 голосов
/ 30 декабря 2011

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

enter image description here

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

...