使用OpenCV识别轮廓

时间:2018-10-10 10:00:52

标签: python opencv computer-vision opencv-contour

我在图像中有对象集合。 检查样本输入图像here

我想找到每个对象的轮廓。 我正在按照以下方法使用 OpenCV2

识别轮廓
gray = cv2.cvtColor(input_image, cv2.COLOR_BGR2GRAY)
gray = cv2.GaussianBlur(gray, (7, 7), 0)
edged = cv2.Canny(gray, 50, 100)
dilate= cv2.dilate(edged, None, iterations=1)
erode= cv2.erode(dilate, None, iterations=1)
cnts = cv2.findContours(erode, cv2.RETR_EXTERNAL,
        cv2.CHAIN_APPROX_SIMPLE)

这是我在上面的代码中得到的轮廓输出:see output image

有没有更好的方法来识别图像中的对象?

1 个答案:

答案 0 :(得分:4)

您错过了代码段中的一个简单步骤,user1在二进制图像上效果最佳,但是您只是将灰度图像传递给cv2.findContours()。我已按照以下步骤从背景中分割出苹果:

步骤1:分割出主要包含灰度像素的背景。

您可以在此处使用HSV色域,其中较低的饱和度值会将背景分割为:

cv2.findContours

enter image description here

第2步:对于黑色像素,饱和度值突然变化,因此我们将极端的黑色和白色像素进行了细分:

img_hsv = cv2.cvtColor(img_bgr, cv2.COLOR_BGR2HSV_FULL)

# Filter out low saturation values, which means gray-scale pixels(majorly in background)
bgd_mask = cv2.inRange(img_hsv, np.array([0, 0, 0]), np.array([255, 30, 255]))

Black pixels mask White pixels mask

步骤3:合并这些遮罩以获得# Get a mask for pitch black pixel values black_pixels_mask = cv2.inRange(img_bgr, np.array([0, 0, 0]), np.array([70, 70, 70])) # Get the mask for extreme white pixels. white_pixels_mask = cv2.inRange(img_bgr, np.array([230, 230, 230]), np.array([255, 255, 255])) 的最终遮罩:

cv2.findContours

Merged mask

步骤4:现在填充孔,我们侵蚀并扩大图像:

final_mask = cv2.max(bgd_mask, black_pixels_mask)
final_mask = cv2.min(final_mask, ~white_pixels_mask)
final_mask = ~final_mask

enter image description here

第5步:使用final_mask = cv2.erode(final_mask, np.ones((3, 3), dtype=np.uint8)) final_mask = cv2.dilate(final_mask, np.ones((5, 5), dtype=np.uint8)) 获取轮廓,并在区域上对其进行过滤以删除较小的轮廓:

cv2.findContours()

步骤6:显示最终轮廓

Final output

以下是完整的代码段:

# Now you can finally find contours.
im, contours, hierarchy = cv2.findContours(final_mask.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)

final_contours = []
for contour in contours:
    area = cv2.contourArea(contour)
    if area > 2000:
        final_contours.append(contour)