在PYTHON中组合相交边界矩形的方法?

时间:2019-03-19 12:59:55

标签: python-3.x opencv contour opencv-contour

我正在尝试使用OpenCV简化以下图像:

enter image description here

这里有很多红色的形状。其中一些完全包含其他。其中一些与邻居相交。我的目标是通过用其联合的多边形的边界框替换任意两个相交形状来统一所有相交形状。 (重复直到不再有相交的形状为止)。

通过相交,我的意思是也感人。希望这可以使它100%清晰:

enter image description here

1 个答案:

答案 0 :(得分:0)

首先,您应该在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)