Нет необходимости использовать cv2.Sobel
, вы можете просто рисовать контуры с cv2.drawContours
на черном фоне.Черный фон можно нарисовать с помощью np.zeros.
img = cv2.imread('contouring.png',0)
contours, _ = cv2.findContours(img, cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)
bgr = np.zeros((img.shape[0], img.shape[1]), dtype= 'uint8')
cv2.drawContours(bgr, contours, -1, (255,255,255), 1)
Если вы хотите, чтобы контурные линии были толстыми, используйтеcv2.dilate
за это.Затем для предотвращения обрезки углов можно использовать cv2.bitwise_and
вместе с cv2.bitwise_not
, как показано ниже
bgr = cv2.dilate(bgr, np.ones((31, 31), np.uint8), iterations=1)
bgr = cv2.bitwise_and(bgr, cv2.bitwise_not(img))
Это дает контуры толщиной 15 пикселей.
РЕДАКТИРОВАТЬ - первое изображение тонких контуров все еще срезает углы.Чтобы получить однопиксельные контуры без углов, мы можем использовать размер ядра 3 * 3.
img = cv2.imread('contouring.png',0)
contours, _ = cv2.findContours(img, cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)
bgr = np.zeros((img.shape[0], img.shape[1]), dtype= 'uint8')
cv2.drawContours(bgr, contours, -1, (255,255,255), 1)
bgr = cv2.dilate(bgr, np.ones((3, 3), np.uint8), iterations=1)
bgr = cv2.bitwise_and(bgr, cv2.bitwise_not(img))
Это дает нам
Я проверилиспользуя cv2.bitwise_and
между bgr и img, и я получаю черное изображение, указывающее, что ни один белый пиксель не срезает углы.