Если у вас есть (более или менее) выпуклые многоугольники, вы на самом деле МОЖЕТЕ использовать cv2.findContours
. Имея контуры, попробуйте найти центр масс, например, используя cv2.moments
, а затем используйте его как начальную точку в cv2.floodFill
.
Пожалуйста см. следующий фрагмент кода. Я полагаю, вы можете идентифицировать свои полигоны по цвету. Кроме того, вместо некоторого расширенного нахождения центра масс я просто использовал центральную точку ограничивающего прямоугольника каждого контура. Может быть, этого также достаточно для вашего варианта использования!?
import cv2
import numpy as np
# Set up test image
colors = [(0, 255, 0), (0, 0, 255)]
input = np.zeros((400, 400, 3), np.uint8)
cv2.circle(input, (100, 100), 50, colors[0], 10)
cv2.circle(input, (150, 350), 75, colors[1], 10)
output = input.copy()
# Iterate all colors...
for i, c in enumerate(colors):
# Mask color
img = np.all(output == c, axis=2).astype(np.uint8) * 255
# Find contours with respect to OpenCV version
cnts = cv2.findContours(img, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)
cnts = cnts[0] if len(cnts) == 2 else cnts[1]
# Get bounding rectangles; derive seed points for flood filling; flood fill
rects = [cv2.boundingRect(c) for c in cnts]
seeds = [(np.int32(r[0] + r[2] / 2), np.int32(r[1] + r[3] / 2)) for r in rects]
[cv2.floodFill(output, mask=None, seedPoint=s, newVal=c) for s in seeds]
cv2.imshow('input', input)
cv2.imshow('output', output)
cv2.waitKey(0)
cv2.destroyAllWindows()
Это ввод:
![Input](https://i.stack.imgur.com/J8JMw.png)
И это вывод :
![Output](https://i.stack.imgur.com/nuFIi.png)
Надеюсь, это поможет!
----------------------------------------
System information
----------------------------------------
Platform: Windows-10-10.0.16299-SP0
Python: 3.8.1
NumPy: 1.18.1
OpenCV: 4.1.2
----------------------------------------