сегментация изображений opencv

Сегментация изображения — это технология, которая делит изображение на разные части и используется для его обработки. В компьютерном зрении сегментация изображения относится к технологии отделения изображений от фона или обнаружения или распознавания целей. Результатом сегментации является разделение разных областей на разные пиксели. Во многих случаях изображение необходимо сегментировать. Например, если изображение черно-белое, оно содержит все пиксели. Потому что вычисляемыми признаками обычно являются яркость и контрастность, а не цвет (но при анализе цветных изображений это не так). Поэтому исходное изображение необходимо проанализировать, чтобы определить, какие области включены в изображение, а какие нет. Сегментация изображений не так проста, как вы думаете. Для начала вам нужно уточнить, какова ваша цель. Например, если вы хотите отделить изображение от фона, вам необходимо знать, какие области сохраняются. Во-вторых, необходимо уточнить, можно ли использовать эти регионы для описания выбранных признаков. Иногда мы обнаруживаем, что на изображении много избыточной информации (например, шума) или слишком загроможден фон, который нельзя использовать для описания особенностей. Поэтому нам нужно найти способ сегментировать эту избыточную информацию или частичные области на заднем плане. Ниже приведены некоторые часто используемые методы сегментации изображений: 1. Метод на основе порогов 2. Метод на основе обнаружения краев 3. Метод на основе увеличения области (кольца)

  • 1. Пороговый метод

    Этот метод использует фиксированный набор пороговых значений для автоматического определения областей изображения. Например, если вы хотите разделить черно-белое изображение на две разные области, вам необходимо установить два пороговых значения: первый порог — это среднее значение яркости (т. е. среднее значение) всех пикселей изображения; второй порог — это среднее значение яркости (т. е. среднее значение) всех пикселей изображения. Порог Порог — это среднее значение цвета (т. е. среднее) всех пикселей изображения. Сделав это, вы сможете определить, к какой области принадлежит каждый пиксель изображения. Поскольку между разными цветами существуют различия, в качестве пороговых значений необходимы среднее значение яркости и среднее значение. На основании этого порога изображение можно сегментировать. Этот алгоритм не будет работать, когда существует большая разница в среднем значении яркости между двумя соседними пикселями. В этом случае вы можете использовать следующий порог для определения степени различия между соседними пикселями изображения или установить эту степень различия равной нулю. Оба случая можно использовать для идентификации различных областей изображения. Пороговые методы очень эффективны при обработке текстур, теней и шума. Он имеет множество приложений в компьютерном зрении, таких как распознавание лиц, отслеживание автомобилей, обнаружение и распознавание целей и т. д. В изображениях фон и передний план часто размыты и неразличимы, что затрудняет определение того, какая часть изображения является передним планом, а какая — фоном. Поэтому в таких ситуациях очень полезны пороговые методы, поскольку они позволяют отделить фон от переднего плана. Например, вы можете использовать изображение в оттенках серого (например, черно-белую фотографию) для сегментации. Поскольку фон и передний план обычно не являются чисто черным или белым, их необходимо сегментировать с использованием других оттенков серого, чем на изображении выше. Другой способ сегментации изображений с использованием порогового метода основан на алгоритме роста области. Этот алгоритм аналогичен методу выращивания областей, но требует, чтобы сначала на изображении были созданы исходные точки. Чтобы определить, какие области являются исходными точками, вы можете создать исходные точки на изображении и сохранить их в памяти. При использовании этого алгоритма вам необходимо назначить каждую область исходной точкой и сохранить ее в памяти. Затем вы можете использовать алгоритм, чтобы определить, какие области являются целевыми или фоновыми. Поскольку алгоритму необходимо генерировать исходные точки на изображении и сохранять их в памяти, алгоритм не может обрабатывать цветные изображения (т. е. только черно-белые). Чтобы решить эту проблему, вы можете использовать подход на основе оттенков серого. Например, если изображение цветное, его можно сегментировать с помощью алгоритма сегментации цветного изображения. Но в этом случае, поскольку каждый пиксель цветного изображения содержит разную информацию о цвете, использование этого метода приведет к неверным результатам: Пороговые методы имеют определенные ограничения. Этот метод может не дать правильных результатов по таким причинам, как различия между фоном и передним планом, а также различия между различными областями.

  • 2. Метод, основанный на обнаружении границ.

    Обнаружение краев — это простой метод сегментации изображения. Он в основном использует информацию о оттенках серого в изображении и извлекает значения пикселей различных частей изображения, вычисляя различия в оттенках серого в разных областях изображения. Обнаружение границ обычно реализуется с помощью функции, называемой оператором Собеля. Это самый простой метод обнаружения границ. Однако оператор Собеля основан на информации о градиенте, и скорость его расчета низкая, поэтому он не может удовлетворить потребности обработки в реальном времени. Чтобы преодолеть этот недостаток, можно использовать оператор Canny, который в основном основан на информации о градиенте изображения. Его скорость расчета быстрая и может удовлетворить потребности обработки в реальном времени. Оператор Canny реализует обнаружение границ путем расчета карт градиента. Оператор Canny может обнаружить на изображении некоторые изолированные точки (обычно называемые шумами). Если эти выбросы невозможно полностью устранить, они будут рассматриваться как шум, что приведет к игнорированию некоторых ненужных деталей. Оператор Канни — это традиционный метод обнаружения границ, но он не может очень хорошо обнаружить шум, присутствующий в изображении. Кроме того, поскольку точки шума трудно устранить, оператор Кэнни не может хорошо сегментировать все области изображения. Чтобы преодолеть проблемы оператора Кэнни при обнаружении краев, появились многомасштабные методы обнаружения краев. Этот метод может идентифицировать информацию о градиенте всех пикселей изображения, что позволяет более точно извлекать краевые точки изображения. Многомасштабное обнаружение краев обеспечивает обнаружение краев путем разложения карты градиента на несколько масштабов. В этом случае мы можем разложить изображение на несколько областей разного разрешения (т. е. иерархию). Каждый уровень содержит одну или несколько областей изображения. Чтобы рассчитать градиент между этими различными уровнями, мы можем использовать методы математической морфологии. Есть много способов реализовать этот подход. Одним из распространенных методов является построение функции роста региона на основе теории роста региона (кольца) для достижения сегментации изображения. Если изображение рассматривается как целое (т. е. набор пикселей), то его можно рассматривать как картинку (т. е. набор пикселей) с разными характеристиками (такими как цвет, яркость, контрастность и т. д.). Поскольку наборы пикселей имеют разные характеристики, функция роста региона может связать эти характеристики. Эти соединения затем используются для разделения различных областей (т. е. набора пикселей, созданных после сегментации). Хотя функции сегментации, основанные на теории роста областей, могут иметь некоторые недостатки, их можно эффективно применять для решения различных типов задач сегментации изображений. Они могут очень хорошо решать некоторые проблемы, например, очень чувствительны к точкам шума и требуют больше места для устранения примесей на изображении. Функция сегментации, построенная на основе теории роста области, может применяться к различным типам и размерам задач сегментации изображений (таким как цветные изображения, изображения в оттенках серого и т. д.), тем самым улучшая способность алгоритма решать проблемы при возникновении проблем при работе с изображением. проблемы сегментации. Следовательно, функция сегментации, построенная на основе теории роста областей, может стать алгоритмическим методом, часто используемым в задачах сегментации изображений различных типов и размеров (например, в сегментации медицинских изображений). В функции сегментации, построенной на основе теории обнаружения границ, для решения задачи часто используются некоторые базовые операторы (например, оператор Кэнни, оператор Собеля и т. д.) и некоторые алгоритмы оптимизации (например, поиск по сетке и т. д.).

  • 3. Метод, основанный на выращивании региона (кольцо).

    Метод, основанный на выращивании областей, представляет собой технологию сегментации изображений, основанную на морфологических методах. Этот метод сначала использует начальную точку, а затем генерирует новый регион путем сканирования всего региона. По сравнению с традиционной технологией обнаружения границ метод, основанный на увеличении области, обладает высокой адаптируемостью и адаптируемостью и может хорошо адаптироваться к целям разных форм и размеров, не затрагивая фон. Этот метод использует математический метод для расчета веса каждого пикселя изображения. Это делает метод несколько универсальным и позволяет обрабатывать изображения любой формы, размера и цвета. В процессе сегментации изображения существующие или будущие области вокруг пикселей могут использоваться в качестве исходных точек, а затем в процессе роста к этим областям постоянно добавляются новые, пока не будет сегментировано полное изображение. Хотя метод, основанный на увеличении области, обладает высокой адаптируемостью и гибкостью, он также имеет определенные недостатки: например, если цвет цели отличается от цвета окружающих пикселей, могут быть сгенерированы нежелательные цели или ошибки. Кроме того, для этого метода необходимо заранее определить исходную точку (если исходную точку невозможно определить, это приведет к неправильной сегментации изображения) и метод роста (если выбран метод роста, это приведет к чрезмерному увеличению края). вытянут на задний план).

Ниже приведены несколько часто используемых примеров кода сегментации изображений OpenCV:

1. Сегментация изображения на основе порога
```python
import cv2
# Считайте изображение
img = cv2.imread('image.jpg')
# Преобразуйте в изображение в оттенках серого
Gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# Примените порог
ret , thresh = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)
# Отображение результатов
cv2.imshow('Thresholded Image', thresh)
cv2.waitKey(0)
cv2.destroyAllWindows()
````
2. Edge -на основе обнаруженной сегментации изображения
```python
import cv2
# Считайте изображение
img = cv2.imread('image.jpg')
# Преобразуйте в изображение в оттенках серого
Gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # Примените обнаружение краев
Канни
= cv2.Canny(gray, 100, 200)
# Отображение результатов
cv2.imshow('Edges', Edges)
cv2.waitKey(0)
cv2.destroyAllWindows()
```
3. Сегментация изображения на основе алгоритма водораздела
```python
import cv2
import numpy as np
# Считайте изображение
img = cv2.imread('image.jpg')
# Преобразуйте в изображение в
оттенках серого grey = cv2 .cvtColor(img, cv2.COLOR_BGR2GRAY)
# Применить порог Оцу
ret, thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY_INV+cv2.THRESH_OTSU)
# Удалить шум
kernel = np.ones((3,3) , np.uint8)
open = cv2.morphologyEx(thresh, cv2.MORPH_OPEN, kernel, iterations=2)
# Определить область фона
Sure_bg = cv2.dilate(opening, kernel, iterations=3)
# Определить область переднего плана
dist_transform = cv2. distanceTransform (открытие, cv2.DIST_L2, 5)
ret, Sure_fg = cv2.threshold(dist_transform, 0,7*dist_transform.max(), 255, 0)
# Определить неизвестную область
Sure_fg = np.uint8(sure_fg)
known = cv2.subtract(sure_bg, Sure_fg)
# Применить алгоритм водораздела
ret, маркеры = cv2.connectedComponents(sure_fg)
маркеры = маркеры + 1
маркеры[unknown==255] = 0
маркеров = cv2.watershed(img, маркеры)
img[markers == -1] = [255,0,0]
# Отображение результатов
cv2.imshow('Segmented Image', img)
cv2.waitKey(0)
cv2 .destroyAllWindows()
```

おすすめ

転載: blog.csdn.net/qq_42751978/article/details/130778762