Учитывая ваши найденные контуры, используйте drawContours
, чтобы создать двоичную маску, в которой будут заполнены ваши контуры.В зависимости от того, как вы это делаете (черное изображение, белые контуры против белого изображения, черные контуры), вы устанавливаете все пиксели во входном изображении на 0, ожидаемые для маскированных (или немаскированных).См. Следующий фрагмент кода для визуализации:
import cv2
import numpy as np
# Artificial input
input = np.uint8(128 * np.ones((200, 100, 3)))
cv2.rectangle(input, (10, 10), (40, 60), (255, 240, 172), cv2.FILLED)
cv2.circle(input, (70, 100), 20, (172, 172, 255), cv2.FILLED)
# Input to grayscale
gray = cv2.cvtColor(input, cv2.COLOR_RGB2GRAY)
# Simple binary threshold
_, gray = cv2.threshold(gray, 128, 255, cv2.THRESH_BINARY)
# Find contours
cnts, _ = cv2.findContours(gray, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)
# Generate mask
mask = np.ones(gray.shape)
mask = cv2.drawContours(mask, cnts, -1, 0, cv2.FILLED)
# Generate output
output = input.copy()
output[mask.astype(np.bool), :] = 0
cv2.imwrite("images/input.png", input)
cv2.imwrite("images/mask.png", np.uint8(255 * mask))
cv2.imwrite("images/output.png", output)
Искусственное входное изображение:
Маска, сгенерированная во время обработки:
Окончательный результат: