Начало моего рабочего процесса похоже на ваше. Первый шаг: размытие изображения ..
blurred = cv2.GaussianBlur(gray, (5, 5), 0) # Blur
Второй шаг: получить хитрый образ ...
canny = cv2.Canny(blurred, 30, 150) # Canny
Третий шаг: нарисуйте контуры на хитрый образ. Это закрывает разорванные кусочки.
# Find contours
_, contours, _ = cv2.findContours(canny,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
# Draw contours on canny (this connects the contours
cv2.drawContours(canny, contours, -1, 255, 2)
canny = 255 - canny
Четвертый шаг: заливка (заполненные участки серые)
# Get mask for floodfill
h, w = thresh.shape[:2]
mask = np.zeros((h+2, w+2), np.uint8)
# Floodfill from point (0, 0)
cv2.floodFill(thresh, mask, (0,0), 123);
Пятый шаг: избавиться от действительно маленьких и действительно больших контуров
# Create a blank image to draw on
res = np.zeros_like(src_img)
# Create a list for unconnected contours
unconnectedContours = []
for contour in contours:
area = cv2.contourArea(contour)
# If the contour is not really small, or really big
if area > 123 and area < 760000:
cv2.drawContours(res, [contour], 0, (255,255,255), cv2.FILLED)
unconnectedContours.append(contour)
Наконец, после того, как вы разбили фрагменты, они могут быть вложены.