- 1. Сегментация и контуры
- 2. Иерархия и режим поиска
- 3. Аппроксимация контуров и нахождение их выпуклой оболочки.
- 4. Выпуклая оболочка.
- 5. Подбор контура по формам
- 6. Определение фигур (круг, прямоугольник, треугольник, квадрат, звезда)
- 7. Обнаружение линии
- 8. Обнаружение капли
- 9. Фильтрация капель - подсчет кругов и эллипсов.
В предыдущих уроках мы использовали OpenCV для базовой обработки изображений и выполнили некоторые дополнительные операции редактирования изображений. Как мы знаем, OpenCV - это библиотека Commuter Vision с открытым исходным кодом, которая имеет интерфейсы C ++, Python и Java и поддерживает Windows, Linux, Mac OS, iOS и Android. Таким образом, его можно легко установить в Raspberry Pi в среде Python и Linux. А Raspberry Pi с OpenCV и подключенной камерой можно использовать для создания множества приложений обработки изображений в реальном времени, таких как обнаружение лиц, блокировка лица, отслеживание объектов, обнаружение автомобильных номеров, система домашней безопасности и т. Д. В этом руководстве мы узнаем, как это сделать. сегментация изображений с использованием OpenCV. Ниже перечислены операции, которые мы собираемся выполнить:
- Сегментация и контуры
- Иерархия и режим поиска
- Аппроксимация контуров и нахождение их выпуклой оболочки
- Conex Hull
- Соответствующий контур
- Определение фигур (круг, прямоугольник, треугольник, квадрат, звезда)
- Обнаружение линии
- Обнаружение капли
- Фильтрация капель - подсчет кругов и эллипсов
1. Сегментация и контуры
Сегментация изображений - это процесс, с помощью которого мы разделяем изображения на разные области. В то время как контуры - это непрерывные линии или кривые, которые ограничивают или покрывают полную границу объекта на изображении. И здесь мы будем использовать технику сегментации изображения, называемую контурами, для извлечения частей изображения.
Также контуры очень важны в
- Обнаружение объекта
- Анализ формы
И они имеют очень широкую область применения от анализа изображений реального мира до анализа медицинских изображений, таких как МРТ.
Давайте узнаем, как реализовать контуры в opencv, извлекая контуры квадратов.
импортировать cv2 импортировать numpy как np
Загрузим простое изображение с 3 черными квадратами
image = cv2.imread ('squares.jpg') cv2.imshow ('входное изображение', изображение) cv2.waitKey (0)
Оттенки серого
серый = cv2.cvtColor (изображение, cv2.COLOR_BGR2GRAY)
Найдите хитрые края
edged = cv2.Canny (серый, 30,200) cv2.imshow ('хитрые края', обрезной) cv2.waitKey (0)
Нахождение контуров
# используйте копию вашего изображения, например - edged.copy (), поскольку поиск контуров изменяет изображение # мы должны добавить _ перед контурами в качестве пустого аргумента из-за обновления версии OpenCV _, contours,ierarchy = cv2.findContours (обрезной, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE) cv2.imshow ('резкие края после контурной обработки', обрезной) cv2.waitKey (0)
Распечатайте файл контура, чтобы узнать, какие контуры состоят из
print (contours) print ('Количество найденных контуров =' + str (len (contours)))
Нарисуйте все контуры
# используйте -1 в качестве 3-го параметра для рисования всех контуров cv2.drawContours (image, contours, -1, (0,255,0), 3) cv2.imshow ('contours', image) cv2.waitKey (0) cv2. destroyAllWindows ()
Консольный вывод -],],], …,],],]], dtype = int32), массив (],],
], …,
],],]], dtype = int32), array (],],], …,],],]], dtype = int32)]
Количество найденных контуров = 3. Итак, мы нашли всего три контура.
Теперь, в приведенном выше коде мы также печататься файл контура, используя , этот файл указывает, как эти контуры выглядит, как напечатано в выводе выше консоли.
В приведенном выше выводе консоли у нас есть матрица, которая выглядит как координаты точек x, y. OpenCV хранит контуры в списках списков. Мы можем просто показать приведенный выше вывод консоли следующим образом:
КОНТУР 1 КОНТУР 2 КОНТУР 3
], массив (], массив (],],],],],],],
…,…,…,],],],],],],]], dtype = int32),]], dtype = int32),]], dtype = int32)]
Теперь, когда мы используем функцию длины в файле контура, мы получаем длину равную 3, это означает, что в этом файле было три списка списков, то есть три контура.
Теперь представьте, что CONTOUR 1 - первый элемент в этом массиве, и этот список содержит список всех координат, и эти координаты являются точками вдоль контуров, которые мы только что видели, в виде зеленых прямоугольников.
Существуют разные методы хранения этих координат, и они называются методами приближения, в основном методы приближения бывают двух типов.
- cv2.CHAIN_APPROX_NONE
- cv2.CHAIN_APPROX_SIMPLE
cv2.CHAIN_APPROX_NONE хранит всю граничную точку, но нам не обязательно нужны все граничные точки, если точка образует прямую линию, нам нужны только начальная и конечная точки на этой линии.
cv2.CHAIN_APPROX_SIMPLE вместо этого предоставляет только начальную и конечную точки ограничивающих контуров, в результате значительно более эффективное хранение контурной информации.
_, контуры, иерархия = cv2.findContours (обрезной, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)
В приведенном выше коде cv2.RETR_EXTERNAL - это режим извлечения, а cv2.CHAIN_APPROX_NONE -
метод аппроксимации.
Итак, мы узнали о контурах и методе аппроксимации, теперь давайте рассмотрим иерархию и режим поиска.
2. Иерархия и режим поиска
Режим извлечения определяет иерархию в контурах, таких как субконтуры, или внешний контур, или все контуры.
Теперь существует четыре режима поиска, отсортированных по типам иерархии.
cv2.RETR_LIST - извлекает все контуры.
cv2.RETR_EXTERNAL - извлекает только внешние или внешние контуры.
cv2.RETR_CCOMP - извлекает все в двухуровневой иерархии.
cv2.RETR_TREE - извлекает все по полной иерархии.
Иерархия хранится в следующем формате
Теперь давайте проиллюстрируем разницу между первыми двумя режимами поиска, cv2.RETR_LIST и cv2.RETR_EXTERNAL.
импортировать cv2 импортировать numpy как np
Загрузим простое изображение с 3 черными квадратами
image = cv2.imread ('квадратный пончик.jpg') cv2.imshow ('входное изображение', изображение) cv2.waitKey (0)
Оттенки серого
серый = cv2.cvtColor (изображение, cv2.COLOR_BGR2GRAY)
Найдите хитрые края
edged = cv2.Canny (серый, 30,200) cv2.imshow ('хитрые края', обрезной) cv2.waitKey (0)
Поиск контуров
# используйте копию вашего изображения, например - edged.copy (), поскольку поиск контуров изменяет изображение # мы должны добавить _ перед контурами в качестве пустого аргумента из-за обновления открытой версии cv _, contours,ierarchy = cv2.findContours (edged, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE) cv2.imshow ('резкие края после контурной обработки', обрезные) cv2.waitKey (0)
Распечатайте файл контура, чтобы узнать, из чего состоят контуры.
print (contours) print ('Количество найденных контуров =' + str (len (contours)))
Нарисуйте все контуры
# используйте -1 в качестве 3-го параметра для рисования всех контуров cv2.drawContours (image, contours, -1, (0,255,0), 3) cv2.imshow ('contours', image) cv2.waitKey (0) cv2. destroyAllWindows
импортировать cv2 импортировать numpy как np
Загрузим простое изображение с 3 черными квадратами
image = cv2.imread ('квадратный пончик.jpg') cv2.imshow ('входное изображение', изображение) cv2.waitKey (0)
Оттенки серого
серый = cv2.cvtColor (изображение, cv2.COLOR_BGR2GRAY)
Найдите хитрые края
edged = cv2.Canny (серый, 30,200) cv2.imshow ('хитрые края', обрезной) cv2.waitKey (0)
Нахождение контуров
# используйте копию вашего изображения, например - edged.copy (), поскольку поиск контуров изменяет изображение # мы должны добавить _ перед контурами в качестве пустого аргумента из-за обновления открытой версии cv _, contours,ierarchy = cv2.findContours (edged, cv2.RETR_LIST, cv2.CHAIN_APPROX_NONE) cv2.imshow ('резкие края после контурной обработки', обрезные) cv2.waitKey (0)
Распечатайте файл контура, чтобы узнать, из чего состоят контуры.
print (contours) print ('Количество найденных контуров =' + str (len (contours)))
Нарисуйте все контуры
# используйте -1 в качестве 3-го параметра для рисования всех контуров cv2.drawContours (image, contours, -1, (0,255,0), 3) cv2.imshow ('contours', image) cv2.waitKey (0) cv2. destroyAllWindows ()
Таким образом, благодаря демонстрации приведенных выше кодов мы могли ясно увидеть разницу между cv2.RETR_LIST и cv2.RETR_EXTERNNAL , в cv2.RETR_EXTERNNAL учитываются только внешние контуры, в то время как внутренние контуры игнорируются.
В cv2.RETR_LIST также учитываются внутренние контуры.
3. Аппроксимация контуров и нахождение их выпуклой оболочки.
При аппроксимации контуров форма контура аппроксимируется по форме другого контура, которая может быть не очень похожа на форму первого контура.
Для аппроксимации мы используем approxPolyDP функцию OpenCV, которая объяснена ниже
cv2.approxPolyDP (контур, точность аппроксимации, замкнутый)
Параметры:
- Контур - это индивидуальный контур, который мы хотим приблизить.
- Точность приближения - важный параметр при определении точности приближения, малое значение дает точное приближение, большие значения дают более общую информацию. Хорошее правило большого пальца - менее 5% периметра контура.
- Замкнутый - логическое значение, указывающее, может ли приблизительный контур быть открытым или замкнутым.
Попробуем приблизить простую фигуру дома
импортировать numpy как np import cv2
Загрузите изображение и сохраните копию
image = cv2.imread ('house.jpg') orig_image = image.copy () cv2.imshow ('исходное изображение', orig_image) cv2.waitKey (0)
Оттенки серого и преобразование изображения в двоичную форму
серый = cv2.cvtColor (изображение, cv2.COLOR_BGR2GRAY) ret, thresh = cv2.threshold (серый, 127,255, cv2.THRESH_BINARY_INV)
Найти контуры
_, контуры, иерархия = cv2.findContours (thresh.copy (), cv2.RETR_LIST, cv2.CHAIN_APPROX_NONE)
Обойти каждый контур и вычислить их ограничивающий прямоугольник.
для c в контурах: x, y, w, h = cv2.boundingRect (c) cv2.rectangle (orig_image, (x, y), (x + w, y + h), (0,0,255), 2) cv2.imshow ('Ограничивающий прямоугольник', orig_image) cv2.waitKey (0)
Пройдите по каждому контуру и вычислите приблизительный контур
для c в контурах:
# вычислить точность в процентах от точности периметра контура = 0,03 * cv2.arcLength (c, True) приблизительно = cv2.approxPolyDP (c, precision , True) cv2.drawContours (image,, 0, (0,255,0), 2) cv2.imshow ('Примерный polyDP', изображение) cv2.waitKey (0) cv2.destroyAllWindows ()
4. Выпуклая оболочка.
Выпуклый корпус - это в основном внешние края, представленные линиями, нанесенными на заданную фигуру.
Это может быть самый маленький многоугольник, который может поместиться вокруг самого объекта.
import cv2 import numpy as np image = cv2.imread ('star.jpg') gray = cv2.cvtColor (image, cv2.COLOR_BGR2GRAY) cv2.imshow ('original image', image) cv2.waitKey (0)
Порог изображения
ret, thresh = cv2.threshold (серый, 176,255,0)
Найдите контуры
_, контуры, иерархия = cv2.findContours (thresh.copy (), cv2.RETR_LIST, cv2.CHAIN_APPROX_NONE)
Отсортируйте контуры по площади, а затем удалите самый большой контур кадра
n = len (контуры) -1 контуры = отсортировано (контуры, ключ = cv2.contourArea, reverse = False)
Проходим по контурам и рисуем выпуклый корпус.
для c в контурах:
hull = cv2.convexHull (c) cv2.drawContours (image,, 0, (0,255,0), 2) cv2.imshow ('выпуклая оболочка', изображение) cv2.waitKey (0) cv2.destroyAllWindows ()
5. Подбор контура по формам
cv2.matchShapes (шаблон контура, метод контура, параметр метода)
Вывод - значение соответствия (меньшее значение означает более точное совпадение)
шаблон контура - это наш опорный контур, который мы пытаемся найти в новом изображении.
contour - отдельный контур, по которому мы проверяем.
Метод - Тип сопоставления контуров (1,2,3).
параметр метода - оставьте в покое как 0.0 (не используется в python opencv)
импортировать cv2 импортировать numpy как np
Загрузите шаблон формы или эталонное изображение
template = cv2.imread ('star.jpg', 0) cv2.imshow ('шаблон', шаблон) cv2.waitKey (0)
Загрузите целевое изображение с формами, которые мы пытаемся сопоставить
target = cv2.imread ('shapestomatch.jpg') gray = cv2.cvtColor (target, cv2.COLOR_BGR2GRAY)
Прежде чем использовать cv2.findContours, установите пороговое значение для обоих изображений
ret, thresh1 = cv2.threshold (шаблон, 127,255,0) ret, thresh2 = cv2.threshold (серый, 127,255,0)
Найдите контуры в шаблоне
_, contours,ierarhy = cv2.findContours (thresh1, cv2.RETR_CCOMP, cv2.CHAIN_APPROX_SIMPLE) # нам нужно отсортировать контуры по площади, чтобы мы могли удалить самый большой контур, который
Контур изображения
sorted_contours = sorted (contours, key = cv2.contourArea, reverse = True) # извлекаем второй по величине контур, который будет нашим шаблоном contour tempelate_contour = contours # извлекаем контуры из второго целевого изображения _, contours,ierarchy = cv2.findContours (thresh2, cv2.RETR_CCOMP, cv2.CHAIN_APPROX_SIMPLE) для c в контурах: # итерируйте каждый контур в целевом изображении и используйте cv2.matchShape для сравнения формы контура match = cv2.matchShapes (tempelate_contour, c, 1,0.0) print ("match") # если значение соответствия меньше 0,15, если соответствие <0,16: closest_contour = c else: closest_contour = cv2.drawContours (target,, - 1, (0,255,0), 3) cv2.imshow ('output', цель) cv2.waitKey (0) cv2.destroyAllWindows ()
Консольный вывод -
0,16818605122199104
0,19946910256158912
0,18949760627309664
0.11101058276281539
Существует три разных метода с разными математическими функциями, мы можем поэкспериментировать с каждым методом, просто заменив значения метода cv2.matchShapes (tempelate_contour, c, 1, 0.0), которые варьируются от 1,2 до 3, для каждого значения вы получите разные совпадения значения в выводе консоли.
6. Определение фигур (круг, прямоугольник, треугольник, квадрат, звезда)
OpenCV также можно использовать для автоматического определения различных типов фигур по изображению. Используя приведенный ниже код, мы сможем определять круг, прямоугольник, треугольник, квадрат и звезды на изображении.
импортировать cv2 импортировать numpy как np
Загрузить и затем изображения в оттенках серого
image = cv2.imread ('shape.jpg') gray = cv2.cvtColor (image, cv2.COLOR_BGR2GRAY) cv2.imshow ('идентификация форм', изображение) cv2.waitKey (0) ret, thresh = cv2.threshold (серый, 127,255,1)
Извлечь контуры
_, контуры, иерархия = cv2.findContours (thresh.copy (), cv2.RETR_LIST, cv2.CHAIN_APPROX_NONE)
Для cnt в контурах:
Получите приблизительное значение многоугольников приблизительно = cv2.approxPolyDP (cnt, 0.01 * cv2.arcLength (cnt, True), True), если len (приблизительно) == 3: shape_name = "Triangle" cv2.drawContours (image,, 0, (0,255, 0), - 1)
найти центр контура, чтобы разместить текст в центре
M = cv2.moments (cnt) cx = int (M / M) cy = int (M / M) cv2.putText (image, shape_name, (cx-50, cy), cv2.FONT_HERSHEY_SIMPLEX, 1, (0,0, 0), 1) elif len (приблизительно) == 4: x, y, w, h = cv2.boundingRect (cnt) M = cv2.moments (cnt) cx = int (M / M) cy = int (M / М)
Проверьте, является ли этот четырехсторонний многоугольник квадратным или прямоугольным.
# cv2.boundingRect возвращает левую ширину и высоту в пикселях, начиная с верхнего # левого угла, для квадрата было бы примерно так же, если бы abs (wh) <= 3: shape_name = "square" # найти центр контура для размещения текста center cv2.drawContours (image,, 0, (0,125,255), - 1) cv2.putText (image, shape_name, (cx-50, cy), cv2.FONT_HERSHEY_SIMPLEX, 1, (0,0,0), 1) else: shape_name = "Reactangle" # найти центр контура для размещения текста в центре cv2.drawContours (image,, 0, (0,0,255), - 1) M = cv2.moments (cnt) cx = int (M / M) cy = int (M / M) cv2.putText (image, shape_name, (cx-50, cy), cv2.FONT_HERSHEY_SIMPLEX, 1, (0,0,0), 1) elif len (приблизительно) == 10: shape_name = 'звезда' cv2.drawContours (image,, 0, (255,255,0), - 1) M = cv2.moments (cnt) cx = int (M / M) cy = int (M / M) cv2.putText (image, shape_name, (cx-50, cy), cv2.FONT_HERSHEY_SIMPLEX, 1, (0,0,0), 1) elif len (приблизительно)> = 15: shape_name = 'circle' cv2.drawContours (image,, 0, (0,255,255), -1) M = cv2.moments (cnt) cx = int (M / M) cy = int (M / M) cv2.putText (изображение, имя_формы, (cx-50, cy), cv2.FONT_HERSHEY_SIMPLEX, 1, (0,0,0), 1) cv2.imshow ('идентификация фигур', изображение) cv2.waitKey (0) cv2.destroyAllWindows ()
7. Обнаружение линии
Обнаружение строк - очень важная концепция в OpenCV, которая имеет многообещающее применение в реальном мире. Автономные автомобили используют алгоритмы обнаружения линий для обнаружения полос и дорог.
При обнаружении строк мы будем иметь дело с двумя алгоритмами,
- Алгоритм линии Хафа
- Пробалистический алгоритм линии Хафа.
Возможно, вы вспомнили представление линии из математики средней школы с уравнением y = mx + c.
Однако в OpenCV линейка представлена другим способом
Уравнение выше ρ = xcosӨ + ysincosӨ - это представление линии в OpenCV, где ρ - перпендикулярное расстояние линии от начала координат, а Ө - угол, образованный нормалью этой линии к началу координат (измеряется в радианах, где 1pi радиан / 180 = 1 градус).
Функция OpenCV для обнаружения строки задается как
cv2.HoughLines (бинаризованное изображение, точность ρ, точность, порог), где порог - это минимальное количество голосов для того, чтобы оно считалось линией.
Теперь давайте определим линии для изображения коробки с помощью функции Hough line opencv.
import cv2 import numpy as np image = cv2.imread ('box.jpg')
Оттенки серого и резкие края извлечены
серый = cv2.cvtColor (изображение, cv2.COLOR_BGR2GRAY) края = cv2.Canny (серый, 100,170, apertureSize = 3)
Запуск линий Хафа с точностью до 1 пикселя
# точность тета (np.pi / 180), равная 1 градусу # порог линии установлен на 240 (количество точек на линии) lines = cv2.HoughLines (edge, 1, np.pi / 180, 240) # мы повторяем через каждую строку и преобразовать в формат #, требуемый cv2.lines (т.е. требующий конечных точек) для i в диапазоне (0, len (lines)): для rho, theta в строках: a = np.cos (theta) b = np.sin (theta) x0 = a * rho y0 = b * rho x1 = int (x0 + 1000 * (- b)) y1 = int (y0 + 1000 * (a)) x2 = int (x0-1000 * (-b)) y2 = int (y0-1000 * (a)) cv2.line (image, (x1, y1), (x2, y2), (0,255,0), 2) cv2.imshow ('грубые строки', изображение) cv2.waitKey (0) cv2.destroyAllWindows ()
Теперь давайте повторим определение вышеуказанной линии с другим алгоритмом вероятностной линии Хафа.
Идея вероятностной линии Хафа состоит в том, чтобы взять случайное подмножество точек, достаточное для обнаружения линии.
Функция OpenCV для вероятностной линии Хафа представлена как cv2.HoughLinesP (бинаризованное изображение, точность ρ, точность Ө, порог, минимальная длина строки, максимальный промежуток между строками)
Теперь давайте обнаружим линии бокса с помощью вероятностных линий Хафа.
импортировать cv2 импортировать numpy как np
Оттенки серого и резкие края извлечены
image = cv2.imread ('box.jpg') gray = cv2.cvtColor (image, cv2.COLOR_BGR2GRAY) Edge = cv2.Canny (gray, 50,150, apertureSize = 3) # снова мы используем ту же точность rho и theta # однако, мы указываем минимальное количество голосов (точек вдоль линии), равное 100 #, и минимальную длину строки, равную 5 пикселей, и максимальный промежуток между строками из 10 пикселей, равный строкам = cv2.HoughLinesP (края, 1, np.pi / 180,100,100,10) для i in range (0, len (lines)): для x1, y1, x2, y2 в строках: cv2.line (image, (x1, y1), (x2, y2), (0,255,0), 3) cv2. imshow ('пробалистические строки', изображение) cv2.waitKey (0) cv2.destroyAllWindows
8. Обнаружение капли
BLOB-объекты можно описать как группу связанных пикселей, которые имеют общее свойство. Метод использования детектора больших двоичных объектов OpenCV описан в этой блок-схеме.
Для рисования ключевых точек мы используем cv2.drawKeypoints, который принимает следующие аргументы.
cv2.drawKeypoints (входное изображение, ключевые точки, blank_output_array, цвет, флаги)
где во флагах могло быть
cv2.DRAW_MATCHES_FLAGS_DEFAULT
cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS
cv2.DRAW_MATCHES_FLAGS_DRAW_OVER_OUTIMG
cv2.DRAW_MATCHES_FLAGS_NOT_DRAW_SINGLE_POINTS
и пробел здесь в значительной степени не что иное, как одна за другой матрица нулей
Теперь давайте выполним обнаружение капель на изображении подсолнухов, где капли будут центральными частями цветка, поскольку они общие для всех цветов.
import cv2 import numpy as np image = cv2.imread ('Sunflowers.jpg', cv2.IMREAD_GRAYSCALE)
Настройте детектор с параметрами по умолчанию
детектор = cv2.SimpleBlobDetector_create ()
Обнаружить капли
ключевые точки = детектор.detect (изображение)
Нарисуйте обнаруженные капли в виде красных кружков
# cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS убедитесь, что # размер круга соответствует размеру blob blank = np.zeros ((1,1)) blobs = cv2.drawKeypoints (image, keypoints, blank, (0,255,255), cv2.DRAW_MATCHES_DRAW_MATCHES_DRAW_MATCHES_
Показать ключевые точки
cv2.imshow ('капли', капли) cv2.waitKey (0) cv2.destroyAllWindows ()
Несмотря на то, что код работает нормально, некоторые капли отсутствуют из-за неравномерного размера цветов, так как цветы спереди большие по сравнению с цветами в конце.
9. Фильтрация капель - подсчет кругов и эллипсов.
Мы можем использовать параметры для фильтрации капель по их форме, размеру и цвету. Для использования параметров с детектором blob мы используем функцию OpenCV
cv2.SimpleBlobDetector_Params ()
Мы увидим фильтрацию больших двоичных объектов в основном по этим четырем параметрам, перечисленным ниже:
Площадь
params.filterByArea = True / False params.minArea = пикселей params.maxArea = пикселей
Округлость
params.filterByCircularity = True / False params.minCircularity = 1 - идеальный, 0 - противоположный
Выпуклость - Площадь пятна / площадь выпуклой оболочки
params.filterByConvexity = True / False params.minConvexity = Площадь
Инерция
params.filterByInertia = Истина / Ложь params.minInertiaRatio = 0,01
Теперь попробуем отфильтровать капли по указанным выше параметрам.
import cv2 import numpy as np image = cv2.imread ('blobs.jpg') cv2.imshow ('исходное изображение', изображение) cv2.waitKey (0)
Инициализировать детектор с использованием параметров по умолчанию
детектор = cv2.SimpleBlobDetector_create ()
Обнаружить капли
ключевые точки = детектор.detect (изображение)
Нарисуйте капли на нашем изображении в виде красных кружков
blank = np.zeros ((1,1)) blobs = cv2.drawKeypoints (image, keypoints, blank, (0,0,255), cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS) number_of_blobs = len (keypoints) text = «общее количество blobs» + str (len (ключевые точки)) cv2.putText (капли, текст, (20,550), cv2.FONT_HERSHEY_SIMPLEX, 1, (100,0,255), 2)
Отображение изображения с ключевыми точками blob
cv2.imshow ('blob с параметрами по умолчанию', blobs) cv2.waitKey (0)
Установите наши параметры фильтрации
#initialize настройка параметров с помощью cv2.SimpleBlobDetector params = cv2.SimpleBlobDetector_Params ()
Установить параметры фильтрации области
params.filterByArea = Истина params.minArea = 100
Установить параметры фильтрации цикличности
params.filterByCircularity = Истина params.minCircularity = 0.9
Установить параметр фильтрации выпуклости
params.filterByConvexity = Ложь params.minConvexity = 0.2
Установить параметр фильтрации инерции
params.filterByInertia = Истина params.minInertiaRatio = 0,01
Создать детектор с параметром
детектор = cv2.SimpleBlobDetector_create (параметры)
Обнаружить капли
ключевые точки = детектор.detect (изображение)
Нарисуйте капли на изображениях в виде красных кружков
blank = np.zeros ((1,1)) blobs = cv2.drawKeypoints (image, keypoints, blank, (0,255,0), cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS) number_of_blobs = len (keypoints) text = "общее количество круглых BLOB-объектов" + str (len (ключевые точки)) cv2.putText (капли, текст, (20,550), cv2.FONT_HERSHEY_SIMPLEX, 1, (0,100,255), 2)
Показать капли
cv2.imshow ('фильтрация круговых капель', капли) cv2.waitKey (0) cv2.destroyAllWindows ()
Вот как можно сделать сегментацию изображений в Python-OpenCV. Чтобы получить хорошее представление о компьютерном зрении и OpenCV, просмотрите предыдущие статьи (Приступая к работе с Python OpenCV и манипуляциями с изображениями в Python OpenCV, вы сможете сделать что-нибудь крутое с помощью Computer Vision.