python opencv填充未完全关闭的轮廓

时间:2013-12-24 07:58:55

标签: python opencv image-processing

enter image description here

我使用openCV查找给定图像的外部轮廓并填充它。 我用作输入的图像是像附加的那样的裤子的图像。问题是,有时(如附图中)轮廓没有完全关闭,然后我无法填充它。在这种情况下我该怎么办? 请参阅下面的代码。

谢谢,李

from PIL import Image
import os
import numpy
import bs4
import scipy
import cv2

image_obj_original = cv2.imread(image_file)
image_name = os.path.split(image_file)[-1]
name, extension = os.path.splitext(image_name)

# normalize to a standard size
image_obj = cv2.resize(image_obj_original, STANDARD_SIZE)

imWithBorder = cv2.copyMakeBorder(image_obj, 10, 10, 10, 10, cv2.BORDER_CONSTANT, value=[255, 255, 255])
# convert to grey-scale
greyscale_image = cv2.cvtColor(imWithBorder,cv2.COLOR_BGR2GRAY)

# get canny edges
canny_edges = cv2.Canny(greyscale_image, 1, 255)

h, w = canny_edges.shape[:2]
contours0, hierarchy = cv2.findContours( canny_edges.copy(), cv2.RETR_EXTERNAL , cv2.CHAIN_APPROX_SIMPLE)

contours = [cv2.approxPolyDP(cnt, 3, True) for cnt in contours0]
vis = numpy.zeros((h, w, 3), numpy.uint8)
cv2.drawContours(vis,contours,0,255,-1)
vis = cv2.bitwise_not(vis)
cv2.imshow('image', vis)

1 个答案:

答案 0 :(得分:1)

我同意OpenCV中的Canny并不总是关闭对象轮廓中的最后一个像素并且阻止您找到一个闭合轮廓,这有点令人讨厌。我用来解决这个问题的解决方法是使用“关闭”形态操作:

dilate(canny_edges, canny_edges, Mat());
erode(canny_edges, canny_edges, Mat());

任何解决方法都不完美,但它确实解决了问题。