Для сегментирования и обнаружения фигур на изображении основная идея заключается в следующем:
- Преобразование изображения в оттенки серого с использованием
cv2.cvtColor()
- размытое изображение с
cv2.GaussianBlur()
- Найти ребра с
cv2.Canny()
- Найти контуры с помощью
cv2.findContours()
- Итерация по каждому контуру
- Получить ограничивающий прямоугольник, используя
cv2.boundingRect()
- Найти ROI для каждого контура с нарезкой Numpy
- Нарисуйте прямоугольник ограничительной рамки, используя
cv2.Rectangle()
Помутнение
![enter image description here](https://i.stack.imgur.com/igAqN.png)
Canny Edge Detection
![enter image description here](https://i.stack.imgur.com/vC8OC.png)
Обнаруженные контуры
![enter image description here](https://i.stack.imgur.com/9aaK3.png)
выход
Обнаружены контуры: 2
import numpy as np
import cv2
original_image = cv2.imread("1.png")
image = original_image.copy()
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
blurred = cv2.GaussianBlur(gray, (3, 3), 0)
canny = cv2.Canny(blurred, 120, 255, 1)
cv2.imshow("canny", canny)
# Find contours in the image
cnts = cv2.findContours(canny.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cnts = cnts[0] if len(cnts) == 2 else cnts[1]
contours = []
for c in cnts:
# Obtain bounding rectangle for each contour
x,y,w,h = cv2.boundingRect(c)
# Find ROI of the contour
roi = image[y:y+h, x:x+w]
# Draw bounding box rectangle
cv2.rectangle(original_image,(x,y),(x+w,y+h),(0,255,0),3)
contours.append(c)
cv2.imshow("detected", original_image)
print('contours detected: {}'.format(len(contours)))
cv2.waitKey(0)