如何在手动绘制的边界框内提取图像

时间:2017-03-30 09:04:12

标签: python opencv

我有许多图像,这些图像的边界框都以相同的颜色绘制,并且都是矩形。 如何在边界框内提取图像? 有类似的问题,但这些解决方案都没有正常工作。 有人可以帮忙吗? 下图是一个例子。 我想用python Opencv来做这件事。

Image with rectangle regions to extract

修改------------------------------------------- -----------------------

此代码适用于所有图像。这是基于sipho的回答

img = cv2.imread(img_url)
hsv_min = np.array([0, 250, 100],np.uint8)
hsv_max = np.array([10, 255, 255],np.uint8)

hsv_img = cv2.cvtColor(img,cv2.COLOR_BGR2HSV)

frame_threshed = cv2.inRange(hsv_img, hsv_min, hsv_max)

# Perform morphology
se = np.ones((1,1), dtype='uint8')
image_close = cv2.morphologyEx(frame_threshed, cv2.MORPH_CLOSE, se)
cv2.imshow(image_close)
cv2.waitkey(0)    

# detect contours on the morphed image
ret,thresh = cv2.threshold(image_close,127,255,0)
contours, hierarchy = cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)

areaArray = []
for i, c in enumerate(contours):
    area = cv2.contourArea(c)
    areaArray.append(area)

# Sort countours based on area
sorteddata = sorted(zip(areaArray, contours), key=lambda x: x[0], reverse=True)

# find the nth largest contour [n-1][1], in this case 2
largestcontour = sorteddata[0][1]

# get the bounding rectangle of the contour
x, y, w, h = cv2.boundingRect(largestcontour)

cropped_img = img[y+3:y+h-3,x+3:x+w-3]
cv2.imshow('cropped', cropped_img)
cv2.waitkey(0)

1 个答案:

答案 0 :(得分:1)

您可以尝试以下方法:

  1. 将图片转换为HSV
  2. 颜色在一定范围内的阈值图像
  3. 检测阈值图像中的轮廓
  4. 使用层次结构过滤轮廓以仅提取内部轮廓
  5. 根据轮廓的边界矩形提取ROI
  6. 如果您仍然感到困惑,请查看此示例code