我正在尝试使用OpenCV简化以下图像:
这里有很多红色的形状。其中一些完全包含其他。其中一些与邻居相交。我的目标是通过用其联合的多边形的边界框替换任意两个相交形状来统一所有相交形状。 (重复直到不再有相交的形状为止)。
通过相交,我的意思是也感人。希望这可以使它100%清晰:
答案 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)