Сначала вы должны использовать cv2.RETR_EXTERNAL
вместо cv2.RETR_TREE
в методе findContours()
следующим образом: cv2.findContours(img, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
Это приведет к появлению только внешних блоков, а не меньших внутри.
Чтобы объединить оставшиеся перекрывающиеся контуры, вы можете сделать новое черное изображение, нарисовав все контуры на нем, закрашенные белым. Затем выполните новый findContours. Ограничительная рамка найденных контуров объединит все контуры, которые перекрываются / соприкасаются.
Код выглядит так:
# find contours in image
im, contours, hierarchy = cv2.findContours(thresholded_image, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
# create black image to use as mask
mask = np.zeros(thresholded_image.shape[:2], dtype=np.int8)
for cnt in contours:
# get the bounding box of the contour and draw the rect on image
(x,y,w,h) = cv2.boundingRect(cnt)
# draw the shape filled on the new mask
cv2.rectangle(mask ,(x,y,), (x+w,y+h),(255),-1)
# find contours in mask to get
im2, contours2, hierarchy2 = cv2.findContours(mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
# draw contours
for cnt in contours2:
# get the bounding box of the contour and draw the rect on image
(x,y,w,h) = cv2.boundingRect(cnt)
# draw the boundingbox on your image
cv2.drawContours(image, [cnt], 0, (255,0,0), 2)